From eca755dcbdcaccfd064e6dbd8ab00d1437efa6aa Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 28 Jan 2016 15:47:05 +0100 Subject: [PATCH] correctType in completion (IDEA-150050) --- java/java-impl/java-impl.iml | 2 +- .../completion/JavaInheritorsGetter.java | 38 ++++++++----------- .../HeavyNormalCompletionTest.groovy | 31 +++++++++++++-- 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/java/java-impl/java-impl.iml b/java/java-impl/java-impl.iml index eb22a86d630c..3a2e9d845261 100644 --- a/java/java-impl/java-impl.iml +++ b/java/java-impl/java-impl.iml @@ -1,6 +1,6 @@ - + diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java index cceb1668a231..22bbe113448c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java @@ -26,7 +26,9 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.filters.getters.ExpectedTypesGetter; +import com.intellij.psi.impl.PsiClassImplUtil; import com.intellij.psi.impl.source.PsiClassReferenceType; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.statistics.JavaStatisticsManager; import com.intellij.psi.statistics.StatisticsInfo; import com.intellij.psi.statistics.StatisticsManager; @@ -34,6 +36,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.*; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -67,12 +70,8 @@ public class JavaInheritorsGetter extends CompletionProvider infoCollection = Arrays.asList(infos); - generateVariants(parameters, result.getPrefixMatcher(), infos, new Consumer() { - @Override - public void consume(LookupElement lookupElement) { - result.addElement(JavaSmartCompletionContributor.decorate(lookupElement, infoCollection)); - } - }); + generateVariants(parameters, result.getPrefixMatcher(), infos, + lookupElement -> result.addElement(JavaSmartCompletionContributor.decorate(lookupElement, infoCollection))); } public void generateVariants(final CompletionParameters parameters, final PrefixMatcher prefixMatcher, final Consumer consumer) { @@ -84,13 +83,10 @@ public class JavaInheritorsGetter extends CompletionProvider() { - @Override - public void consume(final PsiType type) { - final LookupElement element = addExpectedType(type, parameters); - if (element != null) { - consumer.consume(element); - } + processInheritors(parameters, extractClassTypes(infos), prefixMatcher, type -> { + final LookupElement element = addExpectedType(type, parameters); + if (element != null) { + consumer.consume(element); } }); } @@ -116,7 +112,7 @@ public class JavaInheritorsGetter extends CompletionProvider extractClassTypes(ExpectedTypeInfo[] infos) { - final List expectedClassTypes = new SmartList(); + final List expectedClassTypes = new SmartList<>(); for (PsiType type : ExpectedTypesGetter.extractTypes(infos, true)) { if (type instanceof PsiClassType) { final PsiClassType classType = (PsiClassType)type; @@ -205,7 +201,6 @@ public class JavaInheritorsGetter extends CompletionProvider expectedClassTypes, + Collection expectedClassTypes, final PrefixMatcher matcher, final Consumer consumer) { - processInheritors(parameters.getOriginalFile(), parameters.getPosition(), expectedClassTypes, matcher, consumer); - } + final PsiElement context = parameters.getPosition(); + GlobalSearchScope scope = context.getResolveScope(); + expectedClassTypes = ContainerUtil.mapNotNull(expectedClassTypes, type -> PsiClassImplUtil.correctType(type, scope)); - public static void processInheritors(final PsiFile file, - final PsiElement context, - final Collection expectedClassTypes, - final PrefixMatcher matcher, final Consumer consumer) { //quick - if (!processMostProbableInheritors(file, context, expectedClassTypes, consumer)) return; + if (!processMostProbableInheritors(parameters.getOriginalFile(), context, expectedClassTypes, consumer)) return; //long for (final PsiClassType type : expectedClassTypes) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy index 3852327e36e9..0bad51352f7c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.groovy @@ -3,6 +3,7 @@ * Use is subject to license terms. */ package com.intellij.codeInsight.completion + import com.intellij.JavaTestUtil import com.intellij.codeInsight.generation.OverrideImplementExploreUtil import com.intellij.codeInsight.lookup.LookupElement @@ -13,10 +14,7 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ex.PathManagerEx import com.intellij.openapi.extensions.LoadingOrder 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.roots.* import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VirtualFile import com.intellij.pom.java.LanguageLevel @@ -25,6 +23,8 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiManager import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.statistics.StatisticsManager +import com.intellij.psi.statistics.impl.StatisticsManagerImpl import com.intellij.psi.util.PsiTreeUtil import com.intellij.testFramework.IdeaTestUtil import com.intellij.testFramework.PsiTestUtil @@ -217,4 +217,27 @@ class Foo {{ Books.Test.v1 }} } + public void "test different jdks in different modules"() { + (StatisticsManager.instance as StatisticsManagerImpl).enableStatistics(testRootDisposable) + + def anotherModule = PsiTestUtil.addModule(project, StdModuleTypes.JAVA, 'another', myFixture.tempDirFixture.findOrCreateDir('another')) + ModuleRootModificationUtil.setModuleSdk(anotherModule, IdeaTestUtil.mockJdk17) + ModuleRootModificationUtil.setModuleSdk(myFixture.module, IdeaTestUtil.mockJdk14) + ModuleRootModificationUtil.addDependency(myFixture.module, anotherModule) + + myFixture.addFileToProject 'another/Decl.java', '''public class Decl { +public static void method(Runnable r) {} +} +''' + myFixture.configureByText 'a.java', 'class Usage {{ Decl.method(new ); }}' + myFixture.complete(CompletionType.SMART) + myFixture.assertPreferredCompletionItems 0, 'Runnable', 'Thread' + myFixture.type('\n') + + myFixture.configureByText 'b.java', 'class Usage {{ Decl.method(new ); }}' + myFixture.complete(CompletionType.SMART) + myFixture.assertPreferredCompletionItems 0, 'Runnable', 'Thread' + myFixture.type('\n') + } + }