FIR deserializer: load annotations on inner classes

This commit is contained in:
Jinseong Jeon
2020-07-06 15:28:06 -07:00
committed by Dmitriy Novozhilov
parent c588bc604d
commit 81345bcc26
9 changed files with 14 additions and 12 deletions
@@ -7,7 +7,7 @@ public final class Class : R|kotlin/Any| {
public constructor(): R|test/Class| public constructor(): R|test/Class|
public final companion object Companion : R|kotlin/Any| { public final companion object Companion : R|kotlin/Any| {
@FIELD:R|test/Anno|() public final var property: R|kotlin/Int| public final var property: R|kotlin/Int|
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit| public set(value: R|kotlin/Int|): R|kotlin/Unit|
@@ -10,7 +10,7 @@ public sealed class Sealed : R|kotlin/Any| {
@R|test/Ann|() private constructor(@R|test/Ann|() z: R|test/Z|): R|test/Sealed| @R|test/Ann|() private constructor(@R|test/Ann|() z: R|test/Z|): R|test/Sealed|
public final class Derived : R|test/Sealed| { public final class Derived : R|test/Sealed| {
public constructor(z: R|test/Z|): R|test/Sealed.Derived| @R|test/Ann|() public constructor(z: R|test/Z|): R|test/Sealed.Derived|
} }
@@ -13,7 +13,7 @@ public final class Outer : R|kotlin/Any| {
public final val y: R|kotlin/String| public final val y: R|kotlin/String|
public get(): R|kotlin/String| public get(): R|kotlin/String|
public constructor(y: R|kotlin/String|): R|test/Outer.Inner| public constructor(@R|test/A|(s = String(inner)) y: R|kotlin/String|): R|test/Outer.Inner|
} }
@@ -21,7 +21,7 @@ public final class Outer : R|kotlin/Any| {
public final val x: R|kotlin/String| public final val x: R|kotlin/String|
public get(): R|kotlin/String| public get(): R|kotlin/String|
public constructor(x: R|kotlin/String|): R|test/Outer.Nested| public constructor(@R|test/A|(s = String(nested)) x: R|kotlin/String|): R|test/Outer.Nested|
} }
@@ -7,7 +7,7 @@ public final class Class : R|kotlin/Any| {
public constructor(): R|test/Class| public constructor(): R|test/Class|
public final companion object Companion : R|kotlin/Any| { public final companion object Companion : R|kotlin/Any| {
public final val property: R|kotlin/Int| @PROPERTY:R|test/Anno|() public final val property: R|kotlin/Int|
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
private constructor(): R|test/Class.Companion| private constructor(): R|test/Class.Companion|
@@ -5,7 +5,7 @@ public final annotation class Anno : R|kotlin/Annotation| {
public abstract interface Trait : R|kotlin/Any| { public abstract interface Trait : R|kotlin/Any| {
public final companion object Companion : R|kotlin/Any| { public final companion object Companion : R|kotlin/Any| {
public final val property: R|kotlin/Int| @PROPERTY:R|test/Anno|() public final val property: R|kotlin/Int|
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
private constructor(): R|test/Trait.Companion| private constructor(): R|test/Trait.Companion|
@@ -30,6 +30,8 @@ class JvmBinaryAnnotationDeserializer(
kotlinBinaryClass: KotlinJvmBinaryClass, kotlinBinaryClass: KotlinJvmBinaryClass,
byteContent: ByteArray? byteContent: ByteArray?
) : AbstractAnnotationDeserializer(session) { ) : 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) { private val annotationInfo by lazy(LazyThreadSafetyMode.PUBLICATION) {
session.loadMemberAnnotations(kotlinBinaryClass, byteContent) session.loadMemberAnnotations(kotlinBinaryClass, byteContent)
} }
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.deserialization.TypeTable import org.jetbrains.kotlin.metadata.deserialization.TypeTable
import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getClassId import org.jetbrains.kotlin.serialization.deserialization.getClassId
@@ -73,16 +73,19 @@ fun deserializeClassToSymbol(
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags) isInline = Flags.IS_INLINE_CLASS.get(classProto.flags)
} }
val isSealed = modality == Modality.SEALED val isSealed = modality == Modality.SEALED
val annotationDeserializer = defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session)
val context = val context =
parentContext?.childContext( parentContext?.childContext(
classProto.typeParameterList, classProto.typeParameterList,
nameResolver, nameResolver,
TypeTable(classProto.typeTable), TypeTable(classProto.typeTable),
classId.relativeClassName, classId.relativeClassName,
containerSource,
annotationDeserializer,
status.isInner status.isInner
) ?: FirDeserializationContext.createForClass( ) ?: FirDeserializationContext.createForClass(
classId, classProto, nameResolver, session, classId, classProto, nameResolver, session,
defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session), annotationDeserializer,
FirConstDeserializer(session, (containerSource as? KotlinJvmBinarySourceElement)?.binaryClass), FirConstDeserializer(session, (containerSource as? KotlinJvmBinarySourceElement)?.binaryClass),
containerSource containerSource
) )
@@ -164,9 +167,6 @@ fun deserializeClassToSymbol(
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName) generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
} }
if (isSealed) {
}
addCloneForArrayIfNeeded(classId) addCloneForArrayIfNeeded(classId)
addSerializableIfNeeded(classId) addSerializableIfNeeded(classId)
}.also { }.also {
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.serialization.deserialization.getName
@@ -55,6 +54,8 @@ class FirDeserializationContext(
nameResolver: NameResolver = this.nameResolver, nameResolver: NameResolver = this.nameResolver,
typeTable: TypeTable = this.typeTable, typeTable: TypeTable = this.typeTable,
relativeClassName: FqName? = this.relativeClassName, relativeClassName: FqName? = this.relativeClassName,
containerSource: DeserializedContainerSource? = this.containerSource,
annotationDeserializer: AbstractAnnotationDeserializer = this.annotationDeserializer,
capturesTypeParameters: Boolean = true capturesTypeParameters: Boolean = true
): FirDeserializationContext = FirDeserializationContext( ): FirDeserializationContext = FirDeserializationContext(
nameResolver, typeTable, versionRequirementTable, session, packageFqName, relativeClassName, nameResolver, typeTable, versionRequirementTable, session, packageFqName, relativeClassName,