From 3bb33ea6dba270d13033ccfe1d38af967a0513ad Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 29 Oct 2010 23:04:04 +0400 Subject: [PATCH] no more classNameInsertHandler extension --- .../completion/AllClassesGetter.java | 61 ++++++++----------- .../JavaClassNameCompletionContributor.java | 32 +++++++++- .../JavaClassNameInsertHandler.java | 44 ------------- .../completion/JavaCompletionContributor.java | 2 +- .../completion/JavaCompletionUtil.java | 39 ++++++------ plugins/groovy/src/META-INF/plugin.xml | 1 - .../GroovyClassNameInsertHandler.java | 22 +++---- .../GroovyCompletionContributor.java | 59 +++++++++++------- .../lang/completion/GroovyCompletionUtil.java | 13 +++- resources/src/META-INF/IdeaPlugin.xml | 2 - 10 files changed, 132 insertions(+), 143 deletions(-) delete mode 100644 java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java index 257bddd6d07a..91d283bba58d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java @@ -16,8 +16,6 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.CodeInsightUtilBase; -import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.lang.LanguageExtension; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -45,7 +43,7 @@ import java.util.Set; */ public class AllClassesGetter { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.AllClassesGetter"); - private static final InsertHandler INSERT_HANDLER = new InsertHandler() { + public static final InsertHandler TRY_SHORTENING = new InsertHandler() { private void _handleInsert(final InsertionContext context, final JavaPsiClassReferenceElement item) { final Editor editor = context.getEditor(); @@ -65,11 +63,6 @@ public class AllClassesGetter { final OffsetKey key = OffsetKey.create("endOffset", false); context.getOffsetMap().addOffset(key, endOffset); - ClassNameInsertHandler handler = ClassNameInsertHandler.EP_NAME.forLanguage(file.getLanguage()); - ClassNameInsertHandlerResult checkReference = ClassNameInsertHandlerResult.CHECK_FOR_CORRECT_REFERENCE; - if (handler != null) { - checkReference = handler.handleInsert(context, item); - } PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(); final int newOffset = context.getOffsetMap().getOffset(key); @@ -84,8 +77,8 @@ public class AllClassesGetter { psiDocumentManager.commitAllDocuments(); PsiReference psiReference = file.findReferenceAt(endOffset - 1); - boolean insertFqn=checkReference!=ClassNameInsertHandlerResult.REFERENCE_CORRECTED; - if (checkReference == ClassNameInsertHandlerResult.CHECK_FOR_CORRECT_REFERENCE && psiReference != null) { + boolean insertFqn = true; + if (psiReference != null) { final PsiManager psiManager = file.getManager(); if (psiManager.areElementsEquivalent(psiClass, JavaCompletionUtil.resolveReference(psiReference))) { insertFqn = false; @@ -99,7 +92,6 @@ public class AllClassesGetter { for (final PsiReference reference : psiElement.getReferences()) { if (psiManager.areElementsEquivalent(psiClass, JavaCompletionUtil.resolveReference(reference))) { insertFqn = false; - endOffset = reference.getRangeInElement().getEndOffset() + reference.getElement().getTextRange().getStartOffset(); break; } } @@ -113,19 +105,11 @@ public class AllClassesGetter { } if (toDelete.isValid()) { document.deleteString(toDelete.getStartOffset(), toDelete.getEndOffset()); - if (insertFqn) { - endOffset = toDelete.getStartOffset(); - } + context.setTailOffset(toDelete.getStartOffset()); } if (insertFqn) { - int i = endOffset - 1; - while (i >= 0) { - final char ch = document.getCharsSequence().charAt(i); - if (!Character.isJavaIdentifierPart(ch) && ch != '.') break; - i--; - } - document.replaceString(i + 1, endOffset, qname); + INSERT_FQN.handleInsert(context, item); } } @@ -136,6 +120,22 @@ public class AllClassesGetter { }; + public static final InsertHandler INSERT_FQN = new InsertHandler() { + @Override + public void handleInsert(InsertionContext context, JavaPsiClassReferenceElement item) { + final String qName = item.getQualifiedName(); + if (qName != null) { + int start = context.getTailOffset() - 1; + while (start >= 0) { + final char ch = context.getDocument().getCharsSequence().charAt(start); + if (!Character.isJavaIdentifierPart(ch) && ch != '.') break; + start--; + } + context.getDocument().replaceString(start + 1, context.getTailOffset(), qName); + } + } + }; + public static void processJavaClasses(CompletionParameters parameters, final PrefixMatcher prefixMatcher, final boolean filterByScope, final Consumer consumer) { @@ -194,20 +194,11 @@ public class AllClassesGetter { return false; } - public static LookupElement createLookupItem(@NotNull final PsiClass psiClass) { - return new JavaPsiClassReferenceElement(psiClass).setInsertHandler(INSERT_HANDLER); - } - - - public interface ClassNameInsertHandler { - LanguageExtension EP_NAME = - new LanguageExtension("com.intellij.classNameInsertHandler"); - - ClassNameInsertHandlerResult handleInsert(InsertionContext context, JavaPsiClassReferenceElement item); - } - - public enum ClassNameInsertHandlerResult { - INSERT_FQN, REFERENCE_CORRECTED, CHECK_FOR_CORRECT_REFERENCE + public static JavaPsiClassReferenceElement createLookupItem(@NotNull final PsiClass psiClass, + final InsertHandler insertHandler) { + final JavaPsiClassReferenceElement item = new JavaPsiClassReferenceElement(psiClass); + item.setInsertHandler(insertHandler); + return item; } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java index 978cefc6d1ef..bbae78db3d13 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.ExpectedTypesProvider; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.lang.LangBundle; import com.intellij.lang.StdLanguages; import com.intellij.openapi.actionSystem.IdeActions; @@ -69,19 +70,20 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { TrueFilter.INSTANCE; + final boolean inJavaContext = parameters.getPosition() instanceof PsiIdentifier; if (AFTER_NEW.accepts(insertedElement)) { final PsiExpression expr = PsiTreeUtil.getContextOfType(insertedElement, PsiExpression.class, true); for (final ExpectedTypeInfo info : ExpectedTypesProvider.getExpectedTypes(expr, true)) { final PsiType type = info.getType(); final PsiClass psiClass = PsiUtil.resolveClassInType(type); if (psiClass != null) { - result.addElement(AllClassesGetter.createLookupItem(psiClass)); + result.addElement(createClassLookupItem(psiClass, inJavaContext)); } final PsiType defaultType = info.getDefaultType(); if (!defaultType.equals(type)) { final PsiClass defClass = PsiUtil.resolveClassInType(defaultType); if (defClass != null) { - result.addElement(AllClassesGetter.createLookupItem(defClass)); + result.addElement(createClassLookupItem(defClass, inJavaContext)); } } } @@ -95,7 +97,7 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { if (lookingForAnnotations && !psiClass.isAnnotationType()) return; if (filter.isAcceptable(psiClass, insertedElement)) { - result.addElement(AllClassesGetter.createLookupItem(psiClass)); + result.addElement(createClassLookupItem(psiClass, inJavaContext)); } } }); @@ -104,6 +106,30 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } + public static LookupElement createClassLookupItem(final PsiClass psiClass, final boolean inJavaContext) { + if (inJavaContext) { + return AllClassesGetter.createLookupItem(psiClass, new InsertHandler() { + @Override + public void handleInsert(InsertionContext context, JavaPsiClassReferenceElement item) { + context.setAddCompletionChar(false); + int offset = context.getTailOffset() - 1; + final PsiFile file = context.getFile(); + if (PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiImportStatementBase.class, false) != null) { + final PsiJavaCodeReferenceElement ref = PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiJavaCodeReferenceElement.class, false); + final String qname = item.getQualifiedName(); + if (qname != null && (ref == null || !qname.equals(ref.getCanonicalText()))) { + AllClassesGetter.INSERT_FQN.handleInsert(context, item); + } + return; + } + + JavaPsiClassReferenceElement.JAVA_CLASS_INSERT_HANDLER.handleInsert(context, item); + } + }); + } + return AllClassesGetter.createLookupItem(psiClass, AllClassesGetter.TRY_SHORTENING); + } + @Override public String handleEmptyLookup(@NotNull final CompletionParameters parameters, final Editor editor) { if (!(parameters.getOriginalFile() instanceof PsiJavaFile)) return null; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java deleted file mode 100644 index 9cd67d4c1ba5..000000000000 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000-2010 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.codeInsight.completion; - -import com.intellij.lang.StdLanguages; -import com.intellij.openapi.editor.Editor; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiImportStatementBase; -import com.intellij.psi.util.PsiTreeUtil; - -/** -* @author Maxim.Medvedev -*/ -public class JavaClassNameInsertHandler implements AllClassesGetter.ClassNameInsertHandler { - public AllClassesGetter.ClassNameInsertHandlerResult handleInsert(InsertionContext context, - JavaPsiClassReferenceElement item) { - context.setAddCompletionChar(false); - Editor editor = context.getEditor(); - PsiFile file = context.getFile(); - int endOffset = editor.getCaretModel().getOffset(); - if (file.getLanguage() == StdLanguages.JAVA) { - if (PsiTreeUtil.findElementOfClassAtOffset(file, endOffset - 1, PsiImportStatementBase.class, false) != null) { - return AllClassesGetter.ClassNameInsertHandlerResult.INSERT_FQN; - } - else { - JavaPsiClassReferenceElement.JAVA_CLASS_INSERT_HANDLER.handleInsert(context, item); - } - } - return AllClassesGetter.ClassNameInsertHandlerResult.CHECK_FOR_CORRECT_REFERENCE; - } -} diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index f3da5f0c4388..08ebd46db82e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -244,7 +244,7 @@ public class JavaCompletionContributor extends CompletionContributor { result.addElement((LookupElement)completion); } else if (completion instanceof PsiClass) { - result.addElement(AllClassesGetter.createLookupItem((PsiClass)completion)); + result.addElement(JavaClassNameCompletionContributor.createClassLookupItem((PsiClass)completion, true)); } else { result.addElement(LookupItemUtil.objectToLookupItem(completion)); 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 6668b1b7444b..94390d7655eb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -24,8 +24,6 @@ import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.codeInsight.guess.GuessManager; import com.intellij.codeInsight.lookup.*; import com.intellij.featureStatistics.FeatureUsageTracker; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -1103,15 +1101,10 @@ public class JavaCompletionUtil { } public static int insertClassReference(PsiClass psiClass, PsiFile file, int startOffset, int endOffset) { - PsiDocumentManager.getInstance(file.getProject()).commitAllDocuments(); - if (!psiClass.isValid()) { - return startOffset; - } + final Project project = file.getProject(); + PsiDocumentManager.getInstance(project).commitAllDocuments(); - SmartPsiElementPointer pointer = SmartPointerManager.getInstance(file.getProject()).createSmartPsiElementPointer(psiClass); - LOG.assertTrue(CommandProcessor.getInstance().getCurrentCommand() != null); - LOG.assertTrue( - ApplicationManager.getApplication().isUnitTestMode() || ApplicationManager.getApplication().getCurrentWriteAction(null) != null); + SmartPsiElementPointer pointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(psiClass); final PsiManager manager = file.getManager(); @@ -1132,7 +1125,7 @@ public class JavaCompletionUtil { final RangeMarker toDelete = insertSpace(startOffset + name.length(), document); - PsiDocumentManager.getInstance(manager.getProject()).commitAllDocuments(); + PsiDocumentManager.getInstance(project).commitAllDocuments(); int newStartOffset = startOffset; PsiElement element = file.findElementAt(startOffset); @@ -1144,16 +1137,24 @@ public class JavaCompletionUtil { if (!psiClass.getManager().areElementsEquivalent(psiClass, resolveReference(ref))) { final PsiElement pointerElement = pointer.getElement(); if (pointerElement instanceof PsiClass) { - PsiElement newElement; - if (!(ref instanceof PsiImportStaticReferenceElement)) { - newElement = ref.bindToElement(pointerElement); - } - else { - newElement = ((PsiImportStaticReferenceElement)ref).bindToTargetClass((PsiClass)pointerElement); - } + final boolean staticImport = ref instanceof PsiImportStaticReferenceElement; + PsiElement newElement = staticImport + ? ((PsiImportStaticReferenceElement)ref).bindToTargetClass((PsiClass)pointerElement) + : ref.bindToElement(pointerElement); + RangeMarker marker = document.createRangeMarker(newElement.getTextRange()); - CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(newElement); + newElement = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(newElement); newStartOffset = marker.getStartOffset(); + + if (!staticImport && + newElement instanceof PsiJavaCodeReferenceElement && + !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference((PsiReference)newElement))) { + final String qName = psiClass.getQualifiedName(); + if (qName != null) { + document.replaceString(newStartOffset, newElement.getTextRange().getEndOffset(), qName); + } + } + } } } diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index c32179815c39..5317e818d12e 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -178,7 +178,6 @@ - diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java index 3851dd7af43c..ebc9a5cf6d2d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java @@ -15,10 +15,7 @@ */ package org.jetbrains.plugins.groovy.lang.completion; -import com.intellij.codeInsight.completion.AllClassesGetter; -import com.intellij.codeInsight.completion.InsertionContext; -import com.intellij.codeInsight.completion.JavaCompletionUtil; -import com.intellij.codeInsight.completion.JavaPsiClassReferenceElement; +import com.intellij.codeInsight.completion.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; @@ -34,14 +31,16 @@ import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatem /** * @author Maxim.Medvedev */ -public class GroovyClassNameInsertHandler implements AllClassesGetter.ClassNameInsertHandler { - public AllClassesGetter.ClassNameInsertHandlerResult handleInsert(InsertionContext context, JavaPsiClassReferenceElement item) { +public class GroovyClassNameInsertHandler implements InsertHandler { + @Override + public void handleInsert(InsertionContext context, JavaPsiClassReferenceElement item) { PsiFile file = context.getFile(); assert GroovyFileType.GROOVY_LANGUAGE.equals(file.getLanguage()); Editor editor = context.getEditor(); int endOffset = editor.getCaretModel().getOffset(); if (PsiTreeUtil.findElementOfClassAtOffset(file, endOffset - 1, GrImportStatement.class, false) != null) { - return AllClassesGetter.ClassNameInsertHandlerResult.INSERT_FQN; + AllClassesGetter.INSERT_FQN.handleInsert(context, item); + return; } PsiElement position = file.findElementAt(endOffset - 1); @@ -52,23 +51,22 @@ public class GroovyClassNameInsertHandler implements AllClassesGetter.ClassNameI if (isInVariable(position) || GroovyCompletionContributor.isInClosurePropertyParameters(position)) { Project project = context.getProject(); PsiClass psiClass = item.getObject(); - if (!psiClass.isValid()) return AllClassesGetter.ClassNameInsertHandlerResult.CHECK_FOR_CORRECT_REFERENCE; String qname = psiClass.getQualifiedName(); String shortName = psiClass.getName(); - if (qname == null) return AllClassesGetter.ClassNameInsertHandlerResult.CHECK_FOR_CORRECT_REFERENCE; + if (qname == null) return; PsiClass aClass = JavaPsiFacade.getInstance(project).getResolveHelper().resolveReferencedClass(shortName, position); if (aClass == null) { ((GroovyFileBase)file).addImportForClass(psiClass); GroovyInsertHandler.INSTANCE.handleInsert(context, item); - return AllClassesGetter.ClassNameInsertHandlerResult.REFERENCE_CORRECTED; + return; } else if (aClass == psiClass) { GroovyInsertHandler.INSTANCE.handleInsert(context, item); - return AllClassesGetter.ClassNameInsertHandlerResult.REFERENCE_CORRECTED; + return; } } - return AllClassesGetter.ClassNameInsertHandlerResult.CHECK_FOR_CORRECT_REFERENCE; + AllClassesGetter.TRY_SHORTENING.handleInsert(context, item); } private static boolean isInVariable(PsiElement position) { 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 5cac92a1ca8e..7c07eec238fc 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 @@ -227,7 +227,7 @@ public class GroovyCompletionContributor extends CompletionContributor { ((GrReferenceElement)reference).processVariants(new Consumer() { public void consume(Object element) { final LookupElement lookupElement = element instanceof PsiClass - ? AllClassesGetter.createLookupItem((PsiClass)element) + ? GroovyCompletionUtil.createClassLookupItem((PsiClass)element) : GroovyCompletionUtil.getLookupElement(element); final Object object = lookupElement.getObject(); if ((object instanceof PsiMethod || object instanceof PsiField) && ((PsiModifierListOwner)object).hasModifierProperty(PsiModifier.STATIC)) { @@ -358,29 +358,9 @@ public class GroovyCompletionContributor extends CompletionContributor { extend(CompletionType.BASIC, IN_ARGUMENT_LIST_OF_CALL, MAP_ARGUMENT_COMPLETION_PROVIDER); extend(CompletionType.BASIC, IN_MAP_KEY_ARGUMENT_LIST_OF_CALL, MAP_ARGUMENT_COMPLETION_PROVIDER); - extend(CompletionType.BASIC, 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; + // class name stuff - final String s = result.getPrefixMatcher().getPrefix(); - if (StringUtil.isEmpty(s) || !Character.isUpperCase(s.charAt(0))) return; - - result.runRemainingContributors( - new CompletionParameters(parameters.getPosition(), parameters.getOriginalFile(), CompletionType.CLASS_NAME, - parameters.getOffset(), - parameters.getInvocationCount()), new Consumer() { - @Override - public void consume(LookupElement lookupElement) { - result.addElement(lookupElement); - } - }); - } - }); - extend(CompletionType.CLASS_NAME, psiElement().withParent(GrReferenceElement.class), new CompletionProvider(false) { + extend(CompletionType.CLASS_NAME, psiElement().withParent(GrReferenceElement.class), new CompletionProvider() { @Override protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @@ -394,6 +374,39 @@ public class GroovyCompletionContributor extends CompletionContributor { completeStaticMembers(position).processStaticMethodsGlobally(result); } }); + + + final CompletionProvider classNameProvider = new CompletionProvider() { + @Override + protected void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull final CompletionResultSet result) { + result.stopHere(); + AllClassesGetter + .processJavaClasses(parameters, result.getPrefixMatcher(), parameters.getInvocationCount() <= 1, new Consumer() { + @Override + public void consume(PsiClass psiClass) { + result.addElement(GroovyCompletionUtil.createClassLookupItem(psiClass)); + } + }); + } + }; + extend(CompletionType.CLASS_NAME, psiElement(), classNameProvider); + + extend(CompletionType.BASIC, psiElement().withParent(GrReferenceElement.class), new CompletionProvider() { + @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.isUpperCase(s.charAt(0))) return; + + classNameProvider.addCompletionVariants(parameters, context, result); + } + }); } private static StaticMemberProcessor completeStaticMembers(PsiElement position) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java index ed3c92ea2004..c46b1b737a53 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java @@ -18,8 +18,7 @@ package org.jetbrains.plugins.groovy.lang.completion; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.TailType; -import com.intellij.codeInsight.completion.AllClassesGetter; -import com.intellij.codeInsight.completion.JavaCompletionUtil; +import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.lookup.LookupItem; @@ -29,6 +28,7 @@ import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -37,15 +37,18 @@ import com.intellij.psi.impl.light.LightMethodBuilder; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.PsiFormatUtil; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.CollectionFactory; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.GroovyIcons; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; +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.statements.GrVariable; @@ -233,7 +236,7 @@ public class GroovyCompletionUtil { continue; } if (element instanceof PsiClass) { - result.add(AllClassesGetter.createLookupItem((PsiClass)element)); + result.add(createClassLookupItem((PsiClass)element)); continue; } @@ -247,6 +250,10 @@ public class GroovyCompletionUtil { return result; } + public static LookupElement createClassLookupItem(PsiClass psiClass) { + return AllClassesGetter.createLookupItem(psiClass, new GroovyClassNameInsertHandler()); + } + private static LookupElementBuilder generateLookupForImportedElement(GroovyResolveResult resolveResult, String importedName) { final PsiElement element = resolveResult.getElement(); assert element != null; diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 47f8e618d802..7d2f237de420 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -169,7 +169,6 @@ - @@ -257,7 +256,6 @@ order="last, before javaSmart"/> -