From a18bd1bb758ec8bd3fe15fdea871fe95558133d9 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 6 Jul 2020 15:54:25 -0700 Subject: [PATCH] FIR deserializer: use annotation info from enclosing class for companion object --- .../classMembers/ClassObjectPropertyField.txt | 2 +- .../deserialization/JvmBinaryAnnotationDeserializer.kt | 10 +++++++--- .../deserialization/AbstractAnnotationDeserializer.kt | 3 +++ .../kotlin/fir/deserialization/ClassDeserialization.kt | 5 +++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/ClassObjectPropertyField.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/ClassObjectPropertyField.txt index 97afcc13c7c..a0dd4ad5736 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/ClassObjectPropertyField.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/ClassObjectPropertyField.txt @@ -7,7 +7,7 @@ public final class Class : R|kotlin/Any| { public constructor(): R|test/Class| public final companion object Companion : R|kotlin/Any| { - public final var property: R|kotlin/Int| + @FIELD:R|test/Anno|() public final var property: R|kotlin/Int| public get(): R|kotlin/Int| public set(value: R|kotlin/Int|): R|kotlin/Unit| diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt index 0dae12d6e5c..bde6b457105 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt @@ -30,12 +30,16 @@ class JvmBinaryAnnotationDeserializer( kotlinBinaryClass: KotlinJvmBinaryClass, byteContent: ByteArray? ) : AbstractAnnotationDeserializer(session) { - // TODO: In order to properly load annotations on fields inside a companion object, - // we need binary classes for both the companion class and the enclosing class. private val annotationInfo by lazy(LazyThreadSafetyMode.PUBLICATION) { session.loadMemberAnnotations(kotlinBinaryClass, byteContent) } + override fun inheritAnnotationInfo(parent: AbstractAnnotationDeserializer) { + if (parent is JvmBinaryAnnotationDeserializer) { + annotationInfo.memberAnnotations.putAll(parent.annotationInfo.memberAnnotations) + } + } + override fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List { val annotations = typeProto.getExtension(JvmProtoBuf.typeAnnotation).orEmpty() return annotations.map { deserializeAnnotation(it, nameResolver) } @@ -244,7 +248,7 @@ class JvmBinaryAnnotationDeserializer( } // TODO: Rename this once property constants are recorded as well -private data class MemberAnnotations(val memberAnnotations: Map>) +private data class MemberAnnotations(val memberAnnotations: MutableMap>) // TODO: better to be in KotlinDeserializedJvmSymbolsProvider? private fun FirSession.loadMemberAnnotations(kotlinBinaryClass: KotlinJvmBinaryClass, byteContent: ByteArray?): MemberAnnotations { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt index 6c01fe77e40..14a3fe89d76 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt @@ -42,6 +42,9 @@ abstract class AbstractAnnotationDeserializer( ) { protected val protocol = BuiltInSerializerProtocol + open fun inheritAnnotationInfo(parent: AbstractAnnotationDeserializer) { + } + enum class CallableKind { PROPERTY, PROPERTY_GETTER, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 10700093572..18f07162ec5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -89,6 +89,11 @@ fun deserializeClassToSymbol( FirConstDeserializer(session, (containerSource as? KotlinJvmBinarySourceElement)?.binaryClass), containerSource ) + if (status.isCompanion) { + parentContext?.let { + context.annotationDeserializer.inheritAnnotationInfo(it.annotationDeserializer) + } + } buildRegularClass { this.session = session origin = FirDeclarationOrigin.Library