From d4cc98fab12f72079515884346d290564e34e828 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 14 Sep 2020 16:18:33 +0300 Subject: [PATCH] [FIR] Safe VersionRequirementTable in deserialized declarations --- .../deserialization/ClassDeserialization.kt | 2 ++ .../deserialization/FirMemberDeserializer.kt | 31 +++++++++++++------ .../FirVersionRequirementsTableKey.kt | 12 +++++++ 3 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/FirVersionRequirementsTableKey.kt 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 e9624c8ebc1..197b278b588 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 @@ -193,6 +193,8 @@ fun deserializeClassToSymbol( } (it.annotations as MutableList) += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver) + + it.versionRequirementsTable = context.versionRequirementTable } } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index 2791942e060..fe0beb135dc 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -76,10 +76,11 @@ class FirDeserializationContext( annotationDeserializer: AbstractAnnotationDeserializer, constDeserializer: FirConstDeserializer, containerSource: DeserializedContainerSource? - ) = createRootContext( + ): FirDeserializationContext = createRootContext( nameResolver, TypeTable(packageProto.typeTable), session, + VersionRequirementTable.create(packageProto.versionRequirementTable), annotationDeserializer, constDeserializer, fqName, @@ -96,10 +97,11 @@ class FirDeserializationContext( annotationDeserializer: AbstractAnnotationDeserializer, constDeserializer: FirConstDeserializer, containerSource: DeserializedContainerSource? - ) = createRootContext( + ): FirDeserializationContext = createRootContext( nameResolver, TypeTable(classProto.typeTable), session, + VersionRequirementTable.create(classProto.versionRequirementTable), annotationDeserializer, constDeserializer, classId.packageFqName, @@ -112,6 +114,7 @@ class FirDeserializationContext( nameResolver: NameResolver, typeTable: TypeTable, session: FirSession, + versionRequirementTable: VersionRequirementTable, annotationDeserializer: AbstractAnnotationDeserializer, constDeserializer: FirConstDeserializer, packageFqName: FqName, @@ -121,7 +124,7 @@ class FirDeserializationContext( ): FirDeserializationContext { return FirDeserializationContext( nameResolver, typeTable, - VersionRequirementTable.EMPTY, // TODO: + versionRequirementTable, session, packageFqName, relativeClassName, @@ -178,6 +181,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { } resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } + }.apply { + versionRequirementsTable = c.versionRequirementTable } } @@ -231,6 +236,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { c.containerSource, proto, local.nameResolver, local.typeTable, getterFlags ) this.symbol = FirPropertyAccessorSymbol() + }.apply { + versionRequirementsTable = c.versionRequirementTable } } else { FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) @@ -265,6 +272,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { AbstractAnnotationDeserializer.CallableKind.PROPERTY_SETTER, classProto ) + }.apply { + versionRequirementsTable = c.versionRequirementTable } } else { FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) @@ -314,6 +323,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { this.setter = setter this.containerSource = c.containerSource this.initializer = c.constDeserializer.loadConstant(proto, symbol.callableId, c.nameResolver) + }.apply { + versionRequirementsTable = c.versionRequirementTable } } @@ -331,10 +342,6 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { emptyList() } - val versionRequirementTable = - // TODO: Support case for KOTLIN_SUSPEND_BUILT_IN_FUNCTION_FQ_NAME - c.versionRequirementTable - val callableName = c.nameResolver.getName(proto.name) val callableId = CallableId(c.packageFqName, c.relativeClassName, callableName) val symbol = FirNamedFunctionSymbol(callableId) @@ -374,6 +381,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { annotations += c.annotationDeserializer.loadFunctionAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable) this.containerSource = c.containerSource + }.apply { + versionRequirementsTable = c.versionRequirementTable } if (proto.hasContract()) { val contractDescription = contractDeserializer.loadContract(proto.contract, simpleFunction) @@ -438,7 +447,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { ) annotations += c.annotationDeserializer.loadConstructorAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable) - }.build() + }.build().apply { + versionRequirementsTable = c.versionRequirementTable + } } private fun defaultValue(flags: Int): FirExpression? { @@ -482,6 +493,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { callableKind, index, ) + }.apply { + versionRequirementsTable = c.versionRequirementTable } }.toList() } @@ -493,6 +506,4 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { type = context.typeDeserializer.type(this@toTypeRef, attributes) } } - } - diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/FirVersionRequirementsTableKey.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/FirVersionRequirementsTableKey.kt new file mode 100644 index 00000000000..b3742196f76 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/FirVersionRequirementsTableKey.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.declarations + +import org.jetbrains.kotlin.metadata.deserialization.VersionRequirementTable + +object FirVersionRequirementsTableKey : FirDeclarationDataKey() + +var FirDeclaration.versionRequirementsTable: VersionRequirementTable? by FirDeclarationDataRegistry.data(FirVersionRequirementsTableKey)