correctType in completion (IDEA-150050)

This commit is contained in:
peter
2016-01-28 16:30:04 +01:00
parent f623ac8ede
commit eca755dcbd
3 changed files with 43 additions and 28 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<module relativePaths="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
@@ -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<CompletionParameter
final ExpectedTypeInfo[] infos = JavaSmartCompletionContributor.getExpectedTypes(parameters);
final List<ExpectedTypeInfo> infoCollection = Arrays.asList(infos);
generateVariants(parameters, result.getPrefixMatcher(), infos, new Consumer<LookupElement>() {
@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<LookupElement> consumer) {
@@ -84,13 +83,10 @@ public class JavaInheritorsGetter extends CompletionProvider<CompletionParameter
addArrayTypes(parameters.getPosition(), infos, consumer);
processInheritors(parameters, extractClassTypes(infos), prefixMatcher, new Consumer<PsiType>() {
@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<CompletionParameter
}
private static List<PsiClassType> extractClassTypes(ExpectedTypeInfo[] infos) {
final List<PsiClassType> expectedClassTypes = new SmartList<PsiClassType>();
final List<PsiClassType> 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<CompletionParameter
final PsiClass aClass = PsiUtil.resolveClassInType(expectedType);
if (aClass != null) {
final PsiClassType inferredArg = JavaPsiFacade.getElementFactory(method.getProject()).createType(aClass, types);
LOG.assertTrue(expectedType != null);
return TypeConversionUtil.isAssignable(expectedType, inferredArg);
}
}
@@ -219,17 +214,14 @@ public class JavaInheritorsGetter extends CompletionProvider<CompletionParameter
}
public static void processInheritors(final CompletionParameters parameters,
final Collection<PsiClassType> expectedClassTypes,
Collection<PsiClassType> expectedClassTypes,
final PrefixMatcher matcher, final Consumer<PsiType> 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<PsiClassType> expectedClassTypes,
final PrefixMatcher matcher, final Consumer<PsiType> consumer) {
//quick
if (!processMostProbableInheritors(file, context, expectedClassTypes, consumer)) return;
if (!processMostProbableInheritors(parameters.getOriginalFile(), context, expectedClassTypes, consumer)) return;
//long
for (final PsiClassType type : expectedClassTypes) {
@@ -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<caret> }}
}
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 <caret>); }}'
myFixture.complete(CompletionType.SMART)
myFixture.assertPreferredCompletionItems 0, 'Runnable', 'Thread'
myFixture.type('\n')
myFixture.configureByText 'b.java', 'class Usage {{ Decl.method(new <caret>); }}'
myFixture.complete(CompletionType.SMART)
myFixture.assertPreferredCompletionItems 0, 'Runnable', 'Thread'
myFixture.type('\n')
}
}