mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Java: Don't delete class cast when deleting unused variable (IDEA-181346)
This commit is contained in:
+16
-5
@@ -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();
|
||||
|
||||
+10
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// "Remove variable 'n'" "true"
|
||||
class C {
|
||||
void foo(Object o) {
|
||||
if (o instanceof Integer) {
|
||||
int i = (Integer) o + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user