From 8f18ab19f732d8b7c13453a8f15805f40498d86e Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 19 Jul 2022 12:13:20 +0200 Subject: [PATCH] FIR: use serialization extension protocol correctly otherwise the deserialization breaks on KLibs --- .../fir/session/KlibBasedAnnotationDeserializer.kt | 6 +----- .../kotlin/fir/session/KlibBasedSymbolProvider.kt | 8 ++++++-- .../AbstractAnnotationDeserializer.kt | 7 ++----- .../AbstractFirDeserializedSymbolProvider.kt | 3 +++ .../fir/deserialization/ClassDeserialization.kt | 12 ++++++++---- .../FirBuiltinAnnotationDeserializer.kt | 3 ++- .../fir/deserialization/FirConstDeserializer.kt | 9 +++++---- .../fir/deserialization/FirJvmConstDeserializer.kt | 4 +++- .../providers/impl/FirBuiltinSymbolProvider.kt | 4 ++-- .../JvmBinaryAnnotationDeserializer.kt | 3 ++- .../JvmClassFileBasedSymbolProvider.kt | 7 +++++-- .../OptionalAnnotationClassesProvider.kt | 5 ++++- 12 files changed, 43 insertions(+), 28 deletions(-) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt index f5a648866c5..cb5a4fb5ed8 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt @@ -12,14 +12,10 @@ import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.library.metadata.KlibMetadataSerializerProtocol import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolver -import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol class KlibBasedAnnotationDeserializer( session: FirSession -) : AbstractAnnotationDeserializer(session) { - override val protocol: SerializerExtensionProtocol - get() = KlibMetadataSerializerProtocol - +) : AbstractAnnotationDeserializer(session, KlibMetadataSerializerProtocol) { override fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List { val annotations = typeProto.getExtension(KlibMetadataProtoBuf.typeAnnotation).orEmpty() return annotations.map { deserializeAnnotation(it, nameResolver) } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt index ce371202272..ab7bc985ccb 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedSymbolProvider.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.library.metadata.KlibMetadataClassDataFinder +import org.jetbrains.kotlin.library.metadata.KlibMetadataSerializerProtocol import org.jetbrains.kotlin.library.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl @@ -31,7 +32,9 @@ class KlibBasedSymbolProvider( kotlinScopeProvider: FirKotlinScopeProvider, private val resolvedLibrary: KotlinResolvedLibrary, defaultDeserializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library -) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin) { +) : AbstractFirDeserializedSymbolProvider( + session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin, KlibMetadataSerializerProtocol +) { private val moduleHeader by lazy { resolvedLibrary.loadModuleHeader(resolvedLibrary.library) } @@ -41,7 +44,7 @@ class KlibBasedSymbolProvider( } private val annotationDeserializer = KlibBasedAnnotationDeserializer(session) - private val constDeserializer = FirConstDeserializer(session) + private val constDeserializer = FirConstDeserializer(session, KlibMetadataSerializerProtocol) private val deserializationConfiguration = CompilerDeserializationConfiguration(session.languageVersionSettings) private val cachedFragments = mutableMapOf, ProtoBuf.PackageFragment>() @@ -124,6 +127,7 @@ class KlibBasedSymbolProvider( moduleData, annotationDeserializer, kotlinScopeProvider, + KlibMetadataSerializerProtocol, parentContext, source, origin = defaultDeserializationOrigin, diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt index 6cbd4d55289..54da3269ee1 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt @@ -36,18 +36,15 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol -import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getClassId import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.types.ConstantValueKind abstract class AbstractAnnotationDeserializer( - private val session: FirSession + private val session: FirSession, + protected val protocol: SerializerExtensionProtocol ) { - protected open val protocol: SerializerExtensionProtocol - get() = BuiltInSerializerProtocol - open fun inheritAnnotationInfo(parent: AbstractAnnotationDeserializer) { } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt index dbae14731f7..f3670f91ecb 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getName import java.nio.file.Path @@ -68,6 +69,7 @@ abstract class AbstractFirDeserializedSymbolProvider( val moduleDataProvider: ModuleDataProvider, val kotlinScopeProvider: FirKotlinScopeProvider, val defaultDeserializationOrigin: FirDeclarationOrigin, + private val serializerExtensionProtocol: SerializerExtensionProtocol ) : FirSymbolProvider(session) { // ------------------------ Caches ------------------------ @@ -146,6 +148,7 @@ abstract class AbstractFirDeserializedSymbolProvider( moduleData, annotationDeserializer, kotlinScopeProvider, + serializerExtensionProtocol, parentContext, sourceElement, origin = defaultDeserializationOrigin, diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 1611f303aeb..b78e718df5a 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -30,7 +30,9 @@ import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.serialization.deserialization.loadValueClassRepresentation @@ -44,6 +46,7 @@ fun deserializeClassToSymbol( moduleData: FirModuleData, defaultAnnotationDeserializer: AbstractAnnotationDeserializer?, scopeProvider: FirScopeProvider, + serializerExtensionProtocol: SerializerExtensionProtocol, parentContext: FirDeserializationContext? = null, containerSource: DeserializedContainerSource? = null, origin: FirDeclarationOrigin = FirDeclarationOrigin.Library, @@ -71,9 +74,9 @@ fun deserializeClassToSymbol( val annotationDeserializer = defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session) val jvmBinaryClass = (containerSource as? KotlinJvmBinarySourceElement)?.binaryClass val constDeserializer = if (jvmBinaryClass != null) { - FirJvmConstDeserializer(session, jvmBinaryClass) + FirJvmConstDeserializer(session, jvmBinaryClass, serializerExtensionProtocol) } else { - FirConstDeserializer(session) + FirConstDeserializer(session, serializerExtensionProtocol) } val context = parentContext?.childContext( @@ -87,8 +90,9 @@ fun deserializeClassToSymbol( if (status.isCompanion) { parentContext.constDeserializer } else { - ((containerSource as? KotlinJvmBinarySourceElement)?.binaryClass)?.let { FirJvmConstDeserializer(session, it) } - ?: parentContext.constDeserializer + ((containerSource as? KotlinJvmBinarySourceElement)?.binaryClass)?.let { + FirJvmConstDeserializer(session, it, serializerExtensionProtocol) + } ?: parentContext.constDeserializer }, status.isInner ) ?: FirDeserializationContext.createForClass( diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirBuiltinAnnotationDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirBuiltinAnnotationDeserializer.kt index 2012d2c4e6e..842b57a9015 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirBuiltinAnnotationDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirBuiltinAnnotationDeserializer.kt @@ -10,10 +10,11 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol class FirBuiltinAnnotationDeserializer( session: FirSession -) : AbstractAnnotationDeserializer(session) { +) : AbstractAnnotationDeserializer(session, BuiltInSerializerProtocol) { override fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List { if (!Flags.HAS_ANNOTATIONS.get(typeProto.flags)) return emptyList() diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirConstDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirConstDeserializer.kt index 3db52933f96..1d5f04c79f8 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirConstDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirConstDeserializer.kt @@ -8,24 +8,25 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression -import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull +import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol +import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol import org.jetbrains.kotlin.types.ConstantValueKind open class FirConstDeserializer( - val session: FirSession + val session: FirSession, + private val protocol: SerializerExtensionProtocol ) { protected val constantCache = mutableMapOf() open fun loadConstant(propertyProto: ProtoBuf.Property, callableId: CallableId, nameResolver: NameResolver): FirExpression? { if (!Flags.HAS_CONSTANT.get(propertyProto.flags)) return null constantCache[callableId]?.let { return it } - val value = propertyProto.getExtensionOrNull(BuiltInSerializerProtocol.compileTimeValue) ?: return null + val value = propertyProto.getExtensionOrNull(protocol.compileTimeValue) ?: return null return buildFirConstant(value, null, value.type.name, nameResolver)?.also { constantCache[callableId] = it } } } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirJvmConstDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirJvmConstDeserializer.kt index ead1c7ae6a4..2ed31242724 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirJvmConstDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirJvmConstDeserializer.kt @@ -13,11 +13,13 @@ import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol class FirJvmConstDeserializer( session: FirSession, private val binaryClass: KotlinJvmBinaryClass, -) : FirConstDeserializer(session) { + protocol: SerializerExtensionProtocol, +) : FirConstDeserializer(session, protocol) { override fun loadConstant(propertyProto: ProtoBuf.Property, callableId: CallableId, nameResolver: NameResolver): FirExpression? { if (!Flags.HAS_CONSTANT.get(propertyProto.flags)) return null constantCache[callableId]?.let { return it } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt index ee9fa0a804b..a3b320ba966 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt @@ -118,7 +118,7 @@ open class FirBuiltinSymbolProvider( FirDeserializationContext.createForPackage( fqName, packageProto.`package`, nameResolver, moduleData, FirBuiltinAnnotationDeserializer(moduleData.session), - FirConstDeserializer(moduleData.session), + FirConstDeserializer(moduleData.session, BuiltInSerializerProtocol), containerSource = null ).memberDeserializer } @@ -131,7 +131,7 @@ open class FirBuiltinSymbolProvider( deserializeClassToSymbol( classId, classProto, symbol, nameResolver, moduleData.session, moduleData, - null, kotlinScopeProvider, parentContext, + null, kotlinScopeProvider, BuiltInSerializerProtocol, parentContext, null, origin = FirDeclarationOrigin.BuiltIns, this::findAndDeserializeClass, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt index 835b67bb91a..953c7884245 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.protobuf.MessageLite +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.utils.addToStdlib.runIf @@ -29,7 +30,7 @@ class JvmBinaryAnnotationDeserializer( kotlinBinaryClass: KotlinJvmBinaryClass, kotlinClassFinder: KotlinClassFinder, byteContent: ByteArray? -) : AbstractAnnotationDeserializer(session) { +) : AbstractAnnotationDeserializer(session, BuiltInSerializerProtocol) { private val annotationInfo by lazy(LazyThreadSafetyMode.PUBLICATION) { session.loadMemberAnnotations(kotlinBinaryClass, byteContent, kotlinClassFinder) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt index 20230e537f7..4e77418581c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.serialization.deserialization.* +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import java.nio.file.Path import java.nio.file.Paths @@ -49,7 +50,9 @@ class JvmClassFileBasedSymbolProvider( private val kotlinClassFinder: KotlinClassFinder, private val javaFacade: FirJavaFacade, defaultDeserializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library -) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin) { +) : AbstractFirDeserializedSymbolProvider( + session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin, BuiltInSerializerProtocol +) { private val annotationsLoader = AnnotationsLoader(session, kotlinClassFinder) override fun computePackagePartsInfos(packageFqName: FqName): List { @@ -81,7 +84,7 @@ class JvmClassFileBasedSymbolProvider( FirDeserializationContext.createForPackage( packageFqName, packageProto, nameResolver, moduleData, JvmBinaryAnnotationDeserializer(session, kotlinJvmBinaryClass, kotlinClassFinder, byteContent), - FirJvmConstDeserializer(session, facadeBinaryClass ?: kotlinJvmBinaryClass), + FirJvmConstDeserializer(session, facadeBinaryClass ?: kotlinJvmBinaryClass, BuiltInSerializerProtocol), source ), ) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt index 9cde0d2767b..0fbdfa737e8 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/OptionalAnnotationClassesProvider.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.deserialization.ClassData +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.getClassId class OptionalAnnotationClassesProvider( @@ -27,7 +28,9 @@ class OptionalAnnotationClassesProvider( kotlinScopeProvider: FirKotlinScopeProvider, val packagePartProvider: PackagePartProvider, defaultDeserializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library -) : AbstractFirDeserializedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin) { +) : AbstractFirDeserializedSymbolProvider( + session, moduleDataProvider, kotlinScopeProvider, defaultDeserializationOrigin, BuiltInSerializerProtocol +) { private val optionalAnnotationClassesAndPackages by lazy(LazyThreadSafetyMode.PUBLICATION) { val optionalAnnotationClasses = mutableMapOf()