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 548b40d44c4..fd58adca5af 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 @@ -11,10 +11,12 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* +import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.utils.sourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub import org.jetbrains.kotlin.fir.resolve.defaultType @@ -402,14 +404,23 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } annotations += c.annotationDeserializer.loadPropertyAnnotations(c.containerSource, proto, classProto, local.nameResolver, local.typeTable) - annotations += + val backingFieldAnnotations = mutableListOf() + backingFieldAnnotations += c.annotationDeserializer.loadPropertyBackingFieldAnnotations( c.containerSource, proto, local.nameResolver, local.typeTable ) - annotations += + backingFieldAnnotations += c.annotationDeserializer.loadPropertyDelegatedFieldAnnotations( c.containerSource, proto, local.nameResolver, local.typeTable ) + backingField = FirDefaultPropertyBackingField( + c.moduleData, + backingFieldAnnotations, + returnTypeRef, + isVar, + symbol, + status + ) if (hasGetter) { this.getter = loadPropertyGetter( proto, diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 0964ddf8b05..3227ad2f006 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -331,7 +331,7 @@ class FirElementSerializer private constructor( var hasSetter = false val hasAnnotations = property.nonSourceAnnotations(session).isNotEmpty() - // TODO: hasAnnotations(descriptor) || hasAnnotations(descriptor.backingField) || hasAnnotations(descriptor.delegateField) + || property.backingField?.nonSourceAnnotations(session)?.isNotEmpty() == true val modality = property.modality!! val defaultAccessorFlags = Flags.getAccessorFlags( diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtensionBase.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtensionBase.kt index 47d1e052f22..2c85ffd0ca7 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtensionBase.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtensionBase.kt @@ -59,20 +59,18 @@ abstract class FirSerializerExtensionBase( versionRequirementTable: MutableVersionRequirementTable?, childSerializer: FirElementSerializer ) { - val regularPropertyAnnotations = mutableListOf() val fieldPropertyAnnotations = mutableListOf() val delegatePropertyAnnotations = mutableListOf() - for (annotation in property.nonSourceAnnotations(session)) { + for (annotation in property.backingField?.nonSourceAnnotations(session).orEmpty()) { val destination = when (annotation.useSiteTarget) { - AnnotationUseSiteTarget.FIELD -> fieldPropertyAnnotations AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD -> delegatePropertyAnnotations - else -> regularPropertyAnnotations + else -> fieldPropertyAnnotations } destination += annotation } - regularPropertyAnnotations.serializeAnnotations(proto, protocol.propertyAnnotation) + property.nonSourceAnnotations(session).serializeAnnotations(proto, protocol.propertyAnnotation) fieldPropertyAnnotations.serializeAnnotations(proto, protocol.propertyBackingFieldAnnotation) delegatePropertyAnnotations.serializeAnnotations(proto, protocol.propertyDelegatedFieldAnnotation) diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/ClassObjectPropertyField.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/ClassObjectPropertyField.fir.txt index a0dd4ad5736..1181c3647c7 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/ClassObjectPropertyField.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/ClassObjectPropertyField.fir.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| { - @FIELD:R|test/Anno|() public final var property: R|kotlin/Int| + field:@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/testData/loadJava/compiledKotlin/annotations/classMembers/EnumArgument.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumArgument.fir.txt index f2e8605aa06..bdccd61c408 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumArgument.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/EnumArgument.fir.txt @@ -9,7 +9,7 @@ public final annotation class Anno : R|kotlin/Annotation| { public final class Class : R|kotlin/Any| { @R|test/Anno|(t = R|java/lang/annotation/ElementType.METHOD|) public final fun foo(): R|kotlin/Unit| - @FIELD:R|test/Anno|(t = R|java/lang/annotation/ElementType.FIELD|) public final var bar: R|kotlin/Int| + field:@FIELD:R|test/Anno|(t = R|java/lang/annotation/ElementType.FIELD|) public final var bar: R|kotlin/Int| public get(): R|kotlin/Int| public set(value: R|kotlin/Int|): R|kotlin/Unit| diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PropertyField.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PropertyField.fir.txt index 60045fe3513..35f1780110c 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PropertyField.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PropertyField.fir.txt @@ -4,7 +4,7 @@ public final annotation class Anno : R|kotlin/Annotation| { } public final class Class : R|kotlin/Any| { - @FIELD:R|test/Anno|() public final var property: R|kotlin/Int| + field:@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/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.fir.txt index fdad1899447..9dec000d1e1 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.fir.txt @@ -1,4 +1,4 @@ -@FIELD:R|test/Anno|(t = R|java/lang/annotation/ElementType.FIELD|) public final val bar: R|kotlin/Int| +field:@FIELD:R|test/Anno|(t = R|java/lang/annotation/ElementType.FIELD|) public final val bar: R|kotlin/Int| public get(): R|kotlin/Int| @R|test/Anno|(t = R|java/lang/annotation/ElementType.METHOD|) public final fun foo(): R|kotlin/Unit| diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArrayArgument.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArrayArgument.fir.txt index f9f9d4cc2eb..a3571a9345f 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArrayArgument.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArrayArgument.fir.txt @@ -1,4 +1,4 @@ -@FIELD:R|test/Anno|(t = (R|java/lang/annotation/ElementType.PACKAGE|)) public final val bar: R|kotlin/Int| +field:@FIELD:R|test/Anno|(t = (R|java/lang/annotation/ElementType.PACKAGE|)) public final val bar: R|kotlin/Int| public get(): R|kotlin/Int| @R|test/Anno|(t = ()) public final fun baz(): R|kotlin/Unit| diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/PropertyField.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/PropertyField.fir.txt index 8591de79b4d..3d66a752793 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/PropertyField.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/PropertyField.fir.txt @@ -1,4 +1,4 @@ -@FIELD:R|test/Anno|() public final var property: R|kotlin/Int| +field:@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/testData/loadJava/compiledKotlin/annotations/packageMembers/StringArrayArgument.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/StringArrayArgument.fir.txt index 345ef1a609b..fa0e6675255 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/StringArrayArgument.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/StringArrayArgument.fir.txt @@ -1,4 +1,4 @@ -@FIELD:R|test/Anno|(t = (String(prosper))) public final val bar: R|kotlin/Int| +field:@FIELD:R|test/Anno|(t = (String(prosper))) public final val bar: R|kotlin/Int| public get(): R|kotlin/Int| @R|test/Anno|(t = ()) public final fun baz(): R|kotlin/Unit| diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/DelegateTarget.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/DelegateTarget.fir.txt index bcae73fdb7a..acb39e8dce5 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/DelegateTarget.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/DelegateTarget.fir.txt @@ -4,7 +4,7 @@ public final annotation class Anno : R|kotlin/Annotation| { } public final class Class : R|kotlin/Any| { - @PROPERTY_DELEGATE_FIELD:R|test/Anno|() public final val property: R|kotlin/String| + field:@PROPERTY_DELEGATE_FIELD:R|test/Anno|() public final val property: R|kotlin/String| public get(): R|kotlin/String| public constructor(): R|test/Class| diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/FieldTarget.fir.txt b/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/FieldTarget.fir.txt index 60045fe3513..35f1780110c 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/FieldTarget.fir.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget/FieldTarget.fir.txt @@ -4,7 +4,7 @@ public final annotation class Anno : R|kotlin/Annotation| { } public final class Class : R|kotlin/Any| { - @FIELD:R|test/Anno|() public final var property: R|kotlin/Int| + field:@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/testData/loadJava/compiledKotlinWithStdlib/annotations/JvmFieldInInterfaceCompanion.fir.txt b/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/JvmFieldInInterfaceCompanion.fir.txt index 6d787dc6688..72399ef5df5 100644 --- a/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/JvmFieldInInterfaceCompanion.fir.txt +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/annotations/JvmFieldInInterfaceCompanion.fir.txt @@ -1,9 +1,9 @@ public abstract interface I : R|kotlin/Any| { public final companion object Companion : R|kotlin/Any| { - @FIELD:R|kotlin/jvm/JvmField|() public final val x: R|kotlin/String| + field:@FIELD:R|kotlin/jvm/JvmField|() public final val x: R|kotlin/String| public get(): R|kotlin/String| - @FIELD:R|kotlin/jvm/JvmField|() public final val y: R|kotlin/String| + field:@FIELD:R|kotlin/jvm/JvmField|() public final val y: R|kotlin/String| public get(): R|kotlin/String| private constructor(): R|test/I.Companion| diff --git a/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k1.txt b/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k1.txt index b24a177df13..956c37bb81b 100644 --- a/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k1.txt +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k1.txt @@ -1,6 +1,6 @@ @R|test/A|(s = String(1)) @R|kotlin/jvm/JvmName|(name = String(bar)) public final fun foo(): R|kotlin/String| -@FIELD:R|test/A|(s = String(2)) public final var v: R|kotlin/Int| +field:@FIELD:R|test/A|(s = String(2)) public final var v: R|kotlin/Int| @R|test/A|(s = String(3)) @R|kotlin/jvm/JvmName|(name = String(vget)) public get(): R|kotlin/Int| @R|test/A|(s = String(4)) @R|kotlin/jvm/JvmName|(name = String(vset)) public set(: R|kotlin/Int|): R|kotlin/Unit| diff --git a/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k2.txt b/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k2.txt index f2b02b534c3..ddaf8007092 100644 --- a/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k2.txt +++ b/compiler/testData/loadJava/compiledKotlinWithStdlib/platformNames/functionName.fir.k2.txt @@ -1,6 +1,6 @@ @R|test/A|(s = String(1)) @R|kotlin/jvm/JvmName|(name = String(bar)) public final fun foo(): R|kotlin/String| -@FIELD:R|test/A|(s = String(2)) public final var v: R|kotlin/Int| +field:@FIELD:R|test/A|(s = String(2)) public final var v: R|kotlin/Int| @R|test/A|(s = String(3)) @R|kotlin/jvm/JvmName|(name = String(vget)) public get(): R|kotlin/Int| @R|test/A|(s = String(4)) @R|kotlin/jvm/JvmName|(name = String(vset)) public set(value: R|kotlin/Int|): R|kotlin/Unit|