From d1522269a6349b974150cb2c8c31a3407d41f7f4 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 | 1 + ...gJavadocTypeFullyQualifiedAnnotation1.java | 26 ++++++++++++ ...gJavadocTypeFullyQualifiedAnnotation2.java | 26 ++++++++++++ ...gJavadocTypeFullyQualifiedAnnotation3.java | 25 +++++++++++ ...gJavadocTypeFullyQualifiedAnnotation4.java | 27 ++++++++++++ 9 files changed, 173 insertions(+), 31 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..ce41100976b 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 = getAnnotationFullIdent(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 getAnnotationFullIdent(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..53808b98d95 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 = { + "32: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..83e998a2e30 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), + "20:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "23:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + }; + verifyWithInlineConfigParser( + getPath("InputMissingJavadocTypeFullyQualifiedAnnotation1.java"), expected); + } + + @Test + public void testFullyQualifiedAnnotation2() throws Exception { + final String[] expected = { + "20:5: " + getCheckMessage(MSG_JAVADOC_MISSING), + "23: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), + "21: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..3ea76f10e73 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,6 +28,7 @@ public void allowed1() {} @ThisIsOkToo public void allowed2() {} + // violation below 'Missing a Javadoc comment.' @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadocmethod.ThisIsOk public void allowed3() {} 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..e89807a471e --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation1.java @@ -0,0 +1,26 @@ +/* +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 'Missing a Javadoc comment.' + public interface A { } + + // violation below 'Missing a Javadoc comment.' + @InputMissingJavadocTypeFullyQualifiedAnnotation1.SomeAnnotation + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc. // violation 'Missing a Javadoc comment.' + missingjavadoctype.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..f5833d3223d --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation2.java @@ -0,0 +1,26 @@ +/* +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 { } + + // violation below 'Missing a Javadoc comment.' + @InputMissingJavadocTypeFullyQualifiedAnnotation2.SomeAnnotation + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc. // violation 'Missing a Javadoc comment.' + missingjavadoctype.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..0fa5b653d15 --- /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 'Missing a Javadoc comment.' + public interface A { } + + @InputMissingJavadocTypeFullyQualifiedAnnotation3.SomeAnnotation // ok + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc. // violation 'Missing a Javadoc comment.' + missingjavadoctype.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..405feb542c7 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype/InputMissingJavadocTypeFullyQualifiedAnnotation4.java @@ -0,0 +1,27 @@ +/* +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 'Missing a Javadoc comment.' + public interface A { } + + // violation below 'Missing a Javadoc comment.' + @InputMissingJavadocTypeFullyQualifiedAnnotation4.SomeAnnotation + public interface B { } + + @com.puppycrawl.tools.checkstyle.checks.javadoc.missingjavadoctype. // ok + InputMissingJavadocTypeFullyQualifiedAnnotation4.SomeAnnotation + public interface C { } +}