[FIR] Set metadata for IrFields generated from FirFields

This is useful for signature tests (see how
IrMangledNameAndSignatureDumpHandler uses `metadata` to retrieve
the original FIR declaration)
This commit is contained in:
Sergej Jaskiewicz
2023-06-15 19:28:35 +02:00
committed by Space Team
parent a436f11caf
commit d73e44b89b
4 changed files with 28 additions and 7 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.backend.jvm 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.common.actualizer.IrActualizedResult
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin 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.ClassBuilderMode
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
import org.jetbrains.kotlin.config.* 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.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.FirMetadataSource import org.jetbrains.kotlin.fir.backend.FirMetadataSource
import org.jetbrains.kotlin.fir.backend.extractFirDeclarations 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.*
import org.jetbrains.kotlin.fir.declarations.builder.* 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.ScopeSession
import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
import org.jetbrains.kotlin.fir.serialization.FirElementAwareStringTable import org.jetbrains.kotlin.fir.serialization.FirElementAwareStringTable
@@ -163,8 +161,20 @@ class FirMetadataSerializer(
} }
override fun bindFieldMetadata(metadata: MetadataSource.Property, signature: Pair<Type, String>) { override fun bindFieldMetadata(metadata: MetadataSource.Property, signature: Pair<Type, String>) {
val fir = (metadata as FirMetadataSource.Property).fir when (metadata) {
globalSerializationBindings.put(FirJvmSerializerExtension.FIELD_FOR_PROPERTY, fir, signature) 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")
}
} }
} }
@@ -1115,7 +1115,9 @@ class Fir2IrDeclarationStorage(
irParent = irClass, irParent = irClass,
typeRef = initializer?.typeRef ?: field.returnTypeRef, typeRef = initializer?.typeRef ?: field.returnTypeRef,
origin = IrDeclarationOrigin.DELEGATE origin = IrDeclarationOrigin.DELEGATE
) ).apply {
metadata = FirMetadataSource.Field(field)
}
} }
internal fun createIrField( internal fun createIrField(
@@ -1160,6 +1162,7 @@ class Fir2IrDeclarationStorage(
isExternal = false isExternal = false
) )
}.apply { }.apply {
metadata = FirMetadataSource.Field(field)
val staticFakeOverrideKey = getFieldStaticFakeOverrideKey(field, containingClassLookupTag) val staticFakeOverrideKey = getFieldStaticFakeOverrideKey(field, containingClassLookupTag)
if (staticFakeOverrideKey == null) { if (staticFakeOverrideKey == null) {
fieldCache[field] = this fieldCache[field] = this
@@ -40,5 +40,10 @@ sealed class FirMetadataSource : MetadataSource {
override val isConst: Boolean get() = fir.isConst 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 class Script(override val fir: FirScript) : FirMetadataSource(), MetadataSource.Script
} }
@@ -54,6 +54,9 @@ class ManglerChecker(
override fun visitProperty(declaration: IrProperty, data: Nothing?): Boolean = true override fun visitProperty(declaration: IrProperty, data: Nothing?): Boolean = true
override fun visitClass(declaration: IrClass, data: Nothing?): Boolean = override fun visitClass(declaration: IrClass, data: Nothing?): Boolean =
declaration.name == SpecialNames.NO_NAME_PROVIDED || super.visitClass(declaration, data) 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) private fun IrDeclaration.shouldBeSkipped(): Boolean = accept(skipper, null)