From fd58312db2cbacd62031ab944eb32e71009525b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=AF=E6=9C=9F?= Date: Wed, 25 Oct 2017 10:48:51 +0800 Subject: [PATCH] =?UTF-8?q?1.author=E6=A0=87=E7=AD=BE=E4=B8=8D=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E5=A4=A7=E5=B0=8F=E5=86=99=EF=BC=8C2.=E5=9C=A8?= =?UTF-8?q?=E6=9C=89=E6=B3=A8=E8=A7=A3=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=85=B3=E8=81=94=E6=B3=A8=E9=87=8A=E4=B8=8E?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AvoidCommentBehindStatementRule.java | 10 +- .../rule/comment/ClassMustHaveAuthorRule.java | 3 +- .../CommentsMustBeJavadocFormatRule.java | 56 +++++-- .../EnumConstantsMustHaveCommentRule.java | 8 +- .../rule/comment/RemoveCommentedCodeRule.java | 16 +- .../{CommentUtils.java => NodeSortUtils.java} | 14 +- .../comment/xml/ClassMustHaveAuthorRule.xml | 156 ++++++++++-------- .../xml/CommentsMustBeJavadocFormatRule.xml | 153 +++++++++++------ 8 files changed, 269 insertions(+), 147 deletions(-) rename p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/{CommentUtils.java => NodeSortUtils.java} (76%) diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/AvoidCommentBehindStatementRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/AvoidCommentBehindStatementRule.java index 56ac4d8..d67ec70 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/AvoidCommentBehindStatementRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/AvoidCommentBehindStatementRule.java @@ -21,7 +21,7 @@ import java.util.SortedMap; import java.util.TreeMap; import com.alibaba.p3c.pmd.I18nResources; -import com.alibaba.p3c.pmd.lang.java.rule.util.CommentUtils; +import com.alibaba.p3c.pmd.lang.java.rule.util.NodeSortUtils; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; @@ -75,19 +75,19 @@ public class AvoidCommentBehindStatementRule extends AbstractAliCommentRule { // expression nodes List expressionNodes = cUnit.findDescendantsOfType(ASTExpression.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, expressionNodes); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, expressionNodes); // filed declaration nodes List fieldNodes = cUnit.findDescendantsOfType(ASTFieldDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, fieldNodes); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, fieldNodes); // enum constant nodes List enumConstantNodes = cUnit.findDescendantsOfType(ASTEnumConstant.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, enumConstantNodes); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, enumConstantNodes); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); return itemsByLineNumber; } diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/ClassMustHaveAuthorRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/ClassMustHaveAuthorRule.java index e5b5c2b..78615ee 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/ClassMustHaveAuthorRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/ClassMustHaveAuthorRule.java @@ -34,7 +34,8 @@ import net.sourceforge.pmd.lang.java.ast.Comment; */ public class ClassMustHaveAuthorRule extends AbstractAliCommentRule { - private static final Pattern AUTHOR_PATTERN = Pattern.compile(".*@author.*", Pattern.DOTALL); + private static final Pattern AUTHOR_PATTERN = Pattern.compile(".*@author.*", + Pattern.DOTALL | Pattern.CASE_INSENSITIVE); private static final String MESSAGE_KEY_PREFIX = "java.comment.ClassMustHaveAuthorRule.violation.msg"; diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/CommentsMustBeJavadocFormatRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/CommentsMustBeJavadocFormatRule.java index 5301c2c..b8908f1 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/CommentsMustBeJavadocFormatRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/CommentsMustBeJavadocFormatRule.java @@ -16,15 +16,17 @@ package com.alibaba.p3c.pmd.lang.java.rule.comment; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; import com.alibaba.p3c.pmd.I18nResources; -import com.alibaba.p3c.pmd.lang.java.rule.util.CommentUtils; +import com.alibaba.p3c.pmd.lang.java.rule.util.NodeSortUtils; import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.java.ast.ASTAnnotation; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; @@ -43,7 +45,7 @@ import org.apache.commons.lang3.StringUtils; /** * [Mandatory] Javadoc should be used for classes, class variables and methods. - * The format should be '\/** comment **\/', rather than '// xxx'. + * The format should be '\/** comment *\/', rather than '// xxx'. * * @author keriezhang * @date 2016/12/14 @@ -155,8 +157,13 @@ public class CommentsMustBeJavadocFormatRule extends AbstractAliCommentRule { if (value instanceof AbstractJavaNode) { AbstractJavaNode node = (AbstractJavaNode)value; + // skip annotation node, we will deal with it later. + if (node instanceof ASTAnnotation) { + continue; + } + // Check if comment is one line above class, field, method. - if (lastComment != null && isCommentOneLineBefore(lastComment, lastNode, node)) { + if (lastComment != null && isCommentOneLineBefore(itemsByLineNumber, lastComment, lastNode, node)) { node.comment(lastComment); lastComment = null; } @@ -172,28 +179,31 @@ public class CommentsMustBeJavadocFormatRule extends AbstractAliCommentRule { SortedMap itemsByLineNumber = new TreeMap<>(); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); + + List annotations = cUnit.findDescendantsOfType(ASTAnnotation.class); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, annotations); List classDecl = cUnit.findDescendantsOfType(ASTClassOrInterfaceDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, classDecl); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, classDecl); List fields = cUnit.findDescendantsOfType(ASTFieldDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, fields); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, fields); List methods = cUnit.findDescendantsOfType(ASTMethodDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, methods); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, methods); List constructors = cUnit.findDescendantsOfType(ASTConstructorDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, constructors); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, constructors); List enumDecl = cUnit.findDescendantsOfType(ASTEnumDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, enumDecl); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, enumDecl); return itemsByLineNumber; } - private boolean isCommentOneLineBefore(Comment lastComment, Node lastNode, Node node) { + private boolean isCommentOneLineBefore(SortedMap items, Comment lastComment, Node lastNode, Node node) { ASTClassOrInterfaceBodyDeclaration parentClass = node.getFirstParentOfType(ASTClassOrInterfaceBodyDeclaration.class); @@ -207,7 +217,31 @@ public class CommentsMustBeJavadocFormatRule extends AbstractAliCommentRule { return false; } - return lastComment.getEndLine() + 1 == node.getBeginLine(); + // check if there is nothing in the middle except annotations. + SortedMap subMap = items.subMap(NodeSortUtils.generateIndex(lastComment), + NodeSortUtils.generateIndex(node)); + Iterator> iter = subMap.entrySet().iterator(); + + // skip the first comment node. + iter.next(); + int lastEndLine = lastComment.getEndLine(); + + while (iter.hasNext()) { + Entry entry = iter.next(); + Node value = entry.getValue(); + + // only annotation node is allowed between comment and node. + if (!(value instanceof ASTAnnotation)) { + return false; + } + + // allow annotation node after comment. + if (lastEndLine + 1 == value.getBeginLine()) { + lastEndLine = value.getEndLine(); + } + } + + return lastEndLine + 1 == node.getBeginLine(); } /** diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/EnumConstantsMustHaveCommentRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/EnumConstantsMustHaveCommentRule.java index 020189c..c4ee2f6 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/EnumConstantsMustHaveCommentRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/EnumConstantsMustHaveCommentRule.java @@ -21,7 +21,7 @@ import java.util.SortedMap; import java.util.TreeMap; import com.alibaba.p3c.pmd.I18nResources; -import com.alibaba.p3c.pmd.lang.java.rule.util.CommentUtils; +import com.alibaba.p3c.pmd.lang.java.rule.util.NodeSortUtils; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; @@ -65,12 +65,12 @@ public class EnumConstantsMustHaveCommentRule extends AbstractAliCommentRule { SortedMap itemsByLineNumber = new TreeMap<>(); List enumDecl = cUnit.findDescendantsOfType(ASTEnumDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, enumDecl); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, enumDecl); List contantDecl = cUnit.findDescendantsOfType(ASTEnumConstant.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, contantDecl); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, contantDecl); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); return itemsByLineNumber; } diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/RemoveCommentedCodeRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/RemoveCommentedCodeRule.java index 0b00205..ed39855 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/RemoveCommentedCodeRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/comment/RemoveCommentedCodeRule.java @@ -21,7 +21,7 @@ import java.util.SortedMap; import java.util.TreeMap; import java.util.regex.Pattern; -import com.alibaba.p3c.pmd.lang.java.rule.util.CommentUtils; +import com.alibaba.p3c.pmd.lang.java.rule.util.NodeSortUtils; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTBlockStatement; @@ -144,25 +144,25 @@ public class RemoveCommentedCodeRule extends AbstractAliCommentRule { List importDecl = cUnit .findDescendantsOfType(ASTImportDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, importDecl); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, importDecl); List classDecl = cUnit .findDescendantsOfType(ASTClassOrInterfaceDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, classDecl); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, classDecl); List fields = cUnit.findDescendantsOfType(ASTFieldDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, fields); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, fields); List methods = cUnit.findDescendantsOfType(ASTMethodDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, methods); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, methods); List constructors = cUnit.findDescendantsOfType(ASTConstructorDeclaration.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, constructors); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, constructors); List blockStatements = cUnit.findDescendantsOfType(ASTBlockStatement.class); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, blockStatements); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, blockStatements); - CommentUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); + NodeSortUtils.addNodesToSortedMap(itemsByLineNumber, cUnit.getComments()); return itemsByLineNumber; } diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/CommentUtils.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/NodeSortUtils.java similarity index 76% rename from p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/CommentUtils.java rename to p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/NodeSortUtils.java index 104df11..42b0f93 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/CommentUtils.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/util/NodeSortUtils.java @@ -26,7 +26,7 @@ import net.sourceforge.pmd.lang.ast.Node; * @date 2016/11/21 * */ -public class CommentUtils { +public class NodeSortUtils { /** * add node to SortedMap with sequence to determine comment location @@ -36,8 +36,16 @@ public class CommentUtils { */ public static void addNodesToSortedMap(SortedMap map, List nodes) { for (Node node : nodes) { - // sorted by line and column - map.put((node.getBeginLine() << 16) + node.getBeginColumn(), node); + map.put(generateIndex(node), node); } } + + /** + * set order according to node begin line and begin column + * @param node node to sort + * @return generated index + */ + public static int generateIndex(Node node) { + return (node.getBeginLine() << 16) + node.getBeginColumn(); + } } diff --git a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/ClassMustHaveAuthorRule.xml b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/ClassMustHaveAuthorRule.xml index 09be097..a1dbec9 100644 --- a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/ClassMustHaveAuthorRule.xml +++ b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/ClassMustHaveAuthorRule.xml @@ -1,62 +1,62 @@ - - + - - Class without author. - 1 - 1 - - + + Class without author. + 1 + 1 + + - - - - Class with author. - 0 - - - - + + Class with author. + 0 + + + + - - - Class with date. - 1 - 4 - - - - + + Class with date. + 1 + 4 + + + + - - - Class with author and date. - 0 - - + + + Class with author and date. + 0 + + - - - - Class with inner class. - 0 - - + + + Class with inner class. + 0 + + - - - - Enum without author - 1 - 1 - - + + + Enum without author + 1 + 1 + + - - - - Enum with author - 0 - - + + + Enum with author + 0 + + - - - - Enum in class - 0 - - + + + Enum in class + 0 + + - - - - Enum in interface - 0 - - + + + Enum in interface + 0 + + + + + + + Uppercase author annotation + 0 + + \ No newline at end of file diff --git a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/CommentsMustBeJavadocFormatRule.xml b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/CommentsMustBeJavadocFormatRule.xml index cab7aab..236c592 100644 --- a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/CommentsMustBeJavadocFormatRule.xml +++ b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/comment/xml/CommentsMustBeJavadocFormatRule.xml @@ -1,22 +1,22 @@ - - + - - Class have no comment. - 0 - - + + Class have no comment. + 0 + + - - + - - Class have non-javadoc comments. - 3 - 2,4,6 - - + + Class have non-javadoc comments. + 3 + 2,4,6 + + - - - - Class have javadoc comments. - 0 - - + + + Class have javadoc comments. + 0 + + - - - - Anonymous Inner Class have non javadoc comments. - - 2 - 1,3 - - + + + Anonymous Inner Class have non javadoc comments. + + 2 + 1,3 + + - - - - Non-javadoc comments before package and import - - 0 - - + + + Non-javadoc comments before package and import + + 0 + + - - - - Ignore comments behind statements. - - 0 - - + + + Ignore comments behind statements. + + 0 + + + + + + + When node has annotation and wrong comment format + + 4 + 1,5,9,14 + + + + + + + When node has annotation and right comment format + + 0 + +