From a666eee67b9143079024e49b1ab14059f8fe0422 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 16 Sep 2020 14:19:51 +0300 Subject: [PATCH] [FIR] Properly deserialize annotations on typealias and underlying type --- .../loadCompiledKotlin/typealias/Annotations.txt | 4 ++-- .../typealias/TypeAliasToExtension.txt | 2 +- .../deserialization/AbstractAnnotationDeserializer.kt | 5 +++++ .../fir/deserialization/FirMemberDeserializer.kt | 10 ++++------ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/Annotations.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/Annotations.txt index b0b04378726..c3fc98d3259 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/Annotations.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/Annotations.txt @@ -1,6 +1,6 @@ -public final typealias A1 = R|kotlin/String| +@R|test/Ann|() @R|test/Ann|() public final typealias A1 = R|kotlin/String| -public final typealias A2 = R|kotlin/String| +@R|test/Ann|(value = String(OK)) @R|test/Ann|(value = String(OK)) public final typealias A2 = R|kotlin/String| @R|kotlin/annotation/Target|(allowedTargets = (R|kotlin/annotation/AnnotationTarget.TYPEALIAS|())) public final annotation class Ann : R|kotlin/Annotation| { public final val value: R|kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/TypeAliasToExtension.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/TypeAliasToExtension.txt index eead786cb91..d03400ef64d 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/TypeAliasToExtension.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/typealias/TypeAliasToExtension.txt @@ -5,5 +5,5 @@ public final class Foo : R|kotlin/Any| { } -public final typealias MyHandler

= R|(test/Foo

) -> kotlin/Unit| +public final typealias MyHandler

= R|test/Foo

.() -> kotlin/Unit| 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 0a182ea5443..078f5cf76ba 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 @@ -58,6 +58,11 @@ abstract class AbstractAnnotationDeserializer( return annotations.map { deserializeAnnotation(it, nameResolver) } } + fun loadTypeAliasAnnotations(aliasProto: ProtoBuf.TypeAlias, nameResolver: NameResolver): List { + if (!Flags.HAS_ANNOTATIONS.get(aliasProto.flags)) return emptyList() + return aliasProto.annotationList.map { deserializeAnnotation(it, nameResolver) } + } + open fun loadFunctionAnnotations( containerSource: DeserializedContainerSource?, functionProto: ProtoBuf.Function, 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 7884dc8db8d..2d4288c32a7 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 @@ -15,10 +15,8 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.types.ConeAttributes -import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef -import org.jetbrains.kotlin.fir.types.computeTypeAttributes import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef @@ -168,10 +166,10 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { isExpect = Flags.IS_EXPECT_CLASS.get(flags) isActual = false } + + annotations += c.annotationDeserializer.loadTypeAliasAnnotations(proto, local.nameResolver) symbol = FirTypeAliasSymbol(classId) - expandedTypeRef = buildResolvedTypeRef { - type = local.typeDeserializer.type(proto.underlyingType(c.typeTable), ConeAttributes.Empty) - } + expandedTypeRef = proto.underlyingType(c.typeTable).toTypeRef(local) resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } }.apply {