diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/ExpressionTypeMemoryState.java b/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/ExpressionTypeMemoryState.java index 4554b15b9041..7b1af3b24ae9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/ExpressionTypeMemoryState.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/guess/impl/ExpressionTypeMemoryState.java @@ -26,6 +26,7 @@ import com.intellij.psi.PsiType; import com.intellij.util.containers.HashMap; import gnu.trove.THashMap; import gnu.trove.TObjectHashingStrategy; +import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -110,7 +111,10 @@ public class ExpressionTypeMemoryState extends DfaMemoryStateImpl { return super.toString() + " states=[" + new HashMap(myStates) + "]"; } - public void setExpressionType(PsiExpression expression, PsiType type) { - myStates.put(expression, type); + public void setExpressionType(PsiExpression expression, @NotNull PsiType type) { + PsiType prev = myStates.get(expression); + if (prev == null || !type.isAssignableFrom(prev)) { + myStates.put(expression, type); + } } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/CastTwice.java b/java/java-tests/testData/codeInsight/completion/normal/CastTwice.java new file mode 100644 index 000000000000..46f2bea0733f --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/CastTwice.java @@ -0,0 +1,14 @@ +public class Class2 { + void test(Object o) { + if (o instanceof B && ((A)o).a() && o. + } +} + + +interface A { + boolean a(); +} + +interface B extends A { + boolean b(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionDfaTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionDfaTest.groovy index eaa0975f37d0..6ac866198fdd 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionDfaTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionDfaTest.groovy @@ -40,7 +40,12 @@ class NormalCompletionDfaTest extends LightFixtureCompletionTestCase { void testCastQualifierForPrivateFieldReference() { doTest(); } void testOrAssignmentDfa() { doTest(); } void testFieldWithCastingCaret() { doTest(); } - + + void testCastTwice() { + configureByTestName() + myFixture.assertPreferredCompletionItems 0, 'b', 'a' + } + void testPublicMethodExtendsProtected() { myFixture.addClass ''' package foo;