insert instance of|cast when condition contains intersection with instanceof (IDEA-64776)

This commit is contained in:
anna
2011-08-23 12:12:04 +02:00
parent ac73782715
commit c0a11624a2
5 changed files with 66 additions and 10 deletions

View File

@@ -119,18 +119,40 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction {
}
PsiStatement statement = PsiTreeUtil.getParentOfType(element, PsiIfStatement.class, PsiWhileStatement.class);
if (statement instanceof PsiIfStatement) {
PsiExpression condition = ((PsiIfStatement)statement).getCondition();
if (condition instanceof PsiInstanceOfExpression) {
if (atSameLine(condition, editor) || insideEmptyBlockOfStatement(statement, element)) {
return (PsiInstanceOfExpression)condition;
}
}
final PsiExpression condition = ((PsiIfStatement)statement).getCondition();
return retrieveInstanceOfFromCondition(editor, element, statement, condition);
}
else if (statement instanceof PsiWhileStatement) {
PsiExpression condition = ((PsiWhileStatement)statement).getCondition();
if (condition instanceof PsiInstanceOfExpression) {
if (atSameLine(condition, editor) || insideEmptyBlockOfStatement(statement, element)) {
return (PsiInstanceOfExpression)condition;
final PsiExpression condition = ((PsiWhileStatement)statement).getCondition();
return retrieveInstanceOfFromCondition(editor, element, statement, condition);
}
return null;
}
@Nullable
private static PsiInstanceOfExpression retrieveInstanceOfFromCondition(Editor editor,
PsiElement element,
PsiStatement statement,
PsiExpression condition) {
if (condition instanceof PsiInstanceOfExpression) {
if (atSameLine(condition, editor) || insideEmptyBlockOfStatement(statement, element)) {
return (PsiInstanceOfExpression)condition;
}
} else if (condition instanceof PsiPolyadicExpression) {
final PsiExpression[] operands = ((PsiPolyadicExpression)condition).getOperands();
if (((PsiPolyadicExpression)condition).getOperationTokenType() == JavaTokenType.ANDAND) {
PsiInstanceOfExpression expr = null;
for (PsiExpression operand : operands) {
if (operand instanceof PsiInstanceOfExpression) {
if (expr != null) {
expr = null;
break;
}
expr = (PsiInstanceOfExpression)operand;
}
}
if (expr != null && insideEmptyBlockOfStatement(statement, element)) {
return expr;
}
}
}

View File

@@ -0,0 +1,10 @@
// "Insert '(String)o' declaration" "true"
class C {
void f(Object o, Object f) {
if (o instanceof String && f == null) {
String s = (String) o;
<caret>
}
}
}

View File

@@ -0,0 +1,8 @@
// "Insert '(String)o' declaration" "true"
class C {
void f(Object o, Object f) {
if (o instanceof String && f == null) {
<caret>
}
}
}

View File

@@ -0,0 +1,8 @@
// "Insert '(String)o' declaration" "false"
class C {
void f(Object o, Object f) {
if (o instanceof String || f == null) {
<caret>
}
}
}

View File

@@ -0,0 +1,8 @@
// "Insert '(String)o' declaration" "false"
class C {
void f(Object o, Object f) {
if (o instanceof String && f instanceof String) {
<caret>
}
}
}