[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
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<Type, String>) {
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")
}
}
}
@@ -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
@@ -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
}
@@ -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)