[FIR] Safe VersionRequirementTable in deserialized declarations

This commit is contained in:
Dmitriy Novozhilov
2020-09-14 16:18:33 +03:00
parent 7c5160a968
commit d4cc98fab1
3 changed files with 35 additions and 10 deletions
@@ -193,6 +193,8 @@ fun deserializeClassToSymbol(
} }
(it.annotations as MutableList<FirAnnotationCall>) += (it.annotations as MutableList<FirAnnotationCall>) +=
context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver) context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
it.versionRequirementsTable = context.versionRequirementTable
} }
} }
@@ -76,10 +76,11 @@ class FirDeserializationContext(
annotationDeserializer: AbstractAnnotationDeserializer, annotationDeserializer: AbstractAnnotationDeserializer,
constDeserializer: FirConstDeserializer, constDeserializer: FirConstDeserializer,
containerSource: DeserializedContainerSource? containerSource: DeserializedContainerSource?
) = createRootContext( ): FirDeserializationContext = createRootContext(
nameResolver, nameResolver,
TypeTable(packageProto.typeTable), TypeTable(packageProto.typeTable),
session, session,
VersionRequirementTable.create(packageProto.versionRequirementTable),
annotationDeserializer, annotationDeserializer,
constDeserializer, constDeserializer,
fqName, fqName,
@@ -96,10 +97,11 @@ class FirDeserializationContext(
annotationDeserializer: AbstractAnnotationDeserializer, annotationDeserializer: AbstractAnnotationDeserializer,
constDeserializer: FirConstDeserializer, constDeserializer: FirConstDeserializer,
containerSource: DeserializedContainerSource? containerSource: DeserializedContainerSource?
) = createRootContext( ): FirDeserializationContext = createRootContext(
nameResolver, nameResolver,
TypeTable(classProto.typeTable), TypeTable(classProto.typeTable),
session, session,
VersionRequirementTable.create(classProto.versionRequirementTable),
annotationDeserializer, annotationDeserializer,
constDeserializer, constDeserializer,
classId.packageFqName, classId.packageFqName,
@@ -112,6 +114,7 @@ class FirDeserializationContext(
nameResolver: NameResolver, nameResolver: NameResolver,
typeTable: TypeTable, typeTable: TypeTable,
session: FirSession, session: FirSession,
versionRequirementTable: VersionRequirementTable,
annotationDeserializer: AbstractAnnotationDeserializer, annotationDeserializer: AbstractAnnotationDeserializer,
constDeserializer: FirConstDeserializer, constDeserializer: FirConstDeserializer,
packageFqName: FqName, packageFqName: FqName,
@@ -121,7 +124,7 @@ class FirDeserializationContext(
): FirDeserializationContext { ): FirDeserializationContext {
return FirDeserializationContext( return FirDeserializationContext(
nameResolver, typeTable, nameResolver, typeTable,
VersionRequirementTable.EMPTY, // TODO: versionRequirementTable,
session, session,
packageFqName, packageFqName,
relativeClassName, relativeClassName,
@@ -178,6 +181,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
} }
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } 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 c.containerSource, proto, local.nameResolver, local.typeTable, getterFlags
) )
this.symbol = FirPropertyAccessorSymbol() this.symbol = FirPropertyAccessorSymbol()
}.apply {
versionRequirementsTable = c.versionRequirementTable
} }
} else { } else {
FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) FirDefaultPropertyGetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility)
@@ -265,6 +272,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
AbstractAnnotationDeserializer.CallableKind.PROPERTY_SETTER, AbstractAnnotationDeserializer.CallableKind.PROPERTY_SETTER,
classProto classProto
) )
}.apply {
versionRequirementsTable = c.versionRequirementTable
} }
} else { } else {
FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility) FirDefaultPropertySetter(null, c.session, FirDeclarationOrigin.Library, returnTypeRef, visibility)
@@ -314,6 +323,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
this.setter = setter this.setter = setter
this.containerSource = c.containerSource this.containerSource = c.containerSource
this.initializer = c.constDeserializer.loadConstant(proto, symbol.callableId, c.nameResolver) 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() emptyList()
} }
val versionRequirementTable =
// TODO: Support case for KOTLIN_SUSPEND_BUILT_IN_FUNCTION_FQ_NAME
c.versionRequirementTable
val callableName = c.nameResolver.getName(proto.name) val callableName = c.nameResolver.getName(proto.name)
val callableId = CallableId(c.packageFqName, c.relativeClassName, callableName) val callableId = CallableId(c.packageFqName, c.relativeClassName, callableName)
val symbol = FirNamedFunctionSymbol(callableId) val symbol = FirNamedFunctionSymbol(callableId)
@@ -374,6 +381,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
annotations += annotations +=
c.annotationDeserializer.loadFunctionAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable) c.annotationDeserializer.loadFunctionAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable)
this.containerSource = c.containerSource this.containerSource = c.containerSource
}.apply {
versionRequirementsTable = c.versionRequirementTable
} }
if (proto.hasContract()) { if (proto.hasContract()) {
val contractDescription = contractDeserializer.loadContract(proto.contract, simpleFunction) val contractDescription = contractDeserializer.loadContract(proto.contract, simpleFunction)
@@ -438,7 +447,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
) )
annotations += annotations +=
c.annotationDeserializer.loadConstructorAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable) c.annotationDeserializer.loadConstructorAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable)
}.build() }.build().apply {
versionRequirementsTable = c.versionRequirementTable
}
} }
private fun defaultValue(flags: Int): FirExpression? { private fun defaultValue(flags: Int): FirExpression? {
@@ -482,6 +493,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
callableKind, callableKind,
index, index,
) )
}.apply {
versionRequirementsTable = c.versionRequirementTable
} }
}.toList() }.toList()
} }
@@ -493,6 +506,4 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
type = context.typeDeserializer.type(this@toTypeRef, attributes) type = context.typeDeserializer.type(this@toTypeRef, attributes)
} }
} }
} }
@@ -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)