Optimize top level class searching in LazyJavaPackageScope
Do not try to search something, that is known not to exist
This commit is contained in:
@@ -18,15 +18,22 @@ package org.jetbrains.kotlin.load.java;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.annotations.ReadOnly;
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass;
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaPackage;
|
||||
import org.jetbrains.kotlin.name.ClassId;
|
||||
import org.jetbrains.kotlin.name.FqName;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public interface JavaClassFinder {
|
||||
@Nullable
|
||||
JavaClass findClass(@NotNull ClassId classId);
|
||||
|
||||
@Nullable
|
||||
JavaPackage findPackage(@NotNull FqName fqName);
|
||||
|
||||
@ReadOnly
|
||||
@Nullable
|
||||
Set<String> knownClassNamesInPackage(@NotNull FqName packageFqName);
|
||||
}
|
||||
|
||||
+13
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.storage.NullableLazyValue
|
||||
import org.jetbrains.kotlin.storage.getValue
|
||||
|
||||
class LazyJavaPackageScope(
|
||||
@@ -38,6 +39,12 @@ class LazyJavaPackageScope(
|
||||
override val ownerDescriptor: LazyJavaPackageFragment
|
||||
) : LazyJavaStaticScope(c) {
|
||||
|
||||
// Null means that it's impossible to determine list of class names in package, i.e. in IDE where special finders exist
|
||||
// But for compiler though we can determine full list of class names by getting all class-file names in classpath and sources
|
||||
private val knownClassNamesInPackage: NullableLazyValue<Set<String>> = c.storageManager.createNullableLazyValue {
|
||||
c.components.finder.knownClassNamesInPackage(ownerDescriptor.fqName)
|
||||
}
|
||||
|
||||
private val partToFacade = c.storageManager.createLazyValue {
|
||||
val result = hashMapOf<String, String>()
|
||||
kotlinClasses@for (kotlinClass in ownerDescriptor.kotlinBinaryClasses) {
|
||||
@@ -88,6 +95,12 @@ class LazyJavaPackageScope(
|
||||
if (!SpecialNames.isSafeIdentifier(name)) return null
|
||||
|
||||
recordLookup(name, location)
|
||||
|
||||
val knownClassNamesInPackage = knownClassNamesInPackage()
|
||||
if (knownClassNamesInPackage != null && name.asString() !in knownClassNamesInPackage) {
|
||||
return null
|
||||
}
|
||||
|
||||
return classes(name)
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.kotlin
|
||||
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
interface KotlinClassFinder {
|
||||
fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass?
|
||||
|
||||
Reference in New Issue
Block a user