From c8e666b47cf6022c900206c07496cdf14603f5a9 Mon Sep 17 00:00:00 2001 From: stoyanK7 Date: Sun, 3 Jul 2022 14:52:56 +0300 Subject: [PATCH] Issue #11736: Support qualified annotation names for MissingJavadocTypeCheck --- .../checkstyle/utils/AnnotationUtil.java | 31 ++++++++++---- .../MissingJavadocMethodCheckTest.java | 4 +- .../javadoc/MissingJavadocTypeCheckTest.java | 41 +++++++++++++++++++ .../checkstyle/utils/AnnotationUtilTest.java | 23 ----------- ...issingJavadocMethodAllowedAnnotations.java | 2 +- ...gJavadocTypeFullyQualifiedAnnotation1.java | 25 +++++++++++ ...gJavadocTypeFullyQualifiedAnnotation2.java | 25 +++++++++++ ...gJavadocTypeFullyQualifiedAnnotation3.java | 25 +++++++++++ ...gJavadocTypeFullyQualifiedAnnotation4.java | 26 ++++++++++++ 9 files changed, 170 insertions(+), 32 deletions(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation1.java create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation2.java create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation3.java create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation4.java diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtil.java b/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtil.java index a79f6ccf197..606059a8e19 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtil.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtil.java @@ -123,13 +123,8 @@ public static boolean containsAnnotation(DetailAST ast, Set annotations) if (!annotations.isEmpty()) { final DetailAST firstMatchingAnnotation = findFirstAnnotation(ast, annotationNode -> { - DetailAST identNode = annotationNode.findFirstToken(TokenTypes.IDENT); - if (identNode == null) { - identNode = annotationNode.findFirstToken(TokenTypes.DOT) - .findFirstToken(TokenTypes.IDENT); - } - - return annotations.contains(identNode.getText()); + final String annotationFullIdent = getAnnotatioFullIdent(annotationNode); + return annotations.contains(annotationFullIdent); }); result = firstMatchingAnnotation != null; } @@ -137,6 +132,28 @@ public static boolean containsAnnotation(DetailAST ast, Set annotations) return result; } + /** + * Gets the full ident text of the annotation AST. + * + * @param annotationNode The annotation AST. + * @return The full ident text. + */ + private static String getAnnotatioFullIdent(DetailAST annotationNode) { + final DetailAST identNode = annotationNode.findFirstToken(TokenTypes.IDENT); + final String annotationString; + + // If no `IDENT` is found, then we have a `DOT` -> more than 1 qualifier + if (identNode == null) { + final DetailAST dotNode = annotationNode.findFirstToken(TokenTypes.DOT); + annotationString = FullIdent.createFullIdent(dotNode).getText(); + } + else { + annotationString = identNode.getText(); + } + + return annotationString; + } + /** * Checks if the AST is annotated with {@code Override} or * {@code java.lang.Override} annotation. diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocMethodCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocMethodCheckTest.java index 9442b579e71..5a8ddcad177 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocMethodCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocMethodCheckTest.java @@ -82,7 +82,9 @@ public void newTest() throws Exception { @Test public void allowedAnnotationsTest() throws Exception { - final String[] expected = CommonUtil.EMPTY_STRING_ARRAY; + final String[] expected = { + "31:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + }; verifyWithInlineConfigParser( getPath("InputMissingJavadocMethodAllowedAnnotations.java"), expected); } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocTypeCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocTypeCheckTest.java index aef7d1acb1e..ac9ac1015d5 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocTypeCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/MissingJavadocTypeCheckTest.java @@ -291,4 +291,45 @@ public void testInterfaceMemberScopeIsPublic() throws Exception { expected); } + @Test + public void testFullyQualifiedAnnotation1() throws Exception { + final String[] expected = { + "16:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "19:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "22:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + }; + verifyWithInlineConfigParser( + getPath("InputMissingJavadocTypeFullyQualifiedAnnotation1.java"), expected); + } + + @Test + public void testFullyQualifiedAnnotation2() throws Exception { + final String[] expected = { + "19:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "22:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + }; + verifyWithInlineConfigParser( + getPath("InputMissingJavadocTypeFullyQualifiedAnnotation2.java"), expected); + } + + @Test + public void testFullyQualifiedAnnotation3() throws Exception { + final String[] expected = { + "16:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "22:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + }; + verifyWithInlineConfigParser( + getPath("InputMissingJavadocTypeFullyQualifiedAnnotation3.java"), expected); + } + + @Test + public void testFullyQualifiedAnnotation4() throws Exception { + final String[] expected = { + "17:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "20:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + }; + verifyWithInlineConfigParser( + getPath("InputMissingJavadocTypeFullyQualifiedAnnotation4.java"), expected); + } + } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilTest.java index 6f8ce1ab078..6c6f5cd98d2 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilTest.java @@ -225,29 +225,6 @@ public void testContainsAnnotationListWithNoAnnotationNode() { .isFalse(); } - @Test - public void testContainsAnnotationListWithEmptyAnnotationNode() { - final DetailAstImpl ast = new DetailAstImpl(); - final DetailAstImpl modifiersAst = create( - TokenTypes.MODIFIERS, - create( - TokenTypes.ANNOTATION, - create( - TokenTypes.DOT, - create( - TokenTypes.IDENT, - "Override") - ) - ) - ); - ast.addChild(modifiersAst); - final Set annotations = Set.of("Override"); - final boolean result = AnnotationUtil.containsAnnotation(ast, annotations); - assertWithMessage("The dot-ident variation should also work") - .that(result) - .isTrue(); - } - @Test public void testContainsAnnotationListWithNoMatchingAnnotation() { final DetailAstImpl ast = new DetailAstImpl(); diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadocmethod/InputMissingJavadocMethodAllowedAnnotations.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadocmethod/InputMissingJavadocMethodAllowedAnnotations.java index cf1c5bdabc7..9be564df2b1 100644 --- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadocmethod/InputMissingJavadocMethodAllowedAnnotations.java +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadocmethod/InputMissingJavadocMethodAllowedAnnotations.java @@ -28,7 +28,7 @@ public void allowed1() {} @ThisIsOkToo public void allowed2() {} - @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadocmethod.ThisIsOk + @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadocmethod.ThisIsOk // violation public void allowed3() {} @Override diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation1.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation1.java new file mode 100644 index 00000000000..0702aa81ee2 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation1.java @@ -0,0 +1,25 @@ +/* +MissingJavadocType +scope = (default)public +excludeScope = (default)null +skipAnnotations = (default)Generated +tokens = INTERFACE_DEF + + +*/ + +package com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype; + +public class InputMissingJavadocTypeFullyQualifiedAnnotation1 { + public @interface SomeAnnotation { } + + @SomeAnnotation // violation + public interface A { } + + @InputMissingJavadocTypeFullyQualifiedAnnotation1.SomeAnnotation // violation + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype. // violation + InputMissingJavadocTypeFullyQualifiedAnnotation1.SomeAnnotation + public interface C { } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation2.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation2.java new file mode 100644 index 00000000000..1c6abf2651a --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation2.java @@ -0,0 +1,25 @@ +/* +MissingJavadocType +scope = (default)public +excludeScope = (default)null +skipAnnotations = SomeAnnotation +tokens = INTERFACE_DEF + + +*/ + +package com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype; + +public class InputMissingJavadocTypeFullyQualifiedAnnotation2 { + public @interface SomeAnnotation { } + + @SomeAnnotation // ok + public interface A { } + + @InputMissingJavadocTypeFullyQualifiedAnnotation2.SomeAnnotation // violation + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype. // violation + InputMissingJavadocTypeFullyQualifiedAnnotation2.SomeAnnotation + public interface C { } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation3.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation3.java new file mode 100644 index 00000000000..2c3811b0dc2 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation3.java @@ -0,0 +1,25 @@ +/* +MissingJavadocType +scope = (default)public +excludeScope = (default)null +skipAnnotations = InputMissingJavadocTypeFullyQualifiedAnnotation3.SomeAnnotation +tokens = INTERFACE_DEF + + +*/ + +package com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype; + +public class InputMissingJavadocTypeFullyQualifiedAnnotation3 { + public @interface SomeAnnotation { } + + @SomeAnnotation // violation + public interface A { } + + @InputMissingJavadocTypeFullyQualifiedAnnotation3.SomeAnnotation // ok + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype. // violation + InputMissingJavadocTypeFullyQualifiedAnnotation3.SomeAnnotation + public interface C { } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation4.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation4.java new file mode 100644 index 00000000000..cc207d75f7a --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation4.java @@ -0,0 +1,26 @@ +/* +MissingJavadocType +scope = (default)public +excludeScope = (default)null +skipAnnotations = com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype.\ + InputMissingJavadocTypeFullyQualifiedAnnotation4.SomeAnnotation +tokens = INTERFACE_DEF + + +*/ + +package com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype; + +public class InputMissingJavadocTypeFullyQualifiedAnnotation4 { + public @interface SomeAnnotation { } + + @SomeAnnotation // violation + public interface A { } + + @InputMissingJavadocTypeFullyQualifiedAnnotation4.SomeAnnotation // violation + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype. // ok + InputMissingJavadocTypeFullyQualifiedAnnotation4.SomeAnnotation + public interface C { } +}