From 3227f7e6052cb874928dc9f348b64623941cd0ac Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 31 May 2019 20:35:12 +0200 Subject: [PATCH 1/3] [java] UseUtilityClass should be LombokAware Fixes #1094 --- .../java/rule/design/UseUtilityClassRule.java | 25 +++++++++++++------ .../java/rule/design/xml/UseUtilityClass.xml | 17 +++++++++++++ 2 files changed, 35 insertions(+), 7 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 6273d61bd0..4dd97f01da 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 @@ -4,6 +4,8 @@ package net.sourceforge.pmd.lang.java.rule.design; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import net.sourceforge.pmd.lang.ast.Node; @@ -17,12 +19,21 @@ import net.sourceforge.pmd.lang.java.ast.ASTMemberValuePair; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTResultType; -import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; +import net.sourceforge.pmd.lang.java.rule.AbstractLombokAwareRule; -public class UseUtilityClassRule extends AbstractJavaRule { +public class UseUtilityClassRule extends AbstractLombokAwareRule { - public UseUtilityClassRule() { - addRuleChainVisit(ASTClassOrInterfaceBody.class); + @Override + protected Collection defaultSuppressionAnnotations() { + return Arrays.asList("lombok.experimental.UtilityClass"); + } + + @Override + public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { + if (hasIgnoredAnnotation(node)) { + return data; + } + return super.visit(node, data); } @Override @@ -33,7 +44,7 @@ public class UseUtilityClassRule extends AbstractJavaRule { return data; } - if (isOkUsingLombok(parent)) { + if (hasLombokNoArgsConstructor(parent)) { return data; } @@ -81,10 +92,10 @@ public class UseUtilityClassRule extends AbstractJavaRule { addViolation(data, decl); } } - return data; + return super.visit(decl, data); } - private boolean isOkUsingLombok(ASTClassOrInterfaceDeclaration parent) { + private boolean hasLombokNoArgsConstructor(ASTClassOrInterfaceDeclaration parent) { // check if there's a lombok no arg private constructor, if so skip the rest of the rules ASTAnnotation annotation = parent.getAnnotation("lombok.NoArgsConstructor"); 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 2540573f5e..498ffe9d3f 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 @@ -360,4 +360,21 @@ public class FooLocal extends ThreadLocal { } ]]> + + + #1094 [java] UseUtilityClass should be LombokAware + 0 + + From a115daefe09f81a6b47a18c8cfca0289c9494fb6 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 31 May 2019 20:38:57 +0200 Subject: [PATCH 2/3] Update release notes, fixes #1094 --- docs/pages/release_notes.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index b8f8783555..e55b9067e1 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -14,8 +14,16 @@ This is a {{ site.pmd.release_type }} release. ### New and noteworthy +#### Modified Rules + +* The Java rule {% rule "java/design/UseUtilityClass" %} (`java-design`) has a new property `ignoredAnnotations`. + By default, classes that are annotated with Lombok's `@UtilityClass` are ignored now. + ### Fixed Issues +* java-design + * [#1094](https://github.com/pmd/pmd/issues/1094): \[java] UseUtilityClass should be LombokAware + ### API Changes ### External Contributions From 8492c322737c4148ab37a76b1f562a58d9171a36 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 1 Jun 2019 10:04:33 +0200 Subject: [PATCH 3/3] UseUtilityClass - fix false-negatives with inner classes --- .../java/rule/design/UseUtilityClassRule.java | 8 +-- .../java/rule/design/xml/UseUtilityClass.xml | 52 +++++++++++++++++++ 2 files changed, 57 insertions(+), 3 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 4dd97f01da..a3fa7780bc 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 @@ -38,14 +38,16 @@ public class UseUtilityClassRule extends AbstractLombokAwareRule { @Override public Object visit(ASTClassOrInterfaceBody decl, Object data) { + Object result = super.visit(decl, data); + if (decl.jjtGetParent() instanceof ASTClassOrInterfaceDeclaration) { ASTClassOrInterfaceDeclaration parent = (ASTClassOrInterfaceDeclaration) decl.jjtGetParent(); if (parent.isAbstract() || parent.isInterface() || parent.getSuperClassTypeNode() != null) { - return data; + return result; } if (hasLombokNoArgsConstructor(parent)) { - return data; + return result; } int i = decl.jjtGetNumChildren(); @@ -92,7 +94,7 @@ public class UseUtilityClassRule extends AbstractLombokAwareRule { addViolation(data, decl); } } - return super.visit(decl, data); + return result; } private boolean hasLombokNoArgsConstructor(ASTClassOrInterfaceDeclaration parent) { 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 498ffe9d3f..a57f064085 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 @@ -374,6 +374,58 @@ public class MyUtil { public static int addSomething(int in) { return in + CONSTANT; } +} + ]]> + + + + Inner class in abstract class false-negative + 1 + + + + + Inner class in abstract class false-negative + 1 + + + + + + Inner class in interface false-negative + 1 + + + + + Inner class in sub-class false-negative + 1 +