From a968193349cfe8554ea6fa3fa709f8f62c922893 Mon Sep 17 00:00:00 2001 From: pyos Date: Wed, 9 Nov 2022 17:42:04 +0100 Subject: [PATCH] K2: fix logic for supertypes annotation deserialization --- .../annotations/types/SupertypesAndBounds.txt | 2 +- .../deserialization/ClassDeserialization.kt | 9 +------- .../deserialization/FirMemberDeserializer.kt | 10 ++------- .../deserialization/FirTypeDeserializer.kt | 21 +++++++++++++------ 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/SupertypesAndBounds.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/SupertypesAndBounds.txt index 4e474faee1a..a1bf2cd4279 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/SupertypesAndBounds.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/SupertypesAndBounds.txt @@ -3,7 +3,7 @@ } -public abstract interface Foo : R|java/io/Serializable| { +public abstract interface Foo : R|@R|test/A|() java/io/Serializable| { public abstract fun bar(): R|kotlin/Unit| } 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 f2b524a7109..ecbae742812 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 @@ -123,14 +123,7 @@ fun deserializeClassToSymbol( val typeDeserializer = context.typeDeserializer val classDeserializer = context.memberDeserializer - val superTypesDeserialized = classProto.supertypes(context.typeTable).map { supertypeProto -> - typeDeserializer.simpleType(supertypeProto, ConeAttributes.Empty) - } - - superTypesDeserialized.mapNotNullTo(superTypeRefs) { - if (it == null) return@mapNotNullTo null - buildResolvedTypeRef { type = it } - } + classProto.supertypes(context.typeTable).mapTo(superTypeRefs, typeDeserializer::typeRef) addDeclarations( classProto.functionList.map { 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 6c55e5ccc75..67402558807 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 @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef -import org.jetbrains.kotlin.fir.types.computeTypeAttributes import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl @@ -635,11 +634,6 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { }.toList() } - private fun ProtoBuf.Type.toTypeRef(context: FirDeserializationContext): FirTypeRef { - return buildResolvedTypeRef { - annotations += context.annotationDeserializer.loadTypeAnnotations(this@toTypeRef, context.nameResolver) - val attributes = annotations.computeTypeAttributes(context.session) - type = context.typeDeserializer.type(this@toTypeRef, attributes) - } - } + private fun ProtoBuf.Type.toTypeRef(context: FirDeserializationContext): FirTypeRef = + context.typeDeserializer.typeRef(this) } 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 8d6325ea678..fad97dd85a0 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 @@ -106,13 +106,22 @@ class FirTypeDeserializer( } } - fun type(proto: ProtoBuf.Type): ConeKotlinType { - val annotations = annotationDeserializer.loadTypeAnnotations(proto, nameResolver) - val attributes = annotations.computeTypeAttributes(moduleData.session) - return type(proto, attributes) + fun typeRef(proto: ProtoBuf.Type): FirTypeRef { + return buildResolvedTypeRef { + annotations += annotationDeserializer.loadTypeAnnotations(proto, nameResolver) + type = type(proto, annotations.computeTypeAttributes(moduleData.session)) + } } - fun type(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeKotlinType { + private fun attributesFromAnnotations(proto: ProtoBuf.Type) = + annotationDeserializer.loadTypeAnnotations(proto, nameResolver) + .computeTypeAttributes(moduleData.session) + + fun type(proto: ProtoBuf.Type): ConeKotlinType { + return type(proto, attributesFromAnnotations(proto)) + } + + private fun type(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeKotlinType { if (proto.hasFlexibleTypeCapabilitiesId()) { val lowerBound = simpleType(proto, attributes) val upperBound = simpleType(proto.flexibleUpperBound(typeTable)!!, attributes) @@ -145,7 +154,7 @@ class FirTypeDeserializer( fun FirClassLikeSymbol<*>.typeParameters(): List = (fir as? FirTypeParameterRefsOwner)?.typeParameters?.map { it.symbol }.orEmpty() - fun simpleType(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeSimpleKotlinType? { + private fun simpleType(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeSimpleKotlinType? { val constructor = typeSymbol(proto) ?: return null if (constructor is ConeTypeParameterLookupTag) { return ConeTypeParameterTypeImpl(constructor, isNullable = proto.nullable).let {