[FIR] Deserialize Klib KlibMetadataProtoBuf. classFile, functionFile & propertyFile
klibs provide information about the container source file in the KlibMetadataProtoBuf extensions for functions, properties and classes. This information is deserialized and attached to the `klibSourceFile` extension (stored in FirDeclarationDataRegistry) ^KT-66271 Fixed
This commit is contained in:
committed by
Space Team
parent
85a1d67d19
commit
6d8a4a28af
+41
-7
@@ -7,10 +7,10 @@ package org.jetbrains.kotlin.fir.session
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirModuleData
|
||||
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.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.klibSourceFile
|
||||
import org.jetbrains.kotlin.fir.deserialization.*
|
||||
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
|
||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
@@ -19,26 +19,28 @@ import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||
import org.jetbrains.kotlin.library.MetadataLibrary
|
||||
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
|
||||
import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.protobuf.GeneratedMessageLite
|
||||
import org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension
|
||||
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getClassId
|
||||
import org.jetbrains.kotlin.utils.SmartList
|
||||
import java.nio.file.Paths
|
||||
|
||||
abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
|
||||
session: FirSession,
|
||||
moduleDataProvider: ModuleDataProvider,
|
||||
kotlinScopeProvider: FirKotlinScopeProvider,
|
||||
defaultDeserializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library
|
||||
defaultDeserializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library,
|
||||
) : AbstractFirDeserializedSymbolProvider(
|
||||
session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin, KlibMetadataSerializerProtocol
|
||||
) {
|
||||
private class MetadataLibraryPackagePartCacheDataExtra(val library: MetadataLibrary) : PackagePartsCacheData.Extra
|
||||
|
||||
protected abstract fun moduleData(library: L): FirModuleData?
|
||||
|
||||
protected abstract val fragmentNamesInLibraries: Map<String, List<L>>
|
||||
@@ -85,6 +87,7 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
|
||||
constDeserializer,
|
||||
createDeserializedContainerSource(resolvedLibrary, packageFqName),
|
||||
),
|
||||
MetadataLibraryPackagePartCacheDataExtra(resolvedLibrary)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -130,6 +133,13 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
|
||||
origin = defaultDeserializationOrigin,
|
||||
deserializeNestedClass = this::getClass,
|
||||
)
|
||||
|
||||
if (resolvedLibrary is KotlinLibrary) {
|
||||
symbol.fir.klibSourceFile = loadKlibSourceFileExtensionOrNull(
|
||||
resolvedLibrary, nameResolver, classProto, KlibMetadataProtoBuf.classFile
|
||||
)
|
||||
}
|
||||
|
||||
symbol.fir.isNewPlaceForBodyGeneration = isNewPlaceForBodyGeneration(classProto)
|
||||
}
|
||||
}
|
||||
@@ -160,6 +170,30 @@ abstract class MetadataLibraryBasedSymbolProvider<L : MetadataLibrary>(
|
||||
}
|
||||
}
|
||||
|
||||
override fun loadFunctionExtensions(packagePart: PackagePartsCacheData, proto: ProtoBuf.Function, fir: FirFunction) {
|
||||
fir.klibSourceFile = loadKlibSourceFileExtensionOrNull(packagePart, proto, KlibMetadataProtoBuf.functionFile) ?: return
|
||||
}
|
||||
|
||||
override fun loadPropertyExtensions(packagePart: PackagePartsCacheData, proto: ProtoBuf.Property, fir: FirProperty) {
|
||||
fir.klibSourceFile = loadKlibSourceFileExtensionOrNull(packagePart, proto, KlibMetadataProtoBuf.propertyFile) ?: return
|
||||
}
|
||||
|
||||
private fun <T : GeneratedMessageLite.ExtendableMessage<T>> loadKlibSourceFileExtensionOrNull(
|
||||
packagePart: PackagePartsCacheData, proto: T, sourceFileExtension: GeneratedExtension<T, Int>,
|
||||
): DeserializedSourceFile? {
|
||||
val library = (packagePart.extra as? MetadataLibraryPackagePartCacheDataExtra)?.library as? KotlinLibrary ?: return null
|
||||
return loadKlibSourceFileExtensionOrNull(library, packagePart.context.nameResolver, proto, sourceFileExtension)
|
||||
}
|
||||
|
||||
private fun <T : GeneratedMessageLite.ExtendableMessage<T>> loadKlibSourceFileExtensionOrNull(
|
||||
library: KotlinLibrary, nameResolver: NameResolver, proto: T, sourceFileExtension: GeneratedExtension<T, Int>,
|
||||
): DeserializedSourceFile? {
|
||||
return proto.getExtensionOrNull(sourceFileExtension)
|
||||
?.let { fileId -> nameResolver.getString(fileId) }
|
||||
?.let { fileName -> DeserializedSourceFile(fileName, library) }
|
||||
}
|
||||
|
||||
|
||||
protected abstract fun createDeserializedContainerSource(
|
||||
resolvedLibrary: L,
|
||||
packageFqName: FqName
|
||||
|
||||
Reference in New Issue
Block a user