forked from phoedos/pmd
Merge pull request #4906 from Monits:fix-2056
[java] CloseResource should treat parameters as external even if casted when assigned to a local variable #4906
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -2026,6 +2026,24 @@ public class LocalVariableTypeInference {
|
||||
var list = new ArrayList<String>(); // infers ArrayList<String>
|
||||
var stream = list.stream(); // infers Stream<String>, is never closed
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
|
||||
<test-code>
|
||||
<description>Parameters don't need to be closed even if casted #2056</description>
|
||||
<expected-problems>0</expected-problems>
|
||||
<code><![CDATA[
|
||||
import java.net.URLClassLoader;
|
||||
|
||||
public class CastedParameter {
|
||||
|
||||
public void checkValidity(ClassLoader auxclassPathClassLoader) {
|
||||
if (auxclassPathClassLoader instanceof URLClassLoader) {
|
||||
final URLClassLoader urlClassLoader = (URLClassLoader) auxclassPathClassLoader;
|
||||
// doesn't need to be closed, it's still a paramter…
|
||||
}
|
||||
}
|
||||
}
|
||||
]]></code>
|
||||
</test-code>
|
||||
|
Reference in New Issue
Block a user