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 7f819c5360fb..053fc7220065 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -517,7 +517,7 @@ public class JavaCompletionUtil { } private static LookupElement highlight(LookupElement decorator) { - return PrioritizedLookupElement.withGrouping( + return PrioritizedLookupElement.withExplicitProximity( LookupElementDecorator.withRenderer(decorator, new LookupElementRenderer>() { @Override public void renderElement(LookupElementDecorator element, LookupElementPresentation presentation) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy similarity index 60% rename from java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java rename to java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy index 0d2b8a818fd8..a6cb81097e7a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy @@ -2,24 +2,24 @@ * Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved. * Use is subject to license terms. */ -package com.intellij.codeInsight.completion; - -import com.intellij.JavaTestUtil; -import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.codeInsight.lookup.LookupManager; -import com.intellij.codeInsight.lookup.impl.LookupImpl; -import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.module.StdModuleTypes; -import com.intellij.openapi.roots.ContentEntry; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.SourceFolder; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.testFramework.PsiTestUtil; -import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; - +package com.intellij.codeInsight.completion +import com.intellij.JavaTestUtil +import com.intellij.codeInsight.lookup.LookupElement +import com.intellij.codeInsight.lookup.LookupManager +import com.intellij.codeInsight.lookup.impl.LookupImpl +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ex.PathManagerEx +import com.intellij.openapi.module.StdModuleTypes +import com.intellij.openapi.roots.ContentEntry +import com.intellij.openapi.roots.ModifiableRootModel +import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.roots.SourceFolder +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.testFramework.PsiTestUtil +import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase /** * @author peter */ @@ -32,14 +32,11 @@ public class HeavyNormalCompletionTest extends JavaCodeInsightFixtureTestCase { public void testPackagePrefix() throws Throwable { myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java"); - new WriteCommandAction.Simple(getProject()) { - @Override - protected void run() throws Throwable { - final ModifiableRootModel model = ModuleRootManager.getInstance(myFixture.getModule()).getModifiableModel(); - model.getContentEntries()[0].getSourceFolders()[0].setPackagePrefix("foo.bar.goo"); - model.commit(); - } - }.execute().throwException(); + ApplicationManager.application.runWriteAction { + final ModifiableRootModel model = ModuleRootManager.getInstance(myFixture.getModule()).getModifiableModel(); + model.getContentEntries()[0].getSourceFolders()[0].setPackagePrefix("foo.bar.goo"); + model.commit(); + } myFixture.completeBasic(); myFixture.checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + "_after.java"); @@ -50,18 +47,15 @@ public class HeavyNormalCompletionTest extends JavaCodeInsightFixtureTestCase { public void testPreferTestCases() throws Throwable { myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java"); - new WriteCommandAction.Simple(getProject()) { - @Override - protected void run() throws Throwable { - final ModifiableRootModel model = ModuleRootManager.getInstance(myFixture.getModule()).getModifiableModel(); - ContentEntry contentEntry = model.getContentEntries()[0]; - SourceFolder sourceFolder = contentEntry.getSourceFolders()[0]; - VirtualFile file = sourceFolder.getFile(); - contentEntry.removeSourceFolder(sourceFolder); - contentEntry.addSourceFolder(file, true); - model.commit(); - } - }.execute().throwException(); + ApplicationManager.application.runWriteAction { + final ModifiableRootModel model = ModuleRootManager.getInstance(myFixture.getModule()).getModifiableModel(); + ContentEntry contentEntry = model.getContentEntries()[0]; + SourceFolder sourceFolder = contentEntry.getSourceFolders()[0]; + VirtualFile file = sourceFolder.getFile(); + contentEntry.removeSourceFolder(sourceFolder); + contentEntry.addSourceFolder(file, true); + model.commit(); + } myFixture.addClass("package foo; public class SomeTestCase {}"); myFixture.addClass("package bar; public class SomeTestec {}"); @@ -110,4 +104,24 @@ public class HeavyNormalCompletionTest extends JavaCodeInsightFixtureTestCase { myFixture.checkResult("class Main { foo.bar.AxBxCxDxEx }"); } + public void testPreferOwnMethods() { + def lib = LocalFileSystem.getInstance().refreshAndFindFileByPath(PathManagerEx.getTestDataPath() + "/../../../lib") + def nanoJar = lib.children.find { it.name.startsWith("nanoxml") } + + PsiTestUtil.addLibrary(myModule, 'nano1', lib.path, ["/$nanoJar.name!/"] as String[], [] as String[]) + + assert JavaPsiFacade.getInstance(project).findClass('net.n3.nanoxml.StdXMLParser', GlobalSearchScope.allScope(project)) + + myFixture.configureByText "a.java", """ +public class Test { + void method(net.n3.nanoxml.StdXMLParser f) { + f. + } +} +""" + myFixture.completeBasic() + myFixture.assertPreferredCompletionItems 0, 'getBuilder' + } + + } diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java b/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java index 3a801015849c..7261a657c9a3 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java @@ -31,11 +31,17 @@ public class PrioritizedLookupElement extends LookupEle public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(PrioritizedLookupElement.class); private final double myPriority; private final int myGrouping; + private final int myExplicitProximity; - public PrioritizedLookupElement(T delegate, double priority, int grouping) { + private PrioritizedLookupElement(T delegate, double priority, int grouping) { + this(delegate, priority, grouping, 0); + } + + private PrioritizedLookupElement(T delegate, double priority, int grouping, int explicitProximity) { super(delegate); myPriority = priority; myGrouping = grouping; + myExplicitProximity = explicitProximity; } public double getPriority() { @@ -46,6 +52,10 @@ public class PrioritizedLookupElement extends LookupEle return myGrouping; } + public int getExplicitProximity() { + return myExplicitProximity; + } + public static LookupElement withPriority(LookupElement element, double priority) { final PrioritizedLookupElement prioritized = element.as(CLASS_CONDITION_KEY); return new PrioritizedLookupElement(element, priority, prioritized == null ? 0 : prioritized.getGrouping()); @@ -55,4 +65,11 @@ public class PrioritizedLookupElement extends LookupEle final PrioritizedLookupElement prioritized = element.as(CLASS_CONDITION_KEY); return new PrioritizedLookupElement(element, prioritized == null ? 0 : prioritized.getPriority(), grouping); } + + public static LookupElement withExplicitProximity(LookupElement element, int explicitProximity) { + final PrioritizedLookupElement prioritized = element.as(CLASS_CONDITION_KEY); + double priority = prioritized == null ? 0 : prioritized.getPriority(); + int grouping = prioritized == null ? 0 : prioritized.getGrouping(); + return new PrioritizedLookupElement(element, priority, grouping, explicitProximity); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/ExplicitProximityWeigher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/ExplicitProximityWeigher.java new file mode 100644 index 000000000000..42700912422b --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/ExplicitProximityWeigher.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2013 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.codeInsight.lookup.LookupElement; +import org.jetbrains.annotations.NotNull; + +/** + * @author peter +*/ +public class ExplicitProximityWeigher extends CompletionWeigher { + + @Override + public Integer weigh(@NotNull final LookupElement item, @NotNull final CompletionLocation location) { + PrioritizedLookupElement prioritized = item.as(PrioritizedLookupElement.CLASS_CONDITION_KEY); + return prioritized != null ? prioritized.getExplicitProximity() : 0; + } +} diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 060290a71f2e..7b4d37ede6f0 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -469,15 +469,17 @@ - - - - - + + + + + +