From df0344bc51c9b1058a0b62ea1d3e501e895f2026 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 24 Jun 2013 16:58:40 +0200 Subject: [PATCH] IDEA-106227 (Incorrect inspection "Local variable is redundant' in try-with-resources clause) --- .../UnnecessaryLocalVariableInspection.java | 24 ++++--- .../dataflow/unnecessary_local_vars/C.java | 38 +++++++++++- .../unnecessary_local_vars/expected.xml | 62 ++++++++++++------- 3 files changed, 87 insertions(+), 37 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspection.java index 483e9f3ebc35..5da5ba2dd82d 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspection.java @@ -25,6 +25,7 @@ import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.InlineVariableFix; +import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NotNull; @@ -114,7 +115,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { } private boolean isCopyVariable(PsiVariable variable) { - final PsiExpression initializer = variable.getInitializer(); + final PsiExpression initializer = ParenthesesUtils.stripParentheses(variable.getInitializer()); if (!(initializer instanceof PsiReferenceExpression)) { return false; } @@ -126,6 +127,9 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { if (!(referent instanceof PsiLocalVariable || referent instanceof PsiParameter)) { return false; } + if (!(referent instanceof PsiResourceVariable) && variable instanceof PsiResourceVariable) { + return false; + } final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); if (containingScope == null) { return false; @@ -169,7 +173,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { return false; } final PsiReturnStatement returnStatement = (PsiReturnStatement)nextStatement; - final PsiExpression returnValue = returnStatement.getReturnValue(); + final PsiExpression returnValue = ParenthesesUtils.stripParentheses(returnStatement.getReturnValue()); if (!(returnValue instanceof PsiReferenceExpression)) { return false; } @@ -178,10 +182,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { if (referent == null || !referent.equals(variable)) { return false; } - if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { - return false; - } - return true; + return !isVariableUsedInFollowingDeclarations(variable, declarationStatement); } private boolean isImmediatelyThrown(PsiVariable variable) { @@ -206,7 +207,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { return false; } final PsiThrowStatement throwStatement = (PsiThrowStatement)nextStatement; - final PsiExpression returnValue = throwStatement.getException(); + final PsiExpression returnValue = ParenthesesUtils.stripParentheses(throwStatement.getException()); if (!(returnValue instanceof PsiReferenceExpression)) { return false; } @@ -214,10 +215,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { if (referent == null || !referent.equals(variable)) { return false; } - if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { - return false; - } - return true; + return !isVariableUsedInFollowingDeclarations(variable, declarationStatement); } private boolean isImmediatelyAssigned(PsiVariable variable) { @@ -253,7 +251,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { if (tokenType != JavaTokenType.EQ) { return false; } - final PsiExpression rhs = assignmentExpression.getRExpression(); + final PsiExpression rhs = ParenthesesUtils.stripParentheses(assignmentExpression.getRExpression()); if (!(rhs instanceof PsiReferenceExpression)) { return false; } @@ -305,7 +303,7 @@ public class UnnecessaryLocalVariableInspection extends BaseInspection { continue; } final PsiVariable nextVariable = (PsiVariable)declaration; - final PsiExpression initializer = nextVariable.getInitializer(); + final PsiExpression initializer = ParenthesesUtils.stripParentheses(nextVariable.getInitializer()); if (!referenceFound && initializer instanceof PsiReferenceExpression) { final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)initializer; final PsiElement referent = referenceExpression.resolve(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/C.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/C.java index 234c1ba884de..da4b4b43181c 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/C.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/C.java @@ -5,8 +5,8 @@ class C { System.out.println(s2 + s3); AutoCloseable r1 = null; - try (AutoCloseable r2 = r1, AutoCloseable r3 = null) { - System.out.println(r2 + r3); + try (AutoCloseable r2 = r1; AutoCloseable r3 = null) { + System.out.println(r2.toString() + r3.toString()); } } @@ -20,7 +20,7 @@ class C { System.out.println(r2 + r3); } } - + int boxing(Long l) { long ll = l; return (int) ll; @@ -83,4 +83,36 @@ class C { return null; } + public void neededResourceVariable(java.io.InputStream in) throws java.io.IOException { + try (java.io.InputStream inn = in) { + final int read = inn.read(); + // do stuff with in + } + } + + int parenthesized() { + final int i = 1 + 2; + return (i); + } + + void parenthesized2() { + final RuntimeException t = new RuntimeException(); + throw (t); + } + + void parenthesized3(int i) { + int j = (i); + } + + void parenthesized4(int k) { + final int j = 1; + k = (j); + } + + void parenthesized5() { + final int j = 1; + int k = (j); + System.out.println(k); + } + } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/expected.xml index bf91c5c62e2c..70ce7071c30e 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_vars/expected.xml @@ -21,13 +21,6 @@ Local variable <code>r1</code> is redundant #loc - - C.java - 8 - Redundant local variable - Local variable <code>r2</code> is redundant #loc - - C.java 15 @@ -42,20 +35,6 @@ Local variable <code>s3</code> is redundant #loc - - C.java - 19 - Redundant local variable - Local variable <code>r2</code> is redundant #loc - - - - C.java - 19 - Redundant local variable - Local variable <code>r3</code> is redundant #loc - - C.java 30 @@ -98,5 +77,46 @@ Local variable <code>value</code> is redundant #loc + + C.java + 94 + Redundant local variable + Local variable <code>i</code> is redundant #loc + + + + C.java + 99 + Redundant local variable + Local variable <code>t</code> is redundant #loc + + + + C.java + 108 + Redundant local variable + Local variable <code>j</code> is redundant #loc + + + + C.java + 104 + Redundant local variable + Local variable <code>j</code> is redundant #loc + + + + C.java + 113 + Redundant local variable + Local variable <code>j</code> is redundant #loc + + + + C.java + 114 + Redundant local variable + Local variable <code>k</code> is redundant #loc + \ No newline at end of file