FIR: temp: make klib symbol provider know parent packages

Current qualified access resolving algo rely (likely incorrectly,
see #KT-58037) on a providers' "knowledge" about parent packages.
This commit adds this "knowledge" to k-lib based provider.
#KT-57353 fixed
This commit is contained in:
Ilya Chernikov
2023-03-22 17:03:19 +01:00
committed by Space Team
parent ed2b817409
commit 8cc9f911d5
18 changed files with 114 additions and 6 deletions
@@ -6,9 +6,6 @@
package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.deserialization.*
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
@@ -17,7 +14,6 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.metadata.*
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
@@ -52,6 +48,20 @@ class KlibBasedSymbolProvider(
}
}
private val knownPackagesInLibraries: Set<FqName> by lazy {
buildSet<FqName> {
for ((_, header) in moduleHeaders) {
for (fragmentName in header.packageFragmentNameList) {
var curPackage = FqName(fragmentName)
while (!curPackage.isRoot) {
add(curPackage)
curPackage = curPackage.parent()
}
}
}
}
}
private val annotationDeserializer = KlibBasedAnnotationDeserializer(session)
private val constDeserializer = FirConstDeserializer(session, KlibMetadataSerializerProtocol)
private val deserializationConfiguration = CompilerDeserializationConfiguration(session.languageVersionSettings)
@@ -182,7 +192,7 @@ class KlibBasedSymbolProvider(
override fun isNewPlaceForBodyGeneration(classProto: ProtoBuf.Class) = false
override fun getPackage(fqName: FqName): FqName? {
return if (fqName.toString() in fragmentNamesInLibraries) {
return if (fqName in knownPackagesInLibraries) {
fqName
} else {
null