[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
|
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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user