diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java index f1d98b238659..e10d9321c06a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java @@ -121,7 +121,7 @@ public class RemoveUnusedVariableUtil { * @param sideEffects if null, delete usages, otherwise collect side effects * @return true if there are at least one unrecoverable side effect found, false if no side effects, * null if read usage found (may happen if interval between fix creation in invoke() call was long enough) - * @throws com.intellij.util.IncorrectOperationException + * @throws IncorrectOperationException */ static Boolean processUsage(PsiElement element, PsiVariable variable, List sideEffects, @NotNull RemoveMode deleteMode) throws IncorrectOperationException { @@ -136,7 +136,7 @@ public class RemoveUnusedVariableUtil { return null; } PsiExpression rExpression = expression.getRExpression(); - rExpression = PsiUtil.deparenthesizeExpression(rExpression); + rExpression = PsiUtil.skipParenthesizedExprDown(rExpression); if (rExpression == null) return true; // replace assignment with expression and resimplify boolean sideEffectFound = checkSideEffects(rExpression, variable, sideEffects); @@ -144,9 +144,7 @@ public class RemoveUnusedVariableUtil { if (deleteMode == RemoveMode.MAKE_STATEMENT || deleteMode == RemoveMode.DELETE_ALL && !(element.getParent() instanceof PsiExpressionStatement)) { element = replaceElementWithExpression(rExpression, factory, element); - while (element.getParent() instanceof PsiParenthesizedExpression) { - element = element.getParent().replace(element); - } + element = eraseUnnecessaryOuterParentheses(element); List references = new ArrayList<>(); collectReferences(element, variable, references); deleteReferences(variable, references, deleteMode); @@ -208,6 +206,19 @@ public class RemoveUnusedVariableUtil { return true; } + @NotNull + private static PsiElement eraseUnnecessaryOuterParentheses(@NotNull PsiElement element) { + PsiElement parenthesizedParent = element; + while (parenthesizedParent.getParent() instanceof PsiParenthesizedExpression) { + parenthesizedParent = parenthesizedParent.getParent(); + } + if (parenthesizedParent != element) { + // replace() will preserve the parentheses if they're mandatory due to operator precedence + return parenthesizedParent.replace(element); + } + return element; + } + public static boolean isForLoopUpdate(@Nullable PsiElement element) { if(element == null) return false; PsiElement parent = element.getParent(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/afterCastAsSubexpr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/afterCastAsSubexpr.java new file mode 100644 index 000000000000..1e4462e332a9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/afterCastAsSubexpr.java @@ -0,0 +1,10 @@ +// "Remove variable 'c'" "true" +class C { + String s; + + void foo(Object o) { + if (o instanceof C) { + String t = ((C) o).s; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/afterCastAsSubexpr1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/afterCastAsSubexpr1.java new file mode 100644 index 000000000000..6e664a644dfc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/afterCastAsSubexpr1.java @@ -0,0 +1,8 @@ +// "Remove variable 'n'" "true" +class C { + void foo(Object o) { + if (o instanceof Integer) { + int i = (Integer) o + 1; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/beforeCastAsSubexpr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/beforeCastAsSubexpr.java new file mode 100644 index 000000000000..fc34a5241388 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/beforeCastAsSubexpr.java @@ -0,0 +1,11 @@ +// "Remove variable 'c'" "true" +class C { + String s; + + void foo(Object o) { + if (o instanceof C) { + C c; + String t = (c = (C) o).s; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/beforeCastAsSubexpr1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/beforeCastAsSubexpr1.java new file mode 100644 index 000000000000..a5e958b9510a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeUnusedVariable/beforeCastAsSubexpr1.java @@ -0,0 +1,9 @@ +// "Remove variable 'n'" "true" +class C { + void foo(Object o) { + if (o instanceof Integer) { + Integer n; + int i = (n = (Integer) o) + 1; + } + } +} \ No newline at end of file