Java: Don't delete class cast when deleting unused variable (IDEA-181346)

This commit is contained in:
Pavel Dolgov
2017-11-09 19:33:16 +03:00
parent 54b5cce0db
commit 4c3dfe6001
5 changed files with 54 additions and 5 deletions

View File

@@ -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<PsiElement> 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<PsiElement> 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();

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,8 @@
// "Remove variable 'n'" "true"
class C {
void foo(Object o) {
if (o instanceof Integer) {
int i = (Integer) o + 1;
}
}
}

View File

@@ -0,0 +1,11 @@
// "Remove variable 'c'" "true"
class C {
String s;
void foo(Object o) {
if (o instanceof C) {
C c<caret>;
String t = (c = (C) o).s;
}
}
}

View File

@@ -0,0 +1,9 @@
// "Remove variable 'n'" "true"
class C {
void foo(Object o) {
if (o instanceof Integer) {
Integer n<caret>;
int i = (n = (Integer) o) + 1;
}
}
}