mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
correctType in completion (IDEA-150050)
This commit is contained in:
@@ -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) {
|
||||
|
||||
+27
-4
@@ -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')
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user