insert cast/local variable from instanceof: check if written expression equals operand in instanceof before replacement (IDEA-97941)

This commit is contained in:
anna
2012-12-27 21:19:38 +01:00
parent acc6bbe48a
commit 2fe641dad6
4 changed files with 24 additions and 6 deletions

View File

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

View File

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

View File

@@ -0,0 +1,9 @@
// "Cast to 'A'" "true"
class A {
void foo(Object foo) {
if(foo instanceof A) {
((A) foo)
System.out.println("");
}
}
}

View File

@@ -0,0 +1,8 @@
// "Cast to 'A'" "true"
class A {
void foo(Object foo) {
if(foo insta<caret>nceof A) {
System.out.println("");
}
}
}