From 9d7e6600d4bf549990a2813de46a45d4181b364f Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 26 Aug 2015 13:50:44 +0300 Subject: [PATCH] Got rid of allKotlinClasses() method --- .../jvm/TopDownAnalyzerFacadeForJVM.java | 16 +++++----- .../kotlin/platform/JavaToKotlinClassMap.java | 22 -------------- .../idea/completion/AllClassesCompletion.kt | 30 ++++++++++++------- .../basic/common/NestedBuiltInClass.kt | 4 +++ .../test/JSBasicCompletionTestGenerated.java | 6 ++++ .../test/JvmBasicCompletionTestGenerated.java | 6 ++++ 6 files changed, 43 insertions(+), 41 deletions(-) create mode 100644 idea/idea-completion/testData/basic/common/NestedBuiltInClass.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index a48214c2def..217e85dccef 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.context.ModuleContext; import org.jetbrains.kotlin.context.MutableModuleContext; -import org.jetbrains.kotlin.descriptors.ClassDescriptor; +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.descriptors.ModuleParameters; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker; import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents; -import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.platform.JavaToKotlinClassMap; import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap; @@ -42,6 +41,8 @@ import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.resolve.*; import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension; import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; +import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; +import org.jetbrains.kotlin.resolve.scopes.JetScope; import java.util.ArrayList; import java.util.Collection; @@ -62,13 +63,12 @@ public enum TopDownAnalyzerFacadeForJVM { list.add(new ImportPath("kotlin.annotation.*")); list.add(new ImportPath("kotlin.jvm.*")); list.add(new ImportPath("kotlin.io.*")); - // all classes from package "kotlin" mapped to java classes are imported explicitly so that they take priority over classes from java.lang - for (ClassDescriptor descriptor : JavaToKotlinClassMap.INSTANCE.allKotlinClasses()) { - FqName fqName = DescriptorUtils.getFqNameSafe(descriptor); - if (fqName.parent().equals(new FqName("kotlin"))) { - list.add(new ImportPath(fqName, false)); - } + + JetScope builtInsScope = KotlinBuiltIns.getInstance().getBuiltInsPackageScope(); + for (DeclarationDescriptor descriptor : builtInsScope.getDescriptors(DescriptorKindFilter.CLASSIFIERS, JetScope.ALL_NAME_FILTER)) { + list.add(new ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false)); } + return list; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java index f74ab9091d4..f513fea8a00 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java @@ -20,7 +20,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.CompanionObjectMapping; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; -import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.name.ClassId; @@ -215,25 +214,4 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { } return mutable; } - - // TODO: get rid of this method, it's unclear what it does - @NotNull - public List allKotlinClasses() { - KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); - - List result = new ArrayList(); - result.addAll(javaToKotlin.values()); - result.addAll(readOnlyToMutable.values()); - - for (PrimitiveType type : PrimitiveType.values()) { - result.add(builtIns.getPrimitiveArrayClassDescriptor(type)); - } - - result.add(builtIns.getArray()); - - result.add(builtIns.getUnit()); - result.add(builtIns.getNothing()); - - return result; - } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt index f1373f02ffb..59b532348af 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt @@ -20,29 +20,25 @@ import com.intellij.codeInsight.completion.AllClassesGetter import com.intellij.codeInsight.completion.CompletionParameters import com.intellij.codeInsight.completion.PrefixMatcher import com.intellij.psi.PsiClass -import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.asJava.KotlinLightClass +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.project.ProjectStructureUtil -import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.psi.JetFile -import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter +import org.jetbrains.kotlin.resolve.scopes.JetScope +import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered class AllClassesCompletion(private val parameters: CompletionParameters, private val kotlinIndicesHelper: KotlinIndicesHelper, private val prefixMatcher: PrefixMatcher, - private val kindFilter: (ClassKind) -> Boolean) { + private val kindFilter: (ClassKind) -> Boolean +) { fun collect(classDescriptorCollector: (ClassDescriptor) -> Unit, javaClassCollector: (PsiClass) -> Unit) { //TODO: this is a temporary hack until we have built-ins in indices - val builtIns = JavaToKotlinClassMap.INSTANCE.allKotlinClasses() - val filteredBuiltIns = builtIns - .filter { kindFilter(it.getKind()) && prefixMatcher.prefixMatches(it.getName().asString()) } - filteredBuiltIns.forEach { classDescriptorCollector(it) } + collectClassesFromScope(classDescriptorCollector, KotlinBuiltIns.getInstance().builtInsPackageScope) kotlinIndicesHelper .getKotlinClasses({ prefixMatcher.prefixMatches(it) }, kindFilter) @@ -53,6 +49,18 @@ class AllClassesCompletion(private val parameters: CompletionParameters, } } + private fun collectClassesFromScope(collector: (ClassDescriptor) -> Unit, scope: JetScope) { + for (descriptor in scope.getDescriptorsFiltered(DescriptorKindFilter.CLASSIFIERS)) { + if (descriptor is ClassDescriptor) { + if (kindFilter(descriptor.kind) && prefixMatcher.prefixMatches(descriptor.name.asString())) { + collector(descriptor) + } + + collectClassesFromScope(collector, descriptor.unsubstitutedInnerClassesScope) + } + } + } + private fun addAdaptedJavaCompletion(collector: (PsiClass) -> Unit) { AllClassesGetter.processJavaClasses(parameters, prefixMatcher, true, { psiClass -> if (psiClass!! !is KotlinLightClass) { // Kotlin class should have already been added as kotlin element before diff --git a/idea/idea-completion/testData/basic/common/NestedBuiltInClass.kt b/idea/idea-completion/testData/basic/common/NestedBuiltInClass.kt new file mode 100644 index 00000000000..39763e50d38 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/NestedBuiltInClass.kt @@ -0,0 +1,4 @@ +val v: Mutable + +// INVOCATION_COUNT: 2 +// EXIST: MutableEntry \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index ca03737001c..4d0d6628f4a 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -469,6 +469,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("NestedBuiltInClass.kt") + public void testNestedBuiltInClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NestedBuiltInClass.kt"); + doTest(fileName); + } + @TestMetadata("NestedClassBug.kt") public void testNestedClassBug() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NestedClassBug.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index 849c5a8517a..14fb8fb179d 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -469,6 +469,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("NestedBuiltInClass.kt") + public void testNestedBuiltInClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NestedBuiltInClass.kt"); + doTest(fileName); + } + @TestMetadata("NestedClassBug.kt") public void testNestedClassBug() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NestedClassBug.kt");