diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt index a8a007c93bc..23323d51201 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.serialization import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.serialization.constant.ConstantValue @@ -44,4 +45,7 @@ class FirAnnotationSerializer(private val session: FirSession, internal val stri FirAnnotationArgumentVisitorData(this@FirAnnotationSerializer, this) ) } + + fun valueProto(constExpression: FirConstExpression<*>): ProtoBuf.Annotation.Argument.Value.Builder? = + constExpression.toConstantValue(session)?.let { valueProto(it) } } 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 98ec272b244..c96a0b91efc 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 @@ -373,12 +373,15 @@ class FirElementSerializer private constructor( } } + val hasConstant = !property.isVar && property.initializer?.let { + it is FirConstExpression<*> && it.value != null + } ?: false val flags = Flags.getPropertyFlags( hasAnnotations, ProtoEnumFlags.visibility(normalizeVisibility(property)), ProtoEnumFlags.modality(modality), ProtoBuf.MemberKind.DECLARATION, - property.isVar, hasGetter, hasSetter, property.isConst, property.isConst, property.isLateInit, + property.isVar, hasGetter, hasSetter, hasConstant, property.isConst, property.isLateInit, property.isExternal, property.delegateFieldSymbol != null, property.isExpect ) if (flags != builder.flags) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt index 2e671273622..90372502f20 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt @@ -22,6 +22,8 @@ import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringT import org.jetbrains.kotlin.fir.serialization.FirElementSerializer import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.serializeSingleFirFile +import org.jetbrains.kotlin.fir.expressions.FirConstExpression +import org.jetbrains.kotlin.fir.serialization.* import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.IrMessageLogger @@ -31,9 +33,11 @@ import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.library.metadata.resolver.TopologicalLibraryOrder import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion +import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.utils.toMetadataVersion +import org.jetbrains.kotlin.resolve.constants.NullValue internal fun PhaseContext.firSerializer( input: Fir2IrOutput @@ -194,6 +198,10 @@ class FirNativeKLibSerializerExtension( property.setter?.nonSourceAnnotations(session)?.forEach { proto.addExtension(KlibMetadataProtoBuf.propertySetterAnnotation, annotationSerializer.serializeAnnotation(it)) } + if (Flags.HAS_CONSTANT.get(proto.flags)) + annotationSerializer.valueProto(property.initializer as FirConstExpression<*>)?.let { constBuilder -> + proto.setExtension(KlibMetadataProtoBuf.compileTimeValue, constBuilder.build()) + } // TODO KT-56090 Serialize KDocString super.serializeProperty(property, proto, versionRequirementTable, childSerializer) } diff --git a/native/native.tests/testData/klibContents/builtinsSerializer/compileTimeConstants.kt b/native/native.tests/testData/klibContents/builtinsSerializer/compileTimeConstants.kt index d38cbb55376..4a97a627e27 100644 --- a/native/native.tests/testData/klibContents/builtinsSerializer/compileTimeConstants.kt +++ b/native/native.tests/testData/klibContents/builtinsSerializer/compileTimeConstants.kt @@ -1,5 +1,7 @@ -// KT-56190 K2 does not emit const initializers +// KT-56190: the following properties miss their initializers: arrayConst, b, enumConst // MUTED_WHEN: K2 +// IGNORE_BACKEND_K2 + package test enum class Weapon { diff --git a/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.kt b/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.kt index bbe8ebc0462..84f378deee7 100644 --- a/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.kt +++ b/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.kt @@ -1,5 +1,3 @@ -// KT-56190 K2 does not emit const initializers -// MUTED_WHEN: K2 package test class ClassA { @@ -18,7 +16,9 @@ class ClassA { inner class classC { val memberFromC: Int = 200 } +} +class E { companion object { val stat: Int = 250 @@ -26,7 +26,9 @@ class ClassA { val memberFromD: Int = 275 } } +} +class F { object ObjA { val memberFromObjA: Int = 300 } diff --git a/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.txt b/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.txt index e6b2e12cbcc..b6dacc8b108 100644 --- a/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.txt +++ b/native/native.tests/testData/klibContents/builtinsSerializer/nestedClassesAndObjects.txt @@ -1,13 +1,4 @@ class ClassA constructor() { - companion object { - val stat: Int = 250 - class D constructor() { - val memberFromD: Int = 275 - } - } - object ObjA { - val memberFromObjA: Int = 300 - } class classB constructor() { fun memberFromB(): Int class BC constructor() { @@ -20,4 +11,17 @@ inner class classC constructor() { val memberFromC: Int = 200 } + } + class E constructor() { + companion object { + val stat: Int = 250 + class D constructor() { + val memberFromD: Int = 275 + } + } + } + class F constructor() { + object ObjA { + val memberFromObjA: Int = 300 + } } \ No newline at end of file diff --git a/native/native.tests/testData/klibContents/builtinsSerializer/propertyAccessorAnnotations.kt b/native/native.tests/testData/klibContents/builtinsSerializer/propertyAccessorAnnotations.kt index 7715a293ffa..c811408f596 100644 --- a/native/native.tests/testData/klibContents/builtinsSerializer/propertyAccessorAnnotations.kt +++ b/native/native.tests/testData/klibContents/builtinsSerializer/propertyAccessorAnnotations.kt @@ -1,5 +1,3 @@ -// KT-56190 K2 does not emit const initializers -// MUTED_WHEN: K2 package test annotation class Anno(val value: String)