[FIR] Properly deserialize annotations of properties in interfaces
This commit is contained in:
committed by
TeamCityServer
parent
c6f56b9809
commit
a7e6667648
Vendored
+1
-1
@@ -9,7 +9,7 @@ public final annotation class Anno : R|kotlin/Annotation| {
|
|||||||
public abstract interface T : R|kotlin/Any| {
|
public abstract interface T : R|kotlin/Any| {
|
||||||
@R|test/Anno|(s = String(foo)) public abstract fun foo(): R|kotlin/Array<kotlin/Array<kotlin/Array<test/T>>>|
|
@R|test/Anno|(s = String(foo)) public abstract fun foo(): R|kotlin/Array<kotlin/Array<kotlin/Array<test/T>>>|
|
||||||
|
|
||||||
public abstract val bar: R|kotlin/Array<kotlin/Array<kotlin/BooleanArray>>|
|
@PROPERTY:R|test/Anno|(s = String(bar)) public abstract val bar: R|kotlin/Array<kotlin/Array<kotlin/BooleanArray>>|
|
||||||
public get(): R|kotlin/Array<kotlin/Array<kotlin/BooleanArray>>|
|
public get(): R|kotlin/Array<kotlin/Array<kotlin/BooleanArray>>|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ public final annotation class Anno : R|kotlin/Annotation| {
|
|||||||
|
|
||||||
public final class Class : R|kotlin/Any| {
|
public final class Class : R|kotlin/Any| {
|
||||||
public abstract interface Trait : R|kotlin/Any| {
|
public abstract interface Trait : R|kotlin/Any| {
|
||||||
public abstract val property: R|kotlin/Int|
|
@PROPERTY:R|test/Anno|() public abstract val property: R|kotlin/Int|
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ public final annotation class Anno : R|kotlin/Annotation| {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public abstract interface Trait : R|kotlin/Any| {
|
public abstract interface Trait : R|kotlin/Any| {
|
||||||
public abstract val property: R|kotlin/Int|
|
@PROPERTY:R|test/Anno|() public abstract val property: R|kotlin/Int|
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -19,11 +19,11 @@ public abstract interface I : R|kotlin/Any| {
|
|||||||
@R|test/A|(value = String(getter)) public get(): R|kotlin/Int|
|
@R|test/A|(value = String(getter)) public get(): R|kotlin/Int|
|
||||||
@R|test/B|(value = <implicitArrayOf>(String(setter))) public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
|
@R|test/B|(value = <implicitArrayOf>(String(setter))) public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
|
||||||
|
|
||||||
public abstract var propertyAndGetter: R|kotlin/Int|
|
@PROPERTY:R|test/A|(value = String(property)) public abstract var propertyAndGetter: R|kotlin/Int|
|
||||||
@R|test/B|(value = <implicitArrayOf>(String(getter))) public get(): R|kotlin/Int|
|
@R|test/B|(value = <implicitArrayOf>(String(getter))) public get(): R|kotlin/Int|
|
||||||
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
||||||
|
|
||||||
public abstract var propertyAndSetter: R|kotlin/Int|
|
@PROPERTY:R|test/A|(value = String(property)) public abstract var propertyAndSetter: R|kotlin/Int|
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
@R|test/B|(value = <implicitArrayOf>(String(setter))) public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
|
@R|test/B|(value = <implicitArrayOf>(String(setter))) public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
|
||||||
|
|
||||||
|
|||||||
+1
@@ -78,6 +78,7 @@ abstract class AbstractAnnotationDeserializer(
|
|||||||
open fun loadPropertyAnnotations(
|
open fun loadPropertyAnnotations(
|
||||||
containerSource: DeserializedContainerSource?,
|
containerSource: DeserializedContainerSource?,
|
||||||
propertyProto: ProtoBuf.Property,
|
propertyProto: ProtoBuf.Property,
|
||||||
|
containingClassProto: ProtoBuf.Class?,
|
||||||
nameResolver: NameResolver,
|
nameResolver: NameResolver,
|
||||||
typeTable: TypeTable
|
typeTable: TypeTable
|
||||||
): List<FirAnnotationCall> {
|
): List<FirAnnotationCall> {
|
||||||
|
|||||||
+1
-1
@@ -311,7 +311,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
|||||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||||
annotations +=
|
annotations +=
|
||||||
c.annotationDeserializer.loadPropertyAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable)
|
c.annotationDeserializer.loadPropertyAnnotations(c.containerSource, proto, classProto, local.nameResolver, local.typeTable)
|
||||||
annotations +=
|
annotations +=
|
||||||
c.annotationDeserializer.loadPropertyBackingFieldAnnotations(
|
c.annotationDeserializer.loadPropertyBackingFieldAnnotations(
|
||||||
c.containerSource, proto, local.nameResolver, local.typeTable
|
c.containerSource, proto, local.nameResolver, local.typeTable
|
||||||
|
|||||||
+19
-3
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.deserialization.AbstractAnnotationDeserializer
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
||||||
import org.jetbrains.kotlin.load.kotlin.MemberSignature
|
import org.jetbrains.kotlin.load.kotlin.MemberSignature
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||||
@@ -26,12 +27,20 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
|||||||
class JvmBinaryAnnotationDeserializer(
|
class JvmBinaryAnnotationDeserializer(
|
||||||
val session: FirSession,
|
val session: FirSession,
|
||||||
kotlinBinaryClass: KotlinJvmBinaryClass,
|
kotlinBinaryClass: KotlinJvmBinaryClass,
|
||||||
|
kotlinClassFinder: KotlinClassFinder,
|
||||||
byteContent: ByteArray?
|
byteContent: ByteArray?
|
||||||
) : AbstractAnnotationDeserializer(session) {
|
) : AbstractAnnotationDeserializer(session) {
|
||||||
private val annotationInfo by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
private val annotationInfo by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
session.loadMemberAnnotations(kotlinBinaryClass, byteContent)
|
session.loadMemberAnnotations(kotlinBinaryClass, byteContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val annotationInfoForDefaultImpls by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
|
val defaultImplsClassId = kotlinBinaryClass.classId.createNestedClassId(Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME))
|
||||||
|
val (defaultImplsClass, defaultImplsByteContent) = kotlinClassFinder.findKotlinClassOrContent(defaultImplsClassId) as? KotlinClassFinder.Result.KotlinClass
|
||||||
|
?: return@lazy null
|
||||||
|
session.loadMemberAnnotations(defaultImplsClass, defaultImplsByteContent)
|
||||||
|
}
|
||||||
|
|
||||||
override fun inheritAnnotationInfo(parent: AbstractAnnotationDeserializer) {
|
override fun inheritAnnotationInfo(parent: AbstractAnnotationDeserializer) {
|
||||||
if (parent is JvmBinaryAnnotationDeserializer) {
|
if (parent is JvmBinaryAnnotationDeserializer) {
|
||||||
annotationInfo.memberAnnotations.putAll(parent.annotationInfo.memberAnnotations)
|
annotationInfo.memberAnnotations.putAll(parent.annotationInfo.memberAnnotations)
|
||||||
@@ -66,11 +75,13 @@ class JvmBinaryAnnotationDeserializer(
|
|||||||
override fun loadPropertyAnnotations(
|
override fun loadPropertyAnnotations(
|
||||||
containerSource: DeserializedContainerSource?,
|
containerSource: DeserializedContainerSource?,
|
||||||
propertyProto: ProtoBuf.Property,
|
propertyProto: ProtoBuf.Property,
|
||||||
|
containingClassProto: ProtoBuf.Class?,
|
||||||
nameResolver: NameResolver,
|
nameResolver: NameResolver,
|
||||||
typeTable: TypeTable
|
typeTable: TypeTable
|
||||||
): List<FirAnnotationCall> {
|
): List<FirAnnotationCall> {
|
||||||
val signature = getPropertySignature(propertyProto, nameResolver, typeTable, synthetic = true) ?: return emptyList()
|
val signature = getPropertySignature(propertyProto, nameResolver, typeTable, synthetic = true) ?: return emptyList()
|
||||||
return findJvmBinaryClassAndLoadMemberAnnotations(signature).map {
|
val classIsInterface = containingClassProto?.let { Flags.CLASS_KIND.get(it.flags) == ProtoBuf.Class.Kind.INTERFACE } ?: false
|
||||||
|
return findJvmBinaryClassAndLoadMemberAnnotations(signature, searchInDefaultImpls = classIsInterface).map {
|
||||||
buildAnnotationCall {
|
buildAnnotationCall {
|
||||||
annotationTypeRef = it.annotationTypeRef
|
annotationTypeRef = it.annotationTypeRef
|
||||||
argumentList = it.argumentList
|
argumentList = it.argumentList
|
||||||
@@ -253,9 +264,14 @@ class JvmBinaryAnnotationDeserializer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun findJvmBinaryClassAndLoadMemberAnnotations(
|
private fun findJvmBinaryClassAndLoadMemberAnnotations(
|
||||||
memberSignature: MemberSignature
|
memberSignature: MemberSignature, searchInDefaultImpls: Boolean = false
|
||||||
): List<FirAnnotationCall> {
|
): List<FirAnnotationCall> {
|
||||||
return annotationInfo.memberAnnotations[memberSignature] ?: emptyList()
|
val info = if (searchInDefaultImpls) {
|
||||||
|
annotationInfoForDefaultImpls ?: return emptyList()
|
||||||
|
} else {
|
||||||
|
annotationInfo
|
||||||
|
}
|
||||||
|
return info.memberAnnotations[memberSignature] ?: emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -112,7 +112,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
packageProto,
|
packageProto,
|
||||||
FirDeserializationContext.createForPackage(
|
FirDeserializationContext.createForPackage(
|
||||||
packageFqName, packageProto, nameResolver, session,
|
packageFqName, packageProto, nameResolver, session,
|
||||||
JvmBinaryAnnotationDeserializer(session, kotlinJvmBinaryClass, byteContent),
|
JvmBinaryAnnotationDeserializer(session, kotlinJvmBinaryClass, kotlinClassFinder, byteContent),
|
||||||
FirConstDeserializer(session, facadeBinaryClass ?: kotlinJvmBinaryClass),
|
FirConstDeserializer(session, facadeBinaryClass ?: kotlinJvmBinaryClass),
|
||||||
source
|
source
|
||||||
),
|
),
|
||||||
@@ -197,7 +197,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
val symbol = FirRegularClassSymbol(classId)
|
val symbol = FirRegularClassSymbol(classId)
|
||||||
deserializeClassToSymbol(
|
deserializeClassToSymbol(
|
||||||
classId, classProto, symbol, nameResolver, session,
|
classId, classProto, symbol, nameResolver, session,
|
||||||
JvmBinaryAnnotationDeserializer(session, kotlinClass.kotlinJvmBinaryClass, kotlinClass.byteContent),
|
JvmBinaryAnnotationDeserializer(session, kotlinClass.kotlinJvmBinaryClass, kotlinClassFinder, kotlinClass.byteContent),
|
||||||
kotlinScopeProvider,
|
kotlinScopeProvider,
|
||||||
parentContext, KotlinJvmBinarySourceElement(kotlinClass.kotlinJvmBinaryClass),
|
parentContext, KotlinJvmBinarySourceElement(kotlinClass.kotlinJvmBinaryClass),
|
||||||
deserializeNestedClass = this::getClass,
|
deserializeNestedClass = this::getClass,
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// !JVM_DEFAULT_MODE: enable
|
// !JVM_DEFAULT_MODE: enable
|
||||||
// JVM_TARGET: 1.8
|
// JVM_TARGET: 1.8
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// !JVM_DEFAULT_MODE: enable
|
// !JVM_DEFAULT_MODE: enable
|
||||||
// JVM_TARGET: 1.8
|
// JVM_TARGET: 1.8
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// !JVM_DEFAULT_MODE: enable
|
// !JVM_DEFAULT_MODE: enable
|
||||||
// JVM_TARGET: 1.8
|
// JVM_TARGET: 1.8
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
Reference in New Issue
Block a user