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 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 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|
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 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 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 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|
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 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|
private constructor(): R|test/Trait.Companion|
@@ -30,6 +30,8 @@ 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)
}
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
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.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getClassId
@@ -73,16 +73,19 @@ fun deserializeClassToSymbol(
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags)
}
val isSealed = modality == Modality.SEALED
val annotationDeserializer = defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session)
val context =
parentContext?.childContext(
classProto.typeParameterList,
nameResolver,
TypeTable(classProto.typeTable),
classId.relativeClassName,
containerSource,
annotationDeserializer,
status.isInner
) ?: FirDeserializationContext.createForClass(
classId, classProto, nameResolver, session,
defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session),
annotationDeserializer,
FirConstDeserializer(session, (containerSource as? KotlinJvmBinarySourceElement)?.binaryClass),
containerSource
)
@@ -164,9 +167,6 @@ fun deserializeClassToSymbol(
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
}
if (isSealed) {
}
addCloneForArrayIfNeeded(classId)
addSerializableIfNeeded(classId)
}.also {
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.MessageLite
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.getName
@@ -55,6 +54,8 @@ class FirDeserializationContext(
nameResolver: NameResolver = this.nameResolver,
typeTable: TypeTable = this.typeTable,
relativeClassName: FqName? = this.relativeClassName,
containerSource: DeserializedContainerSource? = this.containerSource,
annotationDeserializer: AbstractAnnotationDeserializer = this.annotationDeserializer,
capturesTypeParameters: Boolean = true
): FirDeserializationContext = FirDeserializationContext(
nameResolver, typeTable, versionRequirementTable, session, packageFqName, relativeClassName,