[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:
committed by
Space Team
parent
a436f11caf
commit
d73e44b89b
+16
-6
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -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
|
||||
}
|
||||
|
||||
+3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user