@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension
30
30
import org.jetbrains.kotlin.resolve.KlibCompilerDeserializationConfiguration
31
31
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
32
32
import org.jetbrains.kotlin.serialization.deserialization.getClassId
33
+ import java.util.IdentityHashMap
33
34
34
35
abstract class MetadataLibraryBasedSymbolProvider <L : MetadataLibrary >(
35
36
session : FirSession ,
@@ -53,6 +54,8 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
53
54
protected val deserializationConfiguration: KlibCompilerDeserializationConfiguration =
54
55
KlibCompilerDeserializationConfiguration (session.languageVersionSettings)
55
56
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 >()
56
59
57
60
private fun getPackageFragment (
58
61
resolvedLibrary : L , packageStringName : String , packageMetadataPart : String
@@ -64,6 +67,22 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
64
67
}
65
68
}
66
69
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
+
67
86
override fun computePackagePartsInfos (packageFqName : FqName ): List <PackagePartsCacheData > {
68
87
val packageStringName = if (packageFqName.isRoot) " " else packageFqName.asString()
69
88
@@ -78,10 +97,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
78
97
79
98
val packageProto = fragment.`package`
80
99
81
- val nameResolver = NameResolverImpl (
82
- fragment.strings,
83
- fragment.qualifiedNames,
84
- )
100
+ val nameResolver = getNameResolver(fragment)
85
101
86
102
PackagePartsCacheData (
87
103
packageProto,
@@ -112,7 +128,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
112
128
@OptIn(SymbolInternals ::class )
113
129
override fun extractClassMetadata (classId : ClassId , parentContext : FirDeserializationContext ? ): ClassMetadataFindResult ? {
114
130
forEachFragmentInPackage(classId.packageFqName) { resolvedLibrary, fragment, nameResolver ->
115
- val finder = KlibMetadataClassDataFinder (fragment, nameResolver)
131
+ val finder = getFinder (fragment, nameResolver)
116
132
val classProto = finder.findClassData(classId)?.classProto ? : return @forEachFragmentInPackage
117
133
118
134
val moduleData = moduleData(resolvedLibrary) ? : return null
@@ -167,10 +183,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
167
183
168
184
val fragment = getPackageFragment(resolvedLibrary, packageStringName, packageMetadataPart)
169
185
170
- val nameResolver = NameResolverImpl (
171
- fragment.strings,
172
- fragment.qualifiedNames,
173
- )
186
+ val nameResolver = getNameResolver(fragment)
174
187
175
188
f(resolvedLibrary, fragment, nameResolver)
176
189
}
0 commit comments