From 5c3bc4ba1ed63243f3f1d0cc197482293b73e2bd Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 26 Aug 2010 20:23:29 +0100 Subject: [PATCH] statically imported methods completion in groovy --- ...GlobalMemberNameCompletionContributor.java | 9 ++++- .../GroovyCompletionContributor.java | 33 +++++++++++++++++-- .../GroovyClassNameCompletionTest.groovy | 13 ++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) 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 4bda4b1b9bd8..ab0b2c164fb0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java @@ -76,6 +76,13 @@ public class JavaGlobalMemberNameCompletionContributor extends CompletionContrib return; } + processStaticMethods(result, position, STATIC_METHOD_INSERT_HANDLER); + } + + public static void processStaticMethods(final CompletionResultSet result, + final PsiElement position, + final InsertHandler insertHandler) { + PrefixMatcher matcher = result.getPrefixMatcher(); final Project project = position.getProject(); final GlobalSearchScope scope = GlobalSearchScope.allScope(project); final PsiShortNamesCache namesCache = JavaPsiFacade.getInstance(project).getShortNamesCache(); @@ -101,7 +108,7 @@ public class JavaGlobalMemberNameCompletionContributor extends CompletionContrib if (!JavaCompletionUtil.isInExcludedPackage(containingClass) && !StaticImportMethodFix.isExcluded(method)) { result.addElement(LookupElementDecorator.withInsertHandler( LookupElementDecorator.withRenderer(LookupElementBuilder.create(method), STATIC_METHOD_RENDERER), - STATIC_METHOD_INSERT_HANDLER)); + insertHandler)); } } 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 91bcad8e84c7..a22e14032890 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 @@ -45,7 +45,6 @@ import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; @@ -98,6 +97,22 @@ public class GroovyCompletionContributor extends CompletionContributor { psiElement().withParent(psiElement(GrReferenceExpression.class).withParent(psiElement(GrArgumentList.class).withParent(GrCall.class))); private static final String[] THIS_SUPER = {"this", "super"}; + private static final InsertHandler STATIC_IMPORT_INSERT_HANDLER = new InsertHandler() { + @Override + public void handleInsert(InsertionContext context, LookupElement item) { + new GroovyInsertHandler().handleInsert(context, item); + final PsiClass containingClass = ((PsiMethod)item.getObject()).getContainingClass(); + if (containingClass != null) { + PsiDocumentManager.getInstance(containingClass.getProject()).commitDocument(context.getDocument()); + final GrReferenceExpression ref = PsiTreeUtil + .findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), GrReferenceExpression.class, false); + if (ref != null) { + ref.bindToElementViaStaticImport(containingClass); + } + } + + } + }; public static boolean isReferenceInNewExpression(PsiElement reference) { if (!(reference instanceof GrCodeReferenceElement)) return false; @@ -303,7 +318,7 @@ public class GroovyCompletionContributor extends CompletionContributor { } }); - extend(CompletionType.BASIC, psiElement().withParent(GrReferenceElement.class), new CompletionProvider() { + extend(CompletionType.BASIC, psiElement().withParent(GrReferenceElement.class), new CompletionProvider(false) { @Override protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @@ -323,6 +338,20 @@ public class GroovyCompletionContributor extends CompletionContributor { } }); + extend(CompletionType.CLASS_NAME, psiElement().withParent(GrReferenceElement.class), new CompletionProvider(false) { + @Override + protected void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull final CompletionResultSet result) { + final PsiElement position = parameters.getPosition(); + if (((GrReferenceElement)position.getParent()).getQualifier() != null) return; + + final String s = result.getPrefixMatcher().getPrefix(); + if (StringUtil.isEmpty(s) || !Character.isLowerCase(s.charAt(0))) return; + + JavaGlobalMemberNameCompletionContributor.processStaticMethods(result, position, STATIC_IMPORT_INSERT_HANDLER); + } + }); } private static void addPropertiesForClass(CompletionResultSet result, diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyClassNameCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyClassNameCompletionTest.groovy index 71b585c28c10..918921dd044c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyClassNameCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyClassNameCompletionTest.groovy @@ -107,4 +107,17 @@ public class GroovyClassNameCompletionTest extends LightCodeInsightFixtureTestCa myFixture.checkResult "a.FooBarGooDoo" } + public void testStaticMethod() throws Exception { + myFixture.addFileToProject("b.groovy", """ +class Foo { + static def abcmethod(int a) {} +}""") + myFixture.configureByText("a.groovy", "abcme") + myFixture.complete(CompletionType.CLASS_NAME) + myFixture.checkResult """import static Foo.abcmethod + +abcmethod()""" + + } + }