@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension
3030import org.jetbrains.kotlin.resolve.KlibCompilerDeserializationConfiguration
3131import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
3232import org.jetbrains.kotlin.serialization.deserialization.getClassId
33+ import java.util.HashMap
3334
3435abstract 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 = HashMap <Int , NameResolver >()
58+ private val fragmentToKlibMetadataClassDataFinder = HashMap <Int , 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.hashCode()) {
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.hashCode()) {
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 }
0 commit comments