IDEA-74249 Wrong global name completion of static method in same class

This commit is contained in:
peter
2011-09-15 20:02:35 +02:00
parent 330016badf
commit b47513e19f
6 changed files with 68 additions and 9 deletions
@@ -446,7 +446,7 @@ public class JavaCompletionUtil {
}
if (javaReference instanceof PsiReferenceExpression && !((PsiReferenceExpression)javaReference).isQualified()) {
final StaticMemberProcessor memberProcessor = JavaGlobalMemberNameCompletionContributor.completeStaticMembers(element);
final StaticMemberProcessor memberProcessor = JavaGlobalMemberNameCompletionContributor.completeStaticMembers(parameters);
memberProcessor.processMembersOfRegisteredClasses(matcher, new PairConsumer<PsiMember, PsiClass>() {
@Override
public void consume(PsiMember member, PsiClass psiClass) {
@@ -35,14 +35,18 @@ public class JavaGlobalMemberNameCompletionContributor extends CompletionContrib
return;
}
completeStaticMembers(position).processStaticMethodsGlobally(result);
completeStaticMembers(parameters).processStaticMethodsGlobally(result);
}
public static StaticMemberProcessor completeStaticMembers(final PsiElement position) {
public static StaticMemberProcessor completeStaticMembers(CompletionParameters parameters) {
final PsiElement position = parameters.getPosition();
final PsiElement originalPosition = parameters.getOriginalPosition();
final StaticMemberProcessor processor = new StaticMemberProcessor(position) {
@NotNull
@Override
protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull final PsiClass containingClass, final boolean shouldImport) {
protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull final PsiClass containingClass, boolean shouldImport) {
shouldImport |= originalPosition != null && PsiTreeUtil.isAncestor(containingClass, originalPosition, false);
if (member instanceof PsiMethod) {
final JavaMethodCallElement element = new JavaMethodCallElement((PsiMethod)member, true, false);
element.setShouldBeImported(shouldImport);
@@ -55,6 +59,8 @@ public class JavaGlobalMemberNameCompletionContributor extends CompletionContrib
protected LookupElement createLookupElement(@NotNull List<PsiMethod> overloads,
@NotNull PsiClass containingClass,
boolean shouldImport) {
shouldImport |= originalPosition != null && PsiTreeUtil.isAncestor(containingClass, originalPosition, false);
final JavaMethodCallElement element = new JavaMethodCallElement(overloads.get(0), true, true);
element.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, overloads);
element.setShouldBeImported(shouldImport);
@@ -106,7 +106,7 @@ public class JavaMethodCallElement extends LookupItem<PsiMethod> implements Type
context.commitDocument();
if (myHelper != null && willBeImported()) {
final PsiReferenceExpression ref = PsiTreeUtil.findElementOfClassAtOffset(file, startOffset, PsiReferenceExpression.class, false);
if (ref != null && myContainingClass != null) {
if (ref != null && myContainingClass != null && !ref.isReferenceTo(method)) {
ref.bindToElementViaStaticImport(myContainingClass);
}
return;
@@ -161,6 +161,32 @@ class Bar {{ abcmethod1()<caret> }}"""
assertOrderedEquals myFixture.lookupElementStrings, "abcmethod", "abcmethod1"
}
public void testMethodFromTheSameClass() {
myFixture.configureByText("a.java", """
class A {
static void foo() {}
static void goo() {
f<caret>
}
}
""")
def element = myFixture.complete(CompletionType.CLASS_NAME)[0]
def presentation = new LookupElementPresentation()
element.renderElement(presentation)
assert 'foo' == presentation.itemText
myFixture.type '\n'
myFixture.checkResult '''
class A {
static void foo() {}
static void goo() {
foo();<caret>
}
}
'''
}
private void doTest(String input, boolean importStatic, String output) {
myFixture.configureByText("a.java", input)
@@ -242,7 +242,7 @@ public class GroovyCompletionContributor extends CompletionContributor {
if (StringUtil.isEmpty(result.getPrefixMatcher().getPrefix())) return;
completeStaticMembers(position).processStaticMethodsGlobally(result);
completeStaticMembers(parameters).processStaticMethodsGlobally(result);
}
});
@@ -448,7 +448,7 @@ public class GroovyCompletionContributor extends CompletionContributor {
});
if (qualifier == null) {
completeStaticMembers(position).processMembersOfRegisteredClasses(null, new PairConsumer<PsiMember, PsiClass>() {
completeStaticMembers(parameters).processMembersOfRegisteredClasses(null, new PairConsumer<PsiMember, PsiClass>() {
@Override
public void consume(PsiMember member, PsiClass psiClass) {
if (member instanceof GrAccessorMethod) {
@@ -485,11 +485,14 @@ public class GroovyCompletionContributor extends CompletionContributor {
}
}
private static StaticMemberProcessor completeStaticMembers(PsiElement position) {
private static StaticMemberProcessor completeStaticMembers(CompletionParameters parameters) {
final PsiElement position = parameters.getPosition();
final PsiElement originalPosition = parameters.getOriginalPosition();
final StaticMemberProcessor processor = new StaticMemberProcessor(position) {
@NotNull
@Override
protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull PsiClass containingClass, boolean shouldImport) {
shouldImport |= originalPosition != null && PsiTreeUtil.isAncestor(containingClass, originalPosition, false);
return createGlobalMemberElement(member, containingClass, shouldImport);
}
@@ -497,6 +500,7 @@ public class GroovyCompletionContributor extends CompletionContributor {
protected LookupElement createLookupElement(@NotNull List<PsiMethod> overloads,
@NotNull PsiClass containingClass,
boolean shouldImport) {
shouldImport |= originalPosition != null && PsiTreeUtil.isAncestor(containingClass, originalPosition, false);
return new JavaGlobalMemberLookupElement(overloads, containingClass, QUALIFIED_METHOD_INSERT_HANDLER, STATIC_IMPORT_INSERT_HANDLER,
shouldImport);
}
@@ -539,7 +543,6 @@ public class GroovyCompletionContributor extends CompletionContributor {
return new JavaGlobalMemberLookupElement(member, containingClass, QUALIFIED_METHOD_INSERT_HANDLER, STATIC_IMPORT_INSERT_HANDLER, shouldImport);
}
private static final String DUMMY_IDENTIFIER_TRIMMED_DECAPITALIZED = "intelliJIdeaRulezzz";
private static final String DUMMY_IDENTIFIER_DECAPITALIZED = "intelliJIdeaRulezzz ";
public void beforeCompletion(@NotNull final CompletionInitializationContext context) {
@@ -268,5 +268,29 @@ Zoooo<caret>x""")
assertOneElement(myFixture.completeBasic())
}
public void testMethodFromTheSameClass() {
myFixture.configureByText("a.groovy", """
class A {
static void foo() {}
static void goo() {
f<caret>
}
}
""")
assert 'foo' == renderElement(myFixture.complete(CompletionType.CLASS_NAME)[0]).itemText
myFixture.type '\n'
myFixture.checkResult '''
class A {
static void foo() {}
static void goo() {
foo()<caret>
}
}
'''
}
}