/** * Determines whether or not the line with paragraph tag has previous empty line. * @param tag html tag. */ private void checkParagraphTag(DetailNode tag) { final DetailNode newLine = getNearestEmptyLine(tag); if (isFirstParagraph(tag)) { log(tag.getLineNumber(), MSG_REDUNDANT_PARAGRAPH); } else if (newLine == null || tag.getLineNumber() - newLine.getLineNumber() != 1) { log(tag.getLineNumber(), MSG_LINE_BEFORE); } if (allowNewlineParagraph && isImmediatelyFollowedByText(tag)) { log(tag.getLineNumber(), MSG_MISPLACED_TAG); } }
/** * Find start and end selection positions from DetailNode line and Column. * @param detailNode DetailNode node for which selection finds */ private void findSelectionPositions(DetailNode detailNode) { selectionStart = lines2position.get(detailNode.getLineNumber()) + detailNode.getColumnNumber(); selectionEnd = findLastPosition(detailNode); }
@Override public void visitJavadocToken(DetailNode ast) { if (!startsWithInheritDoc(ast)) { final String summaryDoc = getSummarySentence(ast); if (summaryDoc.isEmpty()) { log(ast.getLineNumber(), MSG_SUMMARY_JAVADOC_MISSING); } else if (!period.isEmpty()) { final String firstSentence = getFirstSentence(ast); final int endOfSentence = firstSentence.lastIndexOf(period); if (!summaryDoc.contains(period)) { log(ast.getLineNumber(), MSG_SUMMARY_FIRST_SENTENCE); } if (endOfSentence != -1 && containsForbiddenFragment(firstSentence.substring(0, endOfSentence))) { log(ast.getLineNumber(), MSG_SUMMARY_JAVADOC); } } } }
/** * Print AST. * @param ast the root AST node. * @param rootPrefix prefix for the root node * @param prefix prefix for other nodes * @return string AST. */ public static String printTree(DetailNode ast, String rootPrefix, String prefix) { final StringBuilder messageBuilder = new StringBuilder(1024); DetailNode node = ast; while (node != null) { if (node.getType() == JavadocTokenTypes.JAVADOC) { messageBuilder.append(rootPrefix); } else { messageBuilder.append(prefix); } messageBuilder.append(getIndentation(node)) .append(JavadocUtil.getTokenName(node.getType())).append(" -> ") .append(JavadocUtil.escapeAllControlChars(node.getText())).append(" [") .append(node.getLineNumber()).append(':').append(node.getColumnNumber()) .append(']').append(LINE_SEPARATOR) .append(printTree(JavadocUtil.getFirstChild(node), rootPrefix, prefix)); node = JavadocUtil.getNextSibling(node); } return messageBuilder.toString(); }
@Override public void visitJavadocToken(DetailNode ast) { if (!isInlineDescription(ast)) { final List<DetailNode> textNodes = getAllNewlineNodes(ast); for (DetailNode newlineNode : textNodes) { final DetailNode textNode = JavadocUtil.getNextSibling(JavadocUtil .getNextSibling(newlineNode)); if (textNode != null && textNode.getType() == JavadocTokenTypes.TEXT) { final String text = textNode.getText(); if (!CommonUtil.isBlank(text.trim()) && (text.length() <= offset || !text.substring(1, offset + 1).trim().isEmpty())) { log(textNode.getLineNumber(), MSG_KEY, offset); } } } } }
/** * Finds the last position of node without children. * @param detailNode DetailNode node. * @return Last position of node without children. */ private int findLastPosition(final DetailNode detailNode) { final int lastPosition; if (detailNode.getChildren().length == 0) { lastPosition = lines2position.get(detailNode.getLineNumber()) + detailNode.getColumnNumber() + detailNode.getText().length(); } else { final DetailNode lastChild = detailNode.getChildren()[detailNode.getChildren().length - 1]; lastPosition = findLastPosition(lastChild); } return lastPosition; }
@Override public void visitJavadocToken(DetailNode ast) { if (isEmptyTag(ast.getParent())) { log(ast.getLineNumber(), MSG_KEY, ast.getText()); } }
/** * Checks order of atclauses in tag section node. * @param javadoc Javadoc root node. */ private void checkOrderInTagSection(DetailNode javadoc) { int maxIndexOfPreviousTag = 0; for (DetailNode node : javadoc.getChildren()) { if (node.getType() == JavadocTokenTypes.JAVADOC_TAG) { final String tagText = JavadocUtil.getFirstChild(node).getText(); final int indexOfCurrentTag = tagOrder.indexOf(tagText); if (indexOfCurrentTag != -1) { if (indexOfCurrentTag < maxIndexOfPreviousTag) { log(node.getLineNumber(), MSG_KEY, tagOrder.toString()); } else { maxIndexOfPreviousTag = indexOfCurrentTag; } } } } }
/** * Adjust first line nodes to javadoc indent. * @param tree DetailNode tree root * @param javadocColumnNumber javadoc indent */ private void adjustFirstLineToJavadocIndent(DetailNode tree, int javadocColumnNumber) { if (tree.getLineNumber() == blockCommentLineNumber) { ((JavadocNodeImpl) tree).setColumnNumber(tree.getColumnNumber() + javadocColumnNumber); final DetailNode[] children = tree.getChildren(); for (DetailNode child : children) { adjustFirstLineToJavadocIndent(child, javadocColumnNumber); } } }
@Override public void visitJavadocToken(DetailNode ast) { if (reportVisitJavadocToken) { log(ast.getLineNumber(), ast.getColumnNumber(), MSG_SUMMARY_FIRST_SENTENCE); } }
/** * Determines whether or not the next line after empty line has paragraph tag in the beginning. * @param newline NEWLINE node. */ private void checkEmptyLine(DetailNode newline) { final DetailNode nearestToken = getNearestNode(newline); if (nearestToken.getType() == JavadocTokenTypes.TEXT && !CommonUtil.isBlank(nearestToken.getText())) { log(newline.getLineNumber(), MSG_TAG_AFTER); } }
@Override public void visitJavadocToken(DetailNode ast) { if (reportVisitJavadocToken) { log(ast.getLineNumber(), ast.getColumnNumber(), MSG_SUMMARY_FIRST_SENTENCE); } }
/** * Gets a value for DetailNode object. * @param node DetailNode(Javadoc) node. * @param column column index. * @return value at specified column. */ private static Object getValueAtDetailNode(DetailNode node, int column) { final Object value; switch (column) { case 0: // first column is tree model. no value needed value = null; break; case 1: value = JavadocUtil.getTokenName(node.getType()); break; case 2: value = node.getLineNumber(); break; case 3: value = node.getColumnNumber(); break; case 4: value = node.getText(); break; default: throw new IllegalStateException(UNKNOWN_COLUMN_MSG); } return value; }
@Override public void visitJavadocToken(DetailNode ast) { if (isSingleLineJavadoc(getBlockCommentAst()) && (hasJavadocTags(ast) || !ignoreInlineTags && hasJavadocInlineTags(ast))) { log(ast.getLineNumber(), MSG_KEY); } }
/** * Determines whether or not the line with paragraph tag has previous empty line. * @param tag html tag. */ private void checkParagraphTag(DetailNode tag) { final DetailNode newLine = getNearestEmptyLine(tag); if (isFirstParagraph(tag)) { log(tag.getLineNumber(), MSG_REDUNDANT_PARAGRAPH); } else if (newLine == null || tag.getLineNumber() - newLine.getLineNumber() != 1) { log(tag.getLineNumber(), MSG_LINE_BEFORE); } if (allowNewlineParagraph && isImmediatelyFollowedByText(tag)) { log(tag.getLineNumber(), MSG_MISPLACED_TAG); } }
/** * Find start and end selection positions from DetailNode line and Column. * @param detailNode DetailNode node for which selection finds */ private void findSelectionPositions(DetailNode detailNode) { selectionStart = lines2position.get(detailNode.getLineNumber()) + detailNode.getColumnNumber(); selectionEnd = findLastPosition(detailNode); }
@Override public void visitJavadocToken(DetailNode ast) { if (isEmptyTag(ast.getParent())) { log(ast.getLineNumber(), MSG_KEY, ast.getText()); } }
/** * Adjust first line nodes to javadoc indent. * @param tree DetailNode tree root * @param javadocColumnNumber javadoc indent */ private void adjustFirstLineToJavadocIndent(DetailNode tree, int javadocColumnNumber) { if (tree.getLineNumber() == blockCommentLineNumber) { ((JavadocNodeImpl) tree).setColumnNumber(tree.getColumnNumber() + javadocColumnNumber); final DetailNode[] children = tree.getChildren(); for (DetailNode child : children) { adjustFirstLineToJavadocIndent(child, javadocColumnNumber); } } }
@Override public void visitJavadocToken(DetailNode ast) { if (isSingleLineJavadoc(getBlockCommentAst()) && (hasJavadocTags(ast) || !ignoreInlineTags && hasJavadocInlineTags(ast))) { log(ast.getLineNumber(), MSG_KEY); } }
/** * Determines whether or not the next line after empty line has paragraph tag in the beginning. * @param newline NEWLINE node. */ private void checkEmptyLine(DetailNode newline) { final DetailNode nearestToken = getNearestNode(newline); if (nearestToken.getType() == JavadocTokenTypes.TEXT && !CommonUtil.isBlank(nearestToken.getText())) { log(newline.getLineNumber(), MSG_TAG_AFTER); } }