diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 9a9c0e66fe..8a3553f1b7 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -25,6 +25,8 @@ This is a {{ site.pmd.release_type }} release. * java-bestpractices * [#3190](https://github.com/pmd/pmd/issues/3190): \[java] Use StandardCharsets instead of Charset.forName +* java-errorprone + * [#2757](https://github.com/pmd/pmd/issues/2757): \[java] CloseResource: support Lombok's @Cleanup annotation ### API Changes diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLocalVariableDeclaration.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLocalVariableDeclaration.java index a5e241d58c..d7d71c7d28 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLocalVariableDeclaration.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLocalVariableDeclaration.java @@ -5,6 +5,7 @@ package net.sourceforge.pmd.lang.java.ast; import java.util.Iterator; +import java.util.List; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.annotation.InternalApi; @@ -45,6 +46,11 @@ public class ASTLocalVariableDeclaration extends AbstractJavaAccessNode implemen return visitor.visit(this, data); } + @Override + public List getDeclaredAnnotations() { + return findChildrenOfType(ASTAnnotation.class); + } + @Override public boolean hasSuppressWarningsAnnotationFor(Rule rule) { for (int i = 0; i < getNumChildren(); i++) { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java index 038ccf99d5..f44a486833 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java @@ -45,6 +45,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression; import net.sourceforge.pmd.lang.java.ast.ASTTryStatement; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId; +import net.sourceforge.pmd.lang.java.ast.Annotatable; import net.sourceforge.pmd.lang.java.ast.JavaNode; import net.sourceforge.pmd.lang.java.ast.TypeNode; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; @@ -187,6 +188,10 @@ public class CloseResourceRule extends AbstractJavaRule { List vars = method.findDescendantsOfType(ASTVariableDeclarator.class); Map resVars = new HashMap<>(); for (ASTVariableDeclarator var : vars) { + if (var.getParent() instanceof Annotatable + && ((Annotatable) var.getParent()).isAnnotationPresent("lombok.Cleanup")) { + continue; // auto cleaned up + } TypeNode varType = getTypeOfVariable(var); if (varType != null && isResourceTypeOrSubtype(varType)) { resVars.put(var, wrappedResourceTypeOrReturn(var, varType)); diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/errorprone/closeresource/FakeContext.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/errorprone/closeresource/FakeContext.java new file mode 100644 index 0000000000..c676e72651 --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/errorprone/closeresource/FakeContext.java @@ -0,0 +1,23 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.rule.errorprone.closeresource; + +import java.io.Closeable; +import java.io.IOException; + +/** + * Helper class for #2757 + */ +public class FakeContext implements Closeable, AutoCloseable { + + public T getBean(Class klass) { + return null; + } + + @Override + public void close() throws IOException { + + } +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml index 4b20baa3c6..a037edd9a5 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml @@ -1659,4 +1659,25 @@ public class FalsePositive { } ]]> + + #2757 support @lombok.Cleanup annotation + 0 + +