diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt index e522278140f..bb5b01c819d 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.backend.jvm +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin @@ -12,15 +13,12 @@ import org.jetbrains.kotlin.backend.jvm.metadata.MetadataSerializer import org.jetbrains.kotlin.codegen.ClassBuilderMode import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.FirMetadataSource import org.jetbrains.kotlin.fir.backend.extractFirDeclarations -import org.jetbrains.kotlin.fir.containingClassForLocal import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* -import org.jetbrains.kotlin.fir.languageVersionSettings -import org.jetbrains.kotlin.fir.packageFqName import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.fir.serialization.FirElementAwareStringTable @@ -163,8 +161,20 @@ class FirMetadataSerializer( } override fun bindFieldMetadata(metadata: MetadataSource.Property, signature: Pair) { - val fir = (metadata as FirMetadataSource.Property).fir - globalSerializationBindings.put(FirJvmSerializerExtension.FIELD_FOR_PROPERTY, fir, signature) + when (metadata) { + is FirMetadataSource.Property -> globalSerializationBindings.put( + FirJvmSerializerExtension.FIELD_FOR_PROPERTY, + metadata.fir, + signature, + ) + is FirMetadataSource.Field -> metadata.fir.run { + // We don't serialize synthetic delegate fields, and we don't expect any other fields here. + require(source?.kind == KtFakeSourceElementKind.ClassDelegationField) { + "Expected delegate field, got ${render()} with source kind ${source?.kind}" + } + } + else -> error("Unexpected metadata: $metadata") + } } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 853cadc85b6..5de2932ecf2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -1115,7 +1115,9 @@ class Fir2IrDeclarationStorage( irParent = irClass, typeRef = initializer?.typeRef ?: field.returnTypeRef, origin = IrDeclarationOrigin.DELEGATE - ) + ).apply { + metadata = FirMetadataSource.Field(field) + } } internal fun createIrField( @@ -1160,6 +1162,7 @@ class Fir2IrDeclarationStorage( isExternal = false ) }.apply { + metadata = FirMetadataSource.Field(field) val staticFakeOverrideKey = getFieldStaticFakeOverrideKey(field, containingClassLookupTag) if (staticFakeOverrideKey == null) { fieldCache[field] = this diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirMetadataSource.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirMetadataSource.kt index bfb4ff77a97..195166ec3e2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirMetadataSource.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirMetadataSource.kt @@ -40,5 +40,10 @@ sealed class FirMetadataSource : MetadataSource { override val isConst: Boolean get() = fir.isConst } + class Field(override val fir: FirField) : FirMetadataSource(), MetadataSource.Property { + override val isConst: Boolean + get() = fir.isConst + } + class Script(override val fir: FirScript) : FirMetadataSource(), MetadataSource.Script } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ManglerChecker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ManglerChecker.kt index 8a71d854e0a..54ec7e3660a 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ManglerChecker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ManglerChecker.kt @@ -54,6 +54,9 @@ class ManglerChecker( override fun visitProperty(declaration: IrProperty, data: Nothing?): Boolean = true override fun visitClass(declaration: IrClass, data: Nothing?): Boolean = declaration.name == SpecialNames.NO_NAME_PROVIDED || super.visitClass(declaration, data) + + override fun visitField(declaration: IrField, data: Nothing?): Boolean = + declaration.origin == IrDeclarationOrigin.DELEGATE || super.visitField(declaration, data) } private fun IrDeclaration.shouldBeSkipped(): Boolean = accept(skipper, null)