From fa69bd0ec116704e38b8ea7c85bb552d78cdc1fc Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 26 Nov 2021 09:12:14 +0100 Subject: [PATCH] [java] CloseResource - fix class cast exception with pattern matching --- .../lang/java/rule/errorprone/CloseResourceRule.java | 12 ++++++++++-- .../lang/java/rule/errorprone/xml/CloseResource.xml | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 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 4d0ed46550..07fe312828 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 @@ -35,6 +35,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTMethodCall; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTMethodOrConstructorDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTNullLiteral; +import net.sourceforge.pmd.lang.java.ast.ASTPatternExpression; import net.sourceforge.pmd.lang.java.ast.ASTReturnStatement; import net.sourceforge.pmd.lang.java.ast.ASTStatement; import net.sourceforge.pmd.lang.java.ast.ASTTryStatement; @@ -214,8 +215,15 @@ public class CloseResourceRule extends AbstractJavaRule { } private TypeNode getDeclaredTypeOfVariable(ASTVariableDeclaratorId var) { - ASTLocalVariableDeclaration localVar = (ASTLocalVariableDeclaration) var.getParent().getParent(); - return localVar.getTypeNode(); // note: can be null, if type is inferred (var) + JavaNode exprOrDecl = var.getParent().getParent(); + if (exprOrDecl instanceof ASTLocalVariableDeclaration) { + ASTLocalVariableDeclaration localVar = (ASTLocalVariableDeclaration) exprOrDecl; + return localVar.getTypeNode(); // note: can be null, if type is inferred (var) + } else if (exprOrDecl instanceof ASTPatternExpression) { + ASTPatternExpression pattern = (ASTPatternExpression) exprOrDecl; + return pattern.descendants(TypeNode.class).first(); + } + return null; } private TypeNode getRuntimeTypeOfVariable(ASTVariableDeclaratorId var) { 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 1834d61109..c53e9b02b9 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 @@ -1984,6 +1984,18 @@ public class CloseResourceForEachLoop { } private InputStream[] getStreams() { return null; } +} + ]]> + + + + ClassCastException with pattern matching + 0 + 0; + } } ]]>