From 86ce57ca3c4e0e37e39f6439e421837f83d7f0df Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 22 Jun 2019 19:01:24 +0200 Subject: [PATCH] [java] CloseResource: support try-with-resources --- .../rule/errorprone/CloseResourceRule.java | 18 +++++++++++++--- .../rule/errorprone/xml/CloseResource.xml | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) 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 e422446314..27ba1d8818 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 @@ -32,6 +32,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; import net.sourceforge.pmd.lang.java.ast.ASTReferenceType; +import net.sourceforge.pmd.lang.java.ast.ASTResourceSpecification; import net.sourceforge.pmd.lang.java.ast.ASTReturnStatement; import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression; import net.sourceforge.pmd.lang.java.ast.ASTTryStatement; @@ -157,10 +158,12 @@ public class CloseResourceRule extends AbstractJavaRule { if (var.hasInitializer()) { // figure out the runtime type. If the variable is initialized, take the type from there TypeNode runtimeType = var.getInitializer().getFirstChildOfType(ASTExpression.class); - if (runtimeType != null && !isAllowedResourceType(runtimeType)) { - ids.put(var.getVariableId(), runtimeType); + if (runtimeType != null && runtimeType.getType() != null) { + type = runtimeType; } - } else { + } + + if (!isAllowedResourceType(type)) { ids.put(var.getVariableId(), type); } } @@ -358,6 +361,15 @@ public class CloseResourceRule extends AbstractJavaRule { if (closed) { break; } + } else if (t.isTryWithResources()) { + // maybe the variable is used as a resource + List names = t.getFirstChildOfType(ASTResourceSpecification.class).findDescendantsOfType(ASTName.class); + for (ASTName potentialUsage : names) { + if (potentialUsage.hasImageEqualTo(variableToClose)) { + closed = true; + break; + } + } } } 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 f97781fe8a..206b2ee851 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 @@ -893,4 +893,25 @@ public class Foo { } ]]> + + + closed with try-with-resources + 0 + +