IDEA-114736 Bug in code completion inside instanceof block

This commit is contained in:
peter
2013-10-11 16:24:53 +02:00
parent 377acad42d
commit 3744d2ce50
5 changed files with 41 additions and 4 deletions

View File

@@ -384,7 +384,7 @@ public class JavaCompletionUtil {
}
mentioned.add((PsiMember)o);
}
set.add(highlightIfNeeded(qualifierType, castQualifier(item, castItem, plainQualifier), o));
set.add(highlightIfNeeded(qualifierType, castQualifier(item, castItem, plainQualifier, processor), o));
}
}
@@ -427,7 +427,7 @@ public class JavaCompletionUtil {
@NotNull
private static LookupElement castQualifier(@NotNull LookupElement item,
@Nullable final PsiTypeLookupItem castTypeItem,
@Nullable PsiType plainQualifier) {
@Nullable PsiType plainQualifier, JavaCompletionProcessor processor) {
if (castTypeItem == null) {
return item;
}
@@ -449,7 +449,9 @@ public class JavaCompletionUtil {
PsiSubstitutor plainSub = plainResult.getSubstitutor();
PsiSubstitutor castSub = TypeConversionUtil.getSuperClassSubstitutor(plainClass, (PsiClassType)castType);
if (method.getSignature(plainSub).equals(method.getSignature(castSub)) &&
plainSub.substitute(method.getReturnType()).equals(castSub.substitute(method.getReturnType()))) {
plainSub.substitute(method.getReturnType()).equals(castSub.substitute(method.getReturnType())) &&
processor.isAccessible(plainClass.findMethodBySignature(method, true))
) {
return item;
}
}

View File

@@ -265,7 +265,7 @@ public class JavaCompletionProcessor extends BaseScopeProcessor implements Eleme
return myQualifierType;
}
private boolean isAccessible(final PsiElement element) {
public boolean isAccessible(@Nullable final PsiElement element) {
if (!myOptions.checkAccess) return true;
if (!(element instanceof PsiMember)) return true;

View File

@@ -0,0 +1,9 @@
import foo.*;
class Goo {
void method(Foo o) {
if (o instanceof FooImpl) {
o.consu<caret>
}
}
}

View File

@@ -0,0 +1,9 @@
import foo.*;
class Goo {
void method(Foo o) {
if (o instanceof FooImpl) {
((FooImpl) o).consume();<caret>
}
}
}

View File

@@ -39,6 +39,23 @@ class NormalCompletionDfaTest extends LightFixtureCompletionTestCase {
void testCastQualifierForPrivateFieldReference() { doTest(); }
void testOrAssignmentDfa() { doTest(); }
void testFieldWithCastingCaret() { doTest(); }
void testPublicMethodExtendsProtected() {
myFixture.addClass '''
package foo;
public class Foo {
protected void consume() {}
}
'''
myFixture.addClass '''
package foo;
public class FooImpl extends Foo {
public void consume() {}
}
'''
doTest()
}
private void doTest() throws Exception {
configureByTestName()