diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 0ecc787131..e4de0c558b 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -35,6 +35,8 @@ This is a {{ site.pmd.release_type }} release. * java-design * [#3694](https://github.com/pmd/pmd/issues/3694): \[java] SingularField ignores static variables * [#4873](https://github.com/pmd/pmd/issues/4873): \[java] AvoidCatchingGenericException: Can no longer suppress on the exception itself +* java-errorprone + * [#2056](https://github.com/pmd/pmd/issues/2056): \[java] CloseResource false-positive with URLClassLoader in cast expression * java-performance * [#3845](https://github.com/pmd/pmd/issues/3845): \[java] InsufficientStringBufferDeclaration should consider literal expression * [#4874](https://github.com/pmd/pmd/issues/4874): \[java] StringInstantiation: False-positive when using `new String(charArray)` 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 7a95414dc1..ac75cb0f90 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 @@ -20,6 +20,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTArgumentList; import net.sourceforge.pmd.lang.java.ast.ASTAssignableExpr.ASTNamedReferenceExpr; import net.sourceforge.pmd.lang.java.ast.ASTAssignmentExpression; import net.sourceforge.pmd.lang.java.ast.ASTBlock; +import net.sourceforge.pmd.lang.java.ast.ASTCastExpression; import net.sourceforge.pmd.lang.java.ast.ASTConstructorCall; import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTExecutableDeclaration; @@ -340,8 +341,13 @@ public class CloseResourceRule extends AbstractJavaRule { if (wrappedVarName != null) { ASTFormalParameters methodParams = method.getFormalParameters(); for (ASTFormalParameter param : methodParams) { - if ((isResourceTypeOrSubtype(param) || wrappedVarName.getParent() instanceof ASTVariableDeclarator - || wrappedVarName.getParent() instanceof ASTAssignmentExpression) + // get the parent node where it's used (no casts) + Node parentUse = wrappedVarName.getParent(); + if (parentUse instanceof ASTCastExpression) { + parentUse = parentUse.getParent(); + } + if ((isResourceTypeOrSubtype(param) || parentUse instanceof ASTVariableDeclarator + || parentUse instanceof ASTAssignmentExpression) && JavaAstUtils.isReferenceToVar(wrappedVarName, param.getVarId().getSymbol())) { return true; } 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 a59b5d0be1..f0e32dbfd4 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 @@ -2026,6 +2026,24 @@ public class LocalVariableTypeInference { var list = new ArrayList(); // infers ArrayList var stream = list.stream(); // infers Stream, is never closed } +} + ]]> + + + + Parameters don't need to be closed even if casted #2056 + 0 +