From a018847f85c2aa0342b8a7d37f07a9275e11d584 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 17 Sep 2020 17:59:28 +0300 Subject: [PATCH] [FIR] Properly deserialize type attributes for type arguments #KT-41991 Fixed --- .../fir/deserialization/FirContractDeserializer.kt | 2 +- .../fir/deserialization/FirMemberDeserializer.kt | 3 ++- .../fir/deserialization/FirTypeDeserializer.kt | 12 +++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt index 75cac7d21e1..ad65d9f0921 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt @@ -152,7 +152,7 @@ class FirContractDeserializer(private val c: FirDeserializationContext) { } private fun extractType(proto: ProtoBuf.Expression): ConeKotlinType? { - return c.typeDeserializer.type(proto.isInstanceType(c.typeTable) ?: return null, ConeAttributes.Empty) + return c.typeDeserializer.type(proto.isInstanceType(c.typeTable) ?: return null) } private fun loadConstant(value: ProtoBuf.Expression.ConstantValue): ConeConstantReference? = when (value) { 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 2d4288c32a7..86922ae9b46 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 @@ -56,7 +56,7 @@ class FirDeserializationContext( ): FirDeserializationContext = FirDeserializationContext( nameResolver, typeTable, versionRequirementTable, session, packageFqName, relativeClassName, FirTypeDeserializer( - session, nameResolver, typeTable, typeParameterProtos, typeDeserializer + session, nameResolver, typeTable, annotationDeserializer, typeParameterProtos, typeDeserializer ), annotationDeserializer, constDeserializer, containerSource, if (capturesTypeParameters) allTypeParameters else emptyList() @@ -129,6 +129,7 @@ class FirDeserializationContext( session, nameResolver, typeTable, + annotationDeserializer, typeParameterProtos, null ), diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt index dc8fea32df0..36ba8eb362f 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt @@ -38,6 +38,7 @@ class FirTypeDeserializer( val session: FirSession, val nameResolver: NameResolver, val typeTable: TypeTable, + val annotationDeserializer: AbstractAnnotationDeserializer, typeParameterProtos: List, val parent: FirTypeDeserializer? ) { @@ -78,7 +79,7 @@ class FirTypeDeserializer( val builder = builders[index] builder.apply { proto.upperBoundList.mapTo(bounds) { - buildResolvedTypeRef { type = type(it, ConeAttributes.Empty) } + buildResolvedTypeRef { type = type(it) } } addDefaultBoundIfNecessary() }.build() @@ -97,6 +98,12 @@ class FirTypeDeserializer( } } + fun type(proto: ProtoBuf.Type): ConeKotlinType { + val annotations = annotationDeserializer.loadTypeAnnotations(proto, nameResolver) + val attributes = annotations.computeTypeAttributes() + return type(proto, attributes) + } + fun type(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeKotlinType { if (proto.hasFlexibleTypeCapabilitiesId()) { val lowerBound = simpleType(proto, attributes) @@ -119,7 +126,6 @@ class FirTypeDeserializer( } } - fun FirClassLikeSymbol<*>.typeParameters(): List = (fir as? FirTypeParameterRefsOwner)?.typeParameters?.map { it.symbol }.orEmpty() @@ -221,7 +227,7 @@ class FirTypeDeserializer( val variance = ProtoEnumFlags.variance(typeArgumentProto.projection) val type = typeArgumentProto.type(typeTable) ?: return ConeKotlinErrorType(ConeSimpleDiagnostic("No type recorded", DiagnosticKind.DeserializationError)) - val coneType = type(type, ConeAttributes.Empty) + val coneType = type(type) return coneType.toTypeProjection(variance) } }