Got rid of allKotlinClasses() method

This commit is contained in:
Valentin Kipyatkov
2015-08-26 13:50:44 +03:00
parent 542fa34c2d
commit 9d7e6600d4
6 changed files with 43 additions and 41 deletions
@@ -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;
}
@@ -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<ClassDescriptor> allKotlinClasses() {
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>();
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;
}
}
@@ -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
@@ -0,0 +1,4 @@
val v: Mutable<caret>
// INVOCATION_COUNT: 2
// EXIST: MutableEntry
@@ -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");
@@ -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");