mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
insert cast/local variable from instanceof: check if written expression equals operand in instanceof before replacement (IDEA-97941)
This commit is contained in:
@@ -17,12 +17,10 @@ package com.intellij.codeInsight.daemon.impl.quickfix;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightBundle;
|
||||
import com.intellij.codeInsight.CodeInsightUtilBase;
|
||||
import com.intellij.openapi.editor.CaretModel;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -68,7 +66,7 @@ public class CreateCastExpressionFromInstanceofAction extends CreateLocalVarFrom
|
||||
cast.getCastType().replace(factory.createTypeElement(castType));
|
||||
cast.getOperand().replace(instanceOfExpression.getOperand());
|
||||
|
||||
final PsiStatement statementInside = isNegated(instanceOfExpression) ? null : getExpressionStatementInside(file, editor);
|
||||
final PsiStatement statementInside = isNegated(instanceOfExpression) ? null : getExpressionStatementInside(file, editor, instanceOfExpression.getOperand());
|
||||
if (statementInside != null) {
|
||||
return statementInside.replace(statement);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.intellij.codeInsight.daemon.impl.quickfix;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightUtilBase;
|
||||
import com.intellij.codeInsight.PsiEquivalenceUtil;
|
||||
import com.intellij.codeInsight.daemon.QuickFixBundle;
|
||||
import com.intellij.codeInsight.intention.impl.BaseIntentionAction;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
@@ -201,7 +202,7 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction {
|
||||
PsiInstanceOfExpression instanceOfExpression = getInstanceOfExpressionAtCaret(editor, file);
|
||||
assert instanceOfExpression.getContainingFile() == file : instanceOfExpression.getContainingFile() + "; file="+file;
|
||||
try {
|
||||
final PsiStatement statementInside = isNegated(instanceOfExpression) ? null : getExpressionStatementInside(file, editor);
|
||||
final PsiStatement statementInside = isNegated(instanceOfExpression) ? null : getExpressionStatementInside(file, editor, instanceOfExpression.getOperand());
|
||||
PsiDeclarationStatement decl = createLocalVariableDeclaration(instanceOfExpression, statementInside);
|
||||
if (decl == null) return;
|
||||
decl = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(decl);
|
||||
@@ -243,7 +244,7 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected static PsiStatement getExpressionStatementInside(PsiFile file, Editor editor) {
|
||||
protected static PsiStatement getExpressionStatementInside(PsiFile file, Editor editor, @NotNull PsiExpression operand) {
|
||||
PsiElement elementAt = file.findElementAt(editor.getCaretModel().getOffset());
|
||||
|
||||
PsiBlockStatement blockStatement = PsiTreeUtil.getParentOfType(elementAt, PsiBlockStatement.class);
|
||||
@@ -267,7 +268,9 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction {
|
||||
|
||||
if (blockStatement != null) {
|
||||
final PsiStatement[] statements = blockStatement.getCodeBlock().getStatements();
|
||||
if (statements.length == 1 && statements[0] instanceof PsiExpressionStatement) {
|
||||
if (statements.length == 1 &&
|
||||
statements[0] instanceof PsiExpressionStatement &&
|
||||
PsiEquivalenceUtil.areElementsEquivalent(((PsiExpressionStatement)statements[0]).getExpression(), operand)) {
|
||||
return statements[0];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
// "Cast to 'A'" "true"
|
||||
class A {
|
||||
void foo(Object foo) {
|
||||
if(foo instanceof A) {
|
||||
((A) foo)
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// "Cast to 'A'" "true"
|
||||
class A {
|
||||
void foo(Object foo) {
|
||||
if(foo insta<caret>nceof A) {
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user