Skip to content

Commit f4ee5f9

Browse files
committed
Cache NameResolver and KlibMetadataClassDataFinder.
^KT-80438
1 parent 46b28b1 commit f4ee5f9

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataLibraryBasedSymbolProvider.kt

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension
3030
import org.jetbrains.kotlin.resolve.KlibCompilerDeserializationConfiguration
3131
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
3232
import org.jetbrains.kotlin.serialization.deserialization.getClassId
33+
import java.util.IdentityHashMap
3334

3435
abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
3536
session: FirSession,
@@ -53,6 +54,8 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
5354
protected val deserializationConfiguration: KlibCompilerDeserializationConfiguration =
5455
KlibCompilerDeserializationConfiguration(session.languageVersionSettings)
5556
private val cachedFragments: MutableMap<L, MutableMap<Pair<String, String>, ProtoBuf.PackageFragment>> = mutableMapOf()
57+
private val fragmentToNameResolver = IdentityHashMap<ProtoBuf.PackageFragment, NameResolver>()
58+
private val fragmentToKlibMetadataClassDataFinder = IdentityHashMap<ProtoBuf.PackageFragment, KlibMetadataClassDataFinder>()
5659

5760
private fun getPackageFragment(
5861
resolvedLibrary: L, packageStringName: String, packageMetadataPart: String
@@ -64,6 +67,22 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
6467
}
6568
}
6669

70+
private fun getNameResolver(fragment: ProtoBuf.PackageFragment): NameResolver {
71+
return fragmentToNameResolver.getOrPut(fragment) {
72+
NameResolverImpl(
73+
fragment.strings,
74+
fragment.qualifiedNames,
75+
)
76+
}
77+
}
78+
79+
private fun getFinder(fragment: ProtoBuf.PackageFragment, resolver: NameResolver): KlibMetadataClassDataFinder {
80+
return fragmentToKlibMetadataClassDataFinder.getOrPut(fragment) {
81+
// Assumes the fact that the nameResolver depends only on the fragment.
82+
KlibMetadataClassDataFinder(fragment, resolver)
83+
}
84+
}
85+
6786
override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> {
6887
val packageStringName = if (packageFqName.isRoot) "" else packageFqName.asString()
6988

@@ -78,10 +97,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
7897

7998
val packageProto = fragment.`package`
8099

81-
val nameResolver = NameResolverImpl(
82-
fragment.strings,
83-
fragment.qualifiedNames,
84-
)
100+
val nameResolver = getNameResolver(fragment)
85101

86102
PackagePartsCacheData(
87103
packageProto,
@@ -112,7 +128,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
112128
@OptIn(SymbolInternals::class)
113129
override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? {
114130
forEachFragmentInPackage(classId.packageFqName) { resolvedLibrary, fragment, nameResolver ->
115-
val finder = KlibMetadataClassDataFinder(fragment, nameResolver)
131+
val finder = getFinder(fragment, nameResolver)
116132
val classProto = finder.findClassData(classId)?.classProto ?: return@forEachFragmentInPackage
117133

118134
val moduleData = moduleData(resolvedLibrary) ?: return null
@@ -167,10 +183,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
167183

168184
val fragment = getPackageFragment(resolvedLibrary, packageStringName, packageMetadataPart)
169185

170-
val nameResolver = NameResolverImpl(
171-
fragment.strings,
172-
fragment.qualifiedNames,
173-
)
186+
val nameResolver = getNameResolver(fragment)
174187

175188
f(resolvedLibrary, fragment, nameResolver)
176189
}

compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataClassDataFinder.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.name.ClassId
1414
import org.jetbrains.kotlin.serialization.deserialization.ClassData
1515
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
1616
import org.jetbrains.kotlin.serialization.deserialization.getClassId
17+
import java.util.HashMap
1718

1819
class KlibMetadataClassDataFinder(
1920
private val fragment: PackageFragment,
@@ -22,12 +23,13 @@ class KlibMetadataClassDataFinder(
2223
) : ClassDataFinder {
2324
val nameList = fragment.getExtension(KlibMetadataProtoBuf.className).orEmpty()
2425

26+
val classIdToIndex: Map<ClassId, Int> = buildMap {
27+
nameList.forEachIndexed { index, value -> this[nameResolver.getClassId(value)] = index }
28+
}
29+
2530
override fun findClassData(classId: ClassId): ClassData? {
2631

27-
val index = nameList.indexOfFirst { nameResolver.getClassId(it) == classId }
28-
if (index == -1) {
29-
return null
30-
}
32+
val index = classIdToIndex[classId] ?: return null
3133

3234
val foundClass = fragment.getClass_(index) ?: error("Could not find data for serialized class $classId")
3335

0 commit comments

Comments
 (0)