Issue #3170: delete children from javadoc TEXT

This commit is contained in:
rnveach 2016-11-12 10:27:16 -05:00 committed by Roman Ivanov
parent 84015bb21c
commit 19ffe1bb1b
17 changed files with 45 additions and 166 deletions

View File

@ -34,6 +34,7 @@ import org.antlr.v4.runtime.tree.TerminalNode;
import com.google.common.base.CaseFormat;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.DetailNode;
import com.puppycrawl.tools.checkstyle.api.JavadocTokenTypes;
import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocNodeImpl;
import com.puppycrawl.tools.checkstyle.grammars.javadoc.JavadocLexer;
import com.puppycrawl.tools.checkstyle.grammars.javadoc.JavadocParser;
@ -181,6 +182,12 @@ public class JavadocDetailNodeParser {
ParseTree parseTreeParent = parseTreeNode;
while (currentJavadocParent != null) {
// remove unnecessary children tokens
if (currentJavadocParent.getType() == JavadocTokenTypes.TEXT) {
currentJavadocParent
.setChildren((DetailNode[]) JavadocNodeImpl.EMPTY_DETAIL_NODE_ARRAY);
}
final JavadocNodeImpl[] children =
(JavadocNodeImpl[]) currentJavadocParent.getChildren();

View File

@ -3399,7 +3399,7 @@ public final class TokenTypes {
/**
* Text of single-line or block comment.
*
*<pre>
* <pre>
* +--SINGLE_LINE_COMMENT
* |
* +--COMMENT_CONTENT

View File

@ -35,7 +35,7 @@ public class JavadocNodeImpl implements DetailNode {
/**
* Empty array of {@link DetailNode} type.
*/
private static final DetailNode[] EMPTY_DETAIL_NODE_ARRAY = new DetailNode[0];
public static final JavadocNodeImpl[] EMPTY_DETAIL_NODE_ARRAY = new JavadocNodeImpl[0];
/**
* Node index among parent's children.

View File

@ -151,7 +151,8 @@ public class JavadocParagraphCheck extends AbstractJavadocCheck {
*/
private void checkEmptyLine(DetailNode newline) {
final DetailNode nearestToken = getNearestNode(newline);
if (!isLastEmptyLine(newline) && nearestToken.getChildren().length > 1) {
if (!isLastEmptyLine(newline) && nearestToken.getType() == JavadocTokenTypes.TEXT
&& !nearestToken.getText().trim().isEmpty()) {
log(newline.getLineNumber(), MSG_TAG_AFTER);
}
}
@ -199,7 +200,7 @@ public class JavadocParagraphCheck extends AbstractJavadocCheck {
return false;
}
if (previousSibling.getType() == JavadocTokenTypes.TEXT
&& previousSibling.getChildren().length == 1) {
&& previousSibling.getText().trim().isEmpty()) {
previousSibling = JavadocUtils.getPreviousSibling(previousSibling);
}
return previousSibling != null
@ -215,7 +216,7 @@ public class JavadocParagraphCheck extends AbstractJavadocCheck {
DetailNode previousNode = JavadocUtils.getPreviousSibling(paragraphTag);
while (previousNode != null) {
if (previousNode.getType() == JavadocTokenTypes.TEXT
&& previousNode.getChildren().length > 1
&& !previousNode.getText().trim().isEmpty()
|| previousNode.getType() != JavadocTokenTypes.LEADING_ASTERISK
&& previousNode.getType() != JavadocTokenTypes.NEWLINE
&& previousNode.getType() != JavadocTokenTypes.TEXT) {
@ -252,7 +253,7 @@ public class JavadocParagraphCheck extends AbstractJavadocCheck {
DetailNode nextNode = JavadocUtils.getNextSibling(newLine);
while (nextNode != null && nextNode.getType() != JavadocTokenTypes.JAVADOC_TAG) {
if (nextNode.getType() == JavadocTokenTypes.TEXT
&& nextNode.getChildren().length > 1
&& !nextNode.getText().trim().isEmpty()
|| nextNode.getType() == JavadocTokenTypes.HTML_ELEMENT) {
return false;
}

View File

@ -94,10 +94,11 @@ public class JavadocTagContinuationIndentationCheck extends AbstractJavadocCheck
for (DetailNode newlineNode : textNodes) {
final DetailNode textNode = JavadocUtils.getNextSibling(JavadocUtils
.getNextSibling(newlineNode));
if (textNode != null && textNode.getType() == JavadocTokenTypes.TEXT
&& textNode.getChildren().length > 1) {
final DetailNode whitespace = JavadocUtils.getFirstChild(textNode);
if (whitespace.getText().length() - 1 < offset) {
if (textNode != null && textNode.getType() == JavadocTokenTypes.TEXT) {
final String text = textNode.getText();
if (!text.trim().isEmpty()
&& (text.length() <= offset
|| !text.substring(1, offset + 1).trim().isEmpty())) {
log(textNode.getLineNumber(), MSG_KEY, offset);
}
}

View File

@ -26,7 +26,6 @@ import com.puppycrawl.tools.checkstyle.api.DetailNode;
import com.puppycrawl.tools.checkstyle.api.JavadocTokenTypes;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
import com.puppycrawl.tools.checkstyle.utils.JavadocUtils;
/**
* <p>
@ -157,30 +156,15 @@ public class SummaryJavadocCheck extends AbstractJavadocCheck {
final StringBuilder result = new StringBuilder();
final String periodSuffix = PERIOD + ' ';
for (DetailNode child : ast.getChildren()) {
final String text = child.getText();
if (child.getType() != JavadocTokenTypes.JAVADOC_INLINE_TAG
&& child.getText().contains(periodSuffix)) {
result.append(getCharsTillDot(child));
&& text.contains(periodSuffix)) {
result.append(text.substring(0, text.indexOf(periodSuffix) + 1));
break;
}
else {
result.append(child.getText());
}
}
return result.toString();
}
/**
* Finds and returns chars till first dot.
* @param textNode node with javadoc text.
* @return String with chars till first dot.
*/
private static String getCharsTillDot(DetailNode textNode) {
final StringBuilder result = new StringBuilder();
for (DetailNode child : textNode.getChildren()) {
result.append(child.getText());
if (PERIOD.equals(child.getText())
&& JavadocUtils.getNextSibling(child).getType() == JavadocTokenTypes.WS) {
break;
result.append(text);
}
}
return result.toString();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View File

@ -336,7 +336,7 @@ public class AbstractJavadocCheckTest extends BaseCheckTestSupport {
@Override
public int[] getRequiredJavadocTokens() {
return new int[] {JavadocTokenTypes.CHAR};
return new int[] {JavadocTokenTypes.TEXT};
}
@Override

View File

@ -73,6 +73,7 @@ public class JavadocTagContinuationIndentationCheckTest
"290: " + getCheckMessage(MSG_KEY, 4),
"310: " + getCheckMessage(MSG_KEY, 4),
"322: " + getCheckMessage(MSG_KEY, 4),
"324: " + getCheckMessage(MSG_KEY, 4),
};
verify(checkConfig, getPath("InputJavaDocTagContinuationIndentation.java"),
expected);

View File

@ -108,13 +108,13 @@ public class CodeSelectorPModelTest {
@Test
public void testDetailNodeLeafSelection() {
final DetailNode javadocLeaf = ((DetailNode) model.getParseTreeTableModel()
.getChild(tree.getFirstChild().getNextSibling().getFirstChild(), 0))
.getChildren()[2].getChildren()[0];
final DetailNode javadoc = (DetailNode) model.getParseTreeTableModel()
.getChild(tree.getFirstChild().getNextSibling().getFirstChild(), 0);
final DetailNode javadocLeaf = javadoc.getChildren()[2];
final CodeSelectorPModel selector = new CodeSelectorPModel(javadocLeaf, linesToPosition);
selector.findSelectionPositions();
Assert.assertEquals(5, selector.getSelectionStart());
Assert.assertEquals(6, selector.getSelectionEnd());
Assert.assertEquals(19, selector.getSelectionEnd());
}
}

View File

@ -6,20 +6,6 @@ CLASS_DEF -> CLASS_DEF [4:0]
| | |--NEWLINE -> \n [1:0]
| | |--LEADING_ASTERISK -> * [2:0]
| | |--TEXT -> class javadoc [2:1]
| | | |--WS -> [2:1]
| | | |--CHAR -> c [2:2]
| | | |--CHAR -> l [2:3]
| | | |--CHAR -> a [2:4]
| | | |--CHAR -> s [2:5]
| | | |--CHAR -> s [2:6]
| | | |--WS -> [2:7]
| | | |--CHAR -> j [2:8]
| | | |--CHAR -> a [2:9]
| | | |--CHAR -> v [2:10]
| | | |--CHAR -> a [2:11]
| | | |--CHAR -> d [2:12]
| | | |--CHAR -> o [2:13]
| | | `--CHAR -> c [2:14]
| | |--NEWLINE -> \n [2:15]
| | `--EOF -> <EOF> [3:0]
| `--BLOCK_COMMENT_END -> */ [3:0]
@ -34,24 +20,6 @@ CLASS_DEF -> CLASS_DEF [4:0]
| | | |--COMMENT_CONTENT -> * attribute javadoc [6:6]
| | | | `--JAVADOC -> attribute javadoc<EOF> [6:0]
| | | | |--TEXT -> attribute javadoc [6:0]
| | | | | |--WS -> [6:0]
| | | | | |--CHAR -> a [6:1]
| | | | | |--CHAR -> t [6:2]
| | | | | |--CHAR -> t [6:3]
| | | | | |--CHAR -> r [6:4]
| | | | | |--CHAR -> i [6:5]
| | | | | |--CHAR -> b [6:6]
| | | | | |--CHAR -> u [6:7]
| | | | | |--CHAR -> t [6:8]
| | | | | |--CHAR -> e [6:9]
| | | | | |--WS -> [6:10]
| | | | | |--CHAR -> j [6:11]
| | | | | |--CHAR -> a [6:12]
| | | | | |--CHAR -> v [6:13]
| | | | | |--CHAR -> a [6:14]
| | | | | |--CHAR -> d [6:15]
| | | | | |--CHAR -> o [6:16]
| | | | | `--CHAR -> c [6:17]
| | | | `--EOF -> <EOF> [6:18]
| | | `--BLOCK_COMMENT_END -> */ [6:24]
| | `--LITERAL_INT -> int [7:4]
@ -65,24 +33,8 @@ CLASS_DEF -> CLASS_DEF [4:0]
| | | | |--NEWLINE -> \n [9:0]
| | | | |--LEADING_ASTERISK -> * [10:0]
| | | | |--TEXT -> method javadoc [10:5]
| | | | | |--WS -> [10:5]
| | | | | |--CHAR -> m [10:6]
| | | | | |--CHAR -> e [10:7]
| | | | | |--CHAR -> t [10:8]
| | | | | |--CHAR -> h [10:9]
| | | | | |--CHAR -> o [10:10]
| | | | | |--CHAR -> d [10:11]
| | | | | |--WS -> [10:12]
| | | | | |--CHAR -> j [10:13]
| | | | | |--CHAR -> a [10:14]
| | | | | |--CHAR -> v [10:15]
| | | | | |--CHAR -> a [10:16]
| | | | | |--CHAR -> d [10:17]
| | | | | |--CHAR -> o [10:18]
| | | | | `--CHAR -> c [10:19]
| | | | |--NEWLINE -> \n [10:20]
| | | | |--TEXT -> [11:0]
| | | | | `--WS -> [11:0]
| | | | `--EOF -> <EOF> [11:4]
| | | `--BLOCK_COMMENT_END -> */ [11:4]
| | `--LITERAL_PUBLIC -> public [12:4]

View File

@ -6,16 +6,6 @@ CLASS_DEF -> CLASS_DEF [4:0]
| | | |--NEWLINE -> \n [1:0]
| | | |--LEADING_ASTERISK -> * [2:0]
| | | |--TEXT -> some text [2:1]
| | | | |--WS -> [2:1]
| | | | |--CHAR -> s [2:2]
| | | | |--CHAR -> o [2:3]
| | | | |--CHAR -> m [2:4]
| | | | |--CHAR -> e [2:5]
| | | | |--WS -> [2:6]
| | | | |--CHAR -> t [2:7]
| | | | |--CHAR -> e [2:8]
| | | | |--CHAR -> x [2:9]
| | | | `--CHAR -> t [2:10]
| | | |--NEWLINE -> \n [2:11]
| | | `--EOF -> <EOF> [3:0]
| | `--BLOCK_COMMENT_END -> */ [3:0]

View File

@ -14,13 +14,6 @@ CLASS_DEF -> CLASS_DEF [4:0]
| |--COMMENT_CONTENT -> *javadoc [3:2]
| | `--JAVADOC -> javadoc<EOF> [3:0]
| | |--TEXT -> javadoc [3:0]
| | | |--CHAR -> j [3:0]
| | | |--CHAR -> a [3:1]
| | | |--CHAR -> v [3:2]
| | | |--CHAR -> a [3:3]
| | | |--CHAR -> d [3:4]
| | | |--CHAR -> o [3:5]
| | | `--CHAR -> c [3:6]
| | `--EOF -> <EOF> [3:7]
| `--BLOCK_COMMENT_END -> */ [3:9]
|--LITERAL_CLASS -> class [4:0]

View File

@ -7,19 +7,11 @@ JAVADOC -> <p>\r\nMy {@code Class}\r\n</p>\r\n@see never<EOF> [0:0]
| | `--CLOSE -> > [0:2]
| |--NEWLINE -> \r\n [0:3]
| |--TEXT -> My [1:0]
| | |--CHAR -> M [1:0]
| | |--CHAR -> y [1:1]
| | `--WS -> [1:2]
| |--JAVADOC_INLINE_TAG -> {@code Class} [1:3]
| | |--JAVADOC_INLINE_TAG_START -> { [1:3]
| | |--CODE_LITERAL -> @code [1:4]
| | |--WS -> [1:9]
| | |--TEXT -> Class [1:10]
| | | |--CHAR -> C [1:10]
| | | |--CHAR -> l [1:11]
| | | |--CHAR -> a [1:12]
| | | |--CHAR -> s [1:13]
| | | `--CHAR -> s [1:14]
| | `--JAVADOC_INLINE_TAG_END -> } [1:16]
| |--NEWLINE -> \r\n [1:17]
| `--P_TAG_CLOSE -> </p> [2:0]

View File

@ -34,6 +34,19 @@ class InputCorrectJavaDocParagraph {
*/
boolean emulated() {return false;}
/**
* Some Javadoc.
*
*<pre>
* Test
* </pre>
*
* <pre>
* Test
* </pre>
*/
boolean test() {return false;}
/**
* Some Javadoc.
*

View File

@ -320,6 +320,8 @@ enum Foo1 {}
* Some javadoc.
* @serialData Some javadoc.
* Line below is empty on purpose. // warn
* @see Some Text.
* L.
*
* @author max
* @see {@link com.puppycrawl.tools.checkstyle.AllChecksPresentOnAvailableChecksPageTest

View File

@ -131,11 +131,6 @@ public class MyClass {
In Javadoc comment every whitespace matters, and Javadoc Checks need all those whitespaces and newline nodes to verify format and content of the Javadoc comment.
Because of that Javadoc grammar includes all whitespaces, newlines to the parse tree
(<a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#WS">WS</a>, <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#NEWLINE">NEWLINE</a>).
As you may notice there is also <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#CHAR">CHAR</a> javadoc token that presents single character.
It is quite useless and is used for building only <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#TEXT">TEXT</a> node which consists of
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#CHAR">CHAR</a> and
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#WS">WS</a> nodes, but it is implementation nuance.
(In future we will try to resolve this. See <a href="https://github.com/checkstyle/checkstyle/issues/3170">Github Issue #3170</a>).
</p>
</section>
@ -165,10 +160,6 @@ CLASS_DEF -> CLASS_DEF [5:0]
| | | |--NEWLINE -> \n [1:0]
| | | |--LEADING_ASTERISK -> * [2:0]
| | | |--TEXT -> My [2:2]
| | | | |--WS -> [2:2]
| | | | |--CHAR -> M [2:3]
| | | | |--CHAR -> y [2:4]
| | | | `--WS -> [2:5]
| | | |--HTML_ELEMENT -> <b>class</b> [2:6]
| | | | `--HTML_TAG -> <b>class</b> [2:6]
| | | | |--HTML_ELEMENT_OPEN -> <b> [2:6]
@ -176,18 +167,12 @@ CLASS_DEF -> CLASS_DEF [5:0]
| | | | | |--HTML_TAG_NAME -> b [2:7]
| | | | | `--CLOSE -> > [2:8]
| | | | |--TEXT -> class [2:9]
| | | | | |--CHAR -> c [2:9]
| | | | | |--CHAR -> l [2:10]
| | | | | |--CHAR -> a [2:11]
| | | | | |--CHAR -> s [2:12]
| | | | | `--CHAR -> s [2:13]
| | | | `--HTML_ELEMENT_CLOSE -> </b> [2:14]
| | | | |--OPEN -> < [2:14]
| | | | |--SLASH -> / [2:15]
| | | | |--HTML_TAG_NAME -> b [2:16]
| | | | `--CLOSE -> > [2:17]
| | | |--TEXT -> . [2:18]
| | | | `--CHAR -> . [2:18]
| | | |--NEWLINE -> \n [2:19]
| | | |--LEADING_ASTERISK -> * [3:0]
| | | |--WS -> [3:2]
@ -225,10 +210,6 @@ CLASS_DEF -> CLASS_DEF [5:0]
JAVADOC -> * My <b>class</b>.\r\n * @see AbstractClass<EOF> [0:0]
|--LEADING_ASTERISK -> * [0:0]
|--TEXT -> My [0:2]
| |--WS -> [0:2]
| |--CHAR -> M [0:3]
| |--CHAR -> y [0:4]
| `--WS -> [0:5]
|--HTML_ELEMENT -> <b>class</b> [0:6]
| `--HTML_TAG -> <b>class</b> [0:6]
| |--HTML_ELEMENT_OPEN -> <b> [0:6]
@ -236,18 +217,12 @@ JAVADOC -> * My <b>class</b>.\r\n * @see AbstractClass<EOF> [0:0]
| | |--HTML_TAG_NAME -> b [0:7]
| | `--CLOSE -> > [0:8]
| |--TEXT -> class [0:9]
| | |--CHAR -> c [0:9]
| | |--CHAR -> l [0:10]
| | |--CHAR -> a [0:11]
| | |--CHAR -> s [0:12]
| | `--CHAR -> s [0:13]
| `--HTML_ELEMENT_CLOSE -> </b> [0:14]
| |--OPEN -> < [0:14]
| |--SLASH -> / [0:15]
| |--HTML_TAG_NAME -> b [0:16]
| `--CLOSE -> > [0:17]
|--TEXT -> . [0:18]
| `--CHAR -> . [0:18]
|--NEWLINE -> \r\n [0:19]
|--LEADING_ASTERISK -> * [1:0]
|--WS -> [1:2]
@ -398,10 +373,6 @@ JAVADOC -> <acronym title="as soon as possible">ASAP</acronym><EOF> [0:0]
| | | `--ATTR_VALUE -> "as soon as possible" [0:15]
| | `--CLOSE -> > [0:37]
| |--TEXT -> ASAP [0:38]
| | |--CHAR -> A [0:38]
| | |--CHAR -> S [0:39]
| | |--CHAR -> A [0:40]
| | `--CHAR -> P [0:41]
| `--HTML_ELEMENT_CLOSE -> </acronym> [0:42]
| |--OPEN -> < [0:42]
| |--SLASH -> / [0:43]
@ -449,12 +420,6 @@ JAVADOC -> <p> First\r\n<p> Second<EOF> [0:0]
| |--P_HTML_TAG_NAME -> p [0:1]
| `--CLOSE -> > [0:2]
|--TEXT -> First [0:3]
| |--WS -> [0:3]
| |--CHAR -> F [0:4]
| |--CHAR -> i [0:5]
| |--CHAR -> r [0:6]
| |--CHAR -> s [0:7]
| `--CHAR -> t [0:8]
|--NEWLINE -> \r\n [0:9]
|--HTML_ELEMENT -> <p> [1:0]
| `--P_TAG_OPEN -> <p> [1:0]
@ -462,13 +427,6 @@ JAVADOC -> <p> First\r\n<p> Second<EOF> [0:0]
| |--P_HTML_TAG_NAME -> p [1:1]
| `--CLOSE -> > [1:2]
|--TEXT -> Second [1:3]
| |--WS -> [1:3]
| |--CHAR -> S [1:4]
| |--CHAR -> e [1:5]
| |--CHAR -> c [1:6]
| |--CHAR -> o [1:7]
| |--CHAR -> n [1:8]
| `--CHAR -> d [1:9]
`--EOF -> <EOF> [1:10]
]]></source>
</td>
@ -482,13 +440,6 @@ JAVADOC -> <p> First </p>\r\n<p> Second </p><EOF> [0:0]
| | |--P_HTML_TAG_NAME -> p [0:1]
| | `--CLOSE -> > [0:2]
| |--TEXT -> First [0:3]
| | |--WS -> [0:3]
| | |--CHAR -> F [0:4]
| | |--CHAR -> i [0:5]
| | |--CHAR -> r [0:6]
| | |--CHAR -> s [0:7]
| | |--CHAR -> t [0:8]
| | `--WS -> [0:9]
| `--P_TAG_CLOSE -> </p> [0:10]
| |--OPEN -> < [0:10]
| |--SLASH -> / [0:11]
@ -502,14 +453,6 @@ JAVADOC -> <p> First </p>\r\n<p> Second </p><EOF> [0:0]
| | |--P_HTML_TAG_NAME -> p [1:1]
| | `--CLOSE -> > [1:2]
| |--TEXT -> Second [1:3]
| | |--WS -> [1:3]
| | |--CHAR -> S [1:4]
| | |--CHAR -> e [1:5]
| | |--CHAR -> c [1:6]
| | |--CHAR -> o [1:7]
| | |--CHAR -> n [1:8]
| | |--CHAR -> d [1:9]
| | `--WS -> [1:10]
| `--P_TAG_CLOSE -> </p> [1:11]
| |--OPEN -> < [1:11]
| |--SLASH -> / [1:12]