K2: Optimize AbstractFirDeserializedSymbolProvider
Avoid filling caches with keys that are definitely empty (if it's cheap to compute that), to decrease the size of backing maps. The strategy is pre-computing the sets of names that might be met. NB: the size of the sets is way fewer than a size of all queried names.
This commit is contained in:
committed by
Space Team
parent
e2e87bd107
commit
58c1b5dd1f
+5
-1
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
|
||||
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
|
||||
import org.jetbrains.kotlin.utils.toMetadataVersion
|
||||
import java.nio.file.Path
|
||||
@@ -97,6 +97,10 @@ class JvmClassFileBasedSymbolProvider(
|
||||
}
|
||||
}
|
||||
|
||||
override fun computePackageSetWithNonClassDeclarations(): Set<String> = packagePartProvider.computePackageSetWithNonClassDeclarations()
|
||||
|
||||
override fun mayHaveTopLevelClass(classId: ClassId): Boolean = javaFacade.hasTopLevelClassOf(classId)
|
||||
|
||||
private val KotlinJvmBinaryClass.incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>?
|
||||
get() {
|
||||
// TODO: skipMetadataVersionCheck
|
||||
|
||||
+9
-4
@@ -34,12 +34,12 @@ class OptionalAnnotationClassesProvider(
|
||||
|
||||
private val optionalAnnotationClassesAndPackages by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||
val optionalAnnotationClasses = mutableMapOf<ClassId, ClassData>()
|
||||
val optionalAnnotationPackages = mutableSetOf<FqName>()
|
||||
val optionalAnnotationPackages = mutableSetOf<String>()
|
||||
|
||||
for (klass in packagePartProvider.getAllOptionalAnnotationClasses()) {
|
||||
val classId = klass.nameResolver.getClassId(klass.classProto.fqName)
|
||||
optionalAnnotationClasses[classId] = klass
|
||||
optionalAnnotationPackages.add(classId.packageFqName)
|
||||
optionalAnnotationPackages.add(classId.packageFqName.asString())
|
||||
}
|
||||
|
||||
return@lazy Pair(optionalAnnotationClasses, optionalAnnotationPackages)
|
||||
@@ -49,6 +49,10 @@ class OptionalAnnotationClassesProvider(
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
override fun computePackageSetWithNonClassDeclarations(): Set<String> = optionalAnnotationClassesAndPackages.second
|
||||
|
||||
override fun mayHaveTopLevelClass(classId: ClassId): Boolean = classId in optionalAnnotationClassesAndPackages.first
|
||||
|
||||
override fun extractClassMetadata(
|
||||
classId: ClassId,
|
||||
parentContext: FirDeserializationContext?
|
||||
@@ -69,5 +73,6 @@ class OptionalAnnotationClassesProvider(
|
||||
return JvmFlags.IS_COMPILED_IN_JVM_DEFAULT_MODE.get(classProto.getExtension(JvmProtoBuf.jvmClassFlags))
|
||||
}
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? = if (optionalAnnotationClassesAndPackages.second.contains(fqName)) fqName else null
|
||||
}
|
||||
override fun getPackage(fqName: FqName): FqName? =
|
||||
if (optionalAnnotationClassesAndPackages.second.contains(fqName.asString())) fqName else null
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user