diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 119b89132c56..16b0046718e9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -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() { @Override public void consume(PsiMember member, PsiClass psiClass) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java index 2f414eeedd4d..3d3fd317d4d7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java @@ -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 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); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java index 58a2a19db0d6..c1f61496e463 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java @@ -106,7 +106,7 @@ public class JavaMethodCallElement extends LookupItem 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; diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy index 12d209a155c2..4a4c202b8c1c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/GlobalMemberNameCompletionTest.groovy @@ -161,6 +161,32 @@ class Bar {{ abcmethod1() }}""" assertOrderedEquals myFixture.lookupElementStrings, "abcmethod", "abcmethod1" } + public void testMethodFromTheSameClass() { + myFixture.configureByText("a.java", """ +class A { + static void foo() {} + + static void goo() { + f + } +} +""") + 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(); + } +} +''' + } + private void doTest(String input, boolean importStatic, String output) { myFixture.configureByText("a.java", input) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index a302a865d159..d41996aa6e4f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -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() { + completeStaticMembers(parameters).processMembersOfRegisteredClasses(null, new PairConsumer() { @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 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) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy index 0730f7bf1a75..1c6d3b9987ad 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy @@ -268,5 +268,29 @@ Zoooox""") assertOneElement(myFixture.completeBasic()) } + public void testMethodFromTheSameClass() { + myFixture.configureByText("a.groovy", """ +class A { + static void foo() {} + + static void goo() { + f + } +} +""") + assert 'foo' == renderElement(myFixture.complete(CompletionType.CLASS_NAME)[0]).itemText + myFixture.type '\n' + myFixture.checkResult ''' +class A { + static void foo() {} + + static void goo() { + foo() + } +} +''' + } + + }