From 3d84e3af7453fc02721c7161872c7db1be8fb12b Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 1 Apr 2016 19:04:53 +0200 Subject: [PATCH] Fixes #1467 UseUtilityClass can't correctly check functions with multiple annotations --- .../java/rule/design/UseUtilityClassRule.java | 14 +++++++---- .../java/rule/design/xml/UseUtilityClass.xml | 23 +++++++++++++++++++ src/site/markdown/overview/changelog.md | 2 ++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/UseUtilityClassRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/UseUtilityClassRule.java index 8776a0507c..d877c603e8 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/UseUtilityClassRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/UseUtilityClassRule.java @@ -32,10 +32,7 @@ public class UseUtilityClassRule extends AbstractJavaRule { if (p.jjtGetNumChildren() == 0) { continue; } - Node n = p.jjtGetChild(0); - if (n instanceof ASTAnnotation) { - n = p.jjtGetChild(1); - } + Node n = skipAnnotations(p); if (n instanceof ASTFieldDeclaration) { if (!((ASTFieldDeclaration) n).isStatic()) { isOK = true; @@ -75,6 +72,15 @@ public class UseUtilityClassRule extends AbstractJavaRule { return super.visit(decl, data); } + private Node skipAnnotations(Node p) { + int index = 0; + Node n = p.jjtGetChild(index++); + while (n instanceof ASTAnnotation && index < p.jjtGetNumChildren()) { + n = p.jjtGetChild(index++); + } + return n; + } + private boolean isExceptionType(ASTClassOrInterfaceDeclaration parent) { ASTExtendsList extendsList = parent.getFirstChildOfType(ASTExtendsList.class); if (extendsList != null) { diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/UseUtilityClass.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/UseUtilityClass.xml index 3261b6a9be..eac965d631 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/UseUtilityClass.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/UseUtilityClass.xml @@ -209,6 +209,29 @@ public class MyException extends RuntimeException { protected static String foo() { return "foo"; } +} + ]]> + + + + #1467 UseUtilityClass can't correctly check functions with multiple annotations + 0 + diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 9581d167d2..1c32dcf8f0 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -36,6 +36,8 @@ * [#1449](https://sourceforge.net/p/pmd/bugs/1449/): false positive when casting a variable to short * java-design/AccessorClassGeneration: * [#1452](https://sourceforge.net/p/pmd/bugs/1452/): ArrayIndexOutOfBoundsException with Annotations for AccessorClassGenerationRule +* java-design/UseUtilityClass: + * [#1467](https://sourceforge.net/p/pmd/bugs/1467/): UseUtilityClass can't correctly check functions with multiple annotations * java-imports/UnusedImports: * [#1465](https://sourceforge.net/p/pmd/bugs/1465/): False Positve UnusedImports with javadoc @link * java-junit/TestClassWithoutTestCases: