Optimize top level class searching in LazyJavaPackageScope

Do not try to search something, that is known not to exist
This commit is contained in:
Denis Zharkov
2016-02-23 12:40:24 +03:00
parent beb24af5ef
commit 3652cd9c18
9 changed files with 77 additions and 3 deletions
@@ -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);
}
@@ -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?