[IR] Reorder parameters in IrFactory#createField

This is to prepare for IrFactory auto-generation (KT-59308).
This commit is contained in:
Sergej Jaskiewicz
2023-06-13 19:43:58 +02:00
committed by Space Team
parent 90f6c53bf8
commit 0b7db067e6
18 changed files with 173 additions and 108 deletions
@@ -149,15 +149,16 @@ class Fir2IrClassifierStorage(
val contextReceiverFields = mutableListOf<IrField>() val contextReceiverFields = mutableListOf<IrField>()
for ((index, contextReceiver) in klass.contextReceivers.withIndex()) { for ((index, contextReceiver) in klass.contextReceivers.withIndex()) {
val irField = components.irFactory.createField( val irField = components.irFactory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER, endOffset = UNDEFINED_OFFSET,
IrFieldSymbolImpl(), origin = IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
Name.identifier("contextReceiverField$index"), name = Name.identifier("contextReceiverField$index"),
contextReceiver.typeRef.toIrType(), visibility = DescriptorVisibilities.PRIVATE,
DescriptorVisibilities.PRIVATE, symbol = IrFieldSymbolImpl(),
type = contextReceiver.typeRef.toIrType(),
isFinal = true, isFinal = true,
isStatic = false,
isExternal = false, isExternal = false,
isStatic = false
) )
irField.parent = this@createContextReceiverFields irField.parent = this@createContextReceiverFields
contextReceiverFields.add(irField) contextReceiverFields.add(irField)
@@ -798,11 +798,16 @@ class Fir2IrDeclarationStorage(
val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType() val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType()
return declareIrField { symbol -> return declareIrField { symbol ->
irFactory.createField( irFactory.createField(
startOffset, endOffset, origin, symbol, startOffset = startOffset,
name, inferredType, endOffset = endOffset,
visibility, isFinal = isFinal, origin = origin,
isExternal = property.isExternal, name = name,
visibility = visibility,
symbol = symbol,
type = inferredType,
isFinal = isFinal,
isStatic = property.isStatic || !(parent is IrClass || parent is IrScript), isStatic = property.isStatic || !(parent is IrClass || parent is IrScript),
isExternal = property.isExternal,
).also { ).also {
it.correspondingPropertySymbol = this@createBackingField.symbol it.correspondingPropertySymbol = this@createBackingField.symbol
}.apply { }.apply {
@@ -1122,20 +1127,30 @@ class Fir2IrDeclarationStorage(
signature, symbolFactory = { IrFieldPublicSymbolImpl(signature) } signature, symbolFactory = { IrFieldPublicSymbolImpl(signature) }
) { symbol -> ) { symbol ->
irFactory.createField( irFactory.createField(
startOffset, endOffset, origin, symbol, startOffset = startOffset,
field.name, type, components.visibilityConverter.convertToDescriptorVisibility(field.visibility), endOffset = endOffset,
origin = origin,
name = field.name,
visibility = components.visibilityConverter.convertToDescriptorVisibility(field.visibility),
symbol = symbol,
type = type,
isFinal = field.modality == Modality.FINAL, isFinal = field.modality == Modality.FINAL,
isExternal = false, isStatic = field.isStatic,
isStatic = field.isStatic isExternal = false
) )
} }
} else { } else {
irFactory.createField( irFactory.createField(
startOffset, endOffset, origin, IrFieldSymbolImpl(), startOffset = startOffset,
field.name, type, components.visibilityConverter.convertToDescriptorVisibility(field.visibility), endOffset = endOffset,
origin = origin,
name = field.name,
visibility = components.visibilityConverter.convertToDescriptorVisibility(field.visibility),
symbol = IrFieldSymbolImpl(),
type = type,
isFinal = field.modality == Modality.FINAL, isFinal = field.modality == Modality.FINAL,
isExternal = false, isStatic = field.isStatic,
isStatic = field.isStatic isExternal = false
) )
}.apply { }.apply {
val staticFakeOverrideKey = getFieldStaticFakeOverrideKey(field, containingClassLookupTag) val staticFakeOverrideKey = getFieldStaticFakeOverrideKey(field, containingClassLookupTag)
@@ -856,14 +856,16 @@ class LocalDeclarationsLowering(
else else
DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE
context.irFactory.createField( context.irFactory.createField(
classDeclaration.startOffset, startOffset = classDeclaration.startOffset,
classDeclaration.endOffset, endOffset = classDeclaration.endOffset,
origin, origin = origin,
symbol, name = suggestNameForCapturedValue(capturedValue, generatedNames),
suggestNameForCapturedValue(capturedValue, generatedNames), visibility = visibilityPolicy.forCapturedField(capturedValue.symbol),
capturedValue.type, symbol = symbol,
visibilityPolicy.forCapturedField(capturedValue.symbol), type = capturedValue.type,
isFinal = true, isExternal = false, isStatic = false, isFinal = true,
isStatic = false,
isExternal = false,
).also { ).also {
it.parent = classDeclaration it.parent = classDeclaration
} }
@@ -173,9 +173,16 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext, val inner
val earlierScriptField = irScript.earlierScriptsParameter?.let { earlierScriptsParameter -> val earlierScriptField = irScript.earlierScriptsParameter?.let { earlierScriptsParameter ->
irScriptClass.factory.createField( irScriptClass.factory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.SCRIPT_EARLIER_SCRIPTS, startOffset = UNDEFINED_OFFSET,
IrFieldSymbolImpl(), Name.identifier("\$\$earlierScripts"), earlierScriptsParameter.type, endOffset = UNDEFINED_OFFSET,
DescriptorVisibilities.PRIVATE, isFinal = true, isExternal = false, isStatic = false origin = IrDeclarationOrigin.SCRIPT_EARLIER_SCRIPTS,
name = Name.identifier("\$\$earlierScripts"),
visibility = DescriptorVisibilities.PRIVATE,
symbol = IrFieldSymbolImpl(),
type = earlierScriptsParameter.type,
isFinal = true,
isStatic = false,
isExternal = false,
) )
}?.also { }?.also {
it.parent = irScriptClass it.parent = irScriptClass
@@ -185,10 +192,16 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext, val inner
val implicitReceiversFieldsWithParameters = arrayListOf<Pair<IrField, IrValueParameter>>().apply { val implicitReceiversFieldsWithParameters = arrayListOf<Pair<IrField, IrValueParameter>>().apply {
irScript.implicitReceiversParameters.forEach { param -> irScript.implicitReceiversParameters.forEach { param ->
val field = irScriptClass.factory.createField( val field = irScriptClass.factory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.SCRIPT_IMPLICIT_RECEIVER, startOffset = UNDEFINED_OFFSET,
IrFieldSymbolImpl(), Name.identifier("\$\$implicitReceiver_${param.type.classFqName?.shortName()?.asString()!!}"), endOffset = UNDEFINED_OFFSET,
typeRemapper.remapType(param.type), origin = IrDeclarationOrigin.SCRIPT_IMPLICIT_RECEIVER,
DescriptorVisibilities.PRIVATE, isFinal = true, isExternal = false, isStatic = false name = Name.identifier("\$\$implicitReceiver_${param.type.classFqName?.shortName()?.asString()!!}"),
visibility = DescriptorVisibilities.PRIVATE,
symbol = IrFieldSymbolImpl(),
type = typeRemapper.remapType(param.type),
isFinal = true,
isStatic = false,
isExternal = false
) )
field.parent = irScriptClass field.parent = irScriptClass
irScriptClass.declarations.add(field) irScriptClass.declarations.add(field)
@@ -101,15 +101,16 @@ internal class WasmPropertyReferenceLowering(val context: WasmBackendContext) :
val kPropertiesField = val kPropertiesField =
context.irFactory.createField( context.irFactory.createField(
SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, startOffset = SYNTHETIC_OFFSET,
DECLARATION_ORIGIN_KPROPERTIES_FOR_DELEGATION, endOffset = SYNTHETIC_OFFSET,
IrFieldSymbolImpl(), origin = DECLARATION_ORIGIN_KPROPERTIES_FOR_DELEGATION,
Name.identifier("\$KPROPERTIES"), name = Name.identifier("\$KPROPERTIES"),
kPropertiesFieldType, visibility = DescriptorVisibilities.PRIVATE,
DescriptorVisibilities.PRIVATE, symbol = IrFieldSymbolImpl(),
type = kPropertiesFieldType,
isFinal = true, isFinal = true,
isExternal = false,
isStatic = true, isStatic = true,
isExternal = false,
).apply { ).apply {
parent = irFile parent = irFile
} }
@@ -172,16 +172,16 @@ class WasmSharedVariablesManager(val context: JsCommonBackendContext, val builtI
val symbol = IrFieldSymbolImpl() val symbol = IrFieldSymbolImpl()
val fieldName = Name.identifier("v") val fieldName = Name.identifier("v")
return context.irFactory.createField( return context.irFactory.createField(
UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET,
IrDeclarationOrigin.FIELD_FOR_OUTER_THIS, origin = IrDeclarationOrigin.FIELD_FOR_OUTER_THIS,
symbol, name = fieldName,
fieldName, visibility = DescriptorVisibilities.PUBLIC,
builtIns.anyNType, symbol = symbol,
DescriptorVisibilities.PUBLIC, type = builtIns.anyNType,
isFinal = false, isFinal = false,
isExternal = false,
isStatic = false, isStatic = false,
isExternal = false,
).also { ).also {
it.parent = closureBoxClassDeclaration it.parent = closureBoxClassDeclaration
closureBoxClassDeclaration.declarations += it closureBoxClassDeclaration.declarations += it
@@ -451,15 +451,16 @@ internal class ClassGenerator(
private fun generateFieldsForContextReceivers(irClass: IrClass, classDescriptor: ClassDescriptor) { private fun generateFieldsForContextReceivers(irClass: IrClass, classDescriptor: ClassDescriptor) {
for ((fieldIndex, receiverDescriptor) in classDescriptor.contextReceivers.withIndex()) { for ((fieldIndex, receiverDescriptor) in classDescriptor.contextReceivers.withIndex()) {
val irField = context.irFactory.createField( val irField = context.irFactory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER, endOffset = UNDEFINED_OFFSET,
IrFieldSymbolImpl(), origin = IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
Name.identifier("contextReceiverField$fieldIndex"), name = Name.identifier("contextReceiverField$fieldIndex"),
receiverDescriptor.type.toIrType(), visibility = DescriptorVisibilities.PRIVATE,
DescriptorVisibilities.PRIVATE, symbol = IrFieldSymbolImpl(),
type = receiverDescriptor.type.toIrType(),
isFinal = true, isFinal = true,
isStatic = false,
isExternal = false, isExternal = false,
isStatic = false
) )
context.additionalDescriptorStorage.put(receiverDescriptor.value, irField) context.additionalDescriptorStorage.put(receiverDescriptor.value, irField)
irClass.addMember(irField) irClass.addMember(irField)
@@ -143,8 +143,16 @@ internal class DelegatedPropertyGenerator(
startOffset, endOffset, origin, delegateDescriptor, type startOffset, endOffset, origin, delegateDescriptor, type
) { ) {
context.irFactory.createField( context.irFactory.createField(
startOffset, endOffset, origin, it, delegateDescriptor.name, type, delegateDescriptor.visibility, startOffset = startOffset,
!delegateDescriptor.isVar, false, delegateDescriptor.dispatchReceiverParameter == null endOffset = endOffset,
origin = origin,
name = delegateDescriptor.name,
visibility = delegateDescriptor.visibility,
symbol = it,
type = type,
isFinal = !delegateDescriptor.isVar,
isStatic = delegateDescriptor.dispatchReceiverParameter == null,
isExternal = false
).apply { ).apply {
metadata = DescriptorMetadataSource.Property(propertyDescriptor) metadata = DescriptorMetadataSource.Property(propertyDescriptor)
} }
@@ -43,9 +43,16 @@ inline fun IrFactory.buildClass(builder: IrClassBuilder.() -> Unit) =
@PublishedApi @PublishedApi
internal fun IrFactory.buildField(builder: IrFieldBuilder): IrField = with(builder) { internal fun IrFactory.buildField(builder: IrFieldBuilder): IrField = with(builder) {
createField( createField(
startOffset, endOffset, origin, startOffset = startOffset,
IrFieldSymbolImpl(), endOffset = endOffset,
name, type, visibility, isFinal, isExternal, isStatic, origin = origin,
name = name,
visibility = visibility,
symbol = IrFieldSymbolImpl(),
type = type,
isFinal = isFinal,
isStatic = isStatic,
isExternal = isExternal,
).also { ).also {
it.metadata = metadata it.metadata = metadata
} }
@@ -79,13 +79,13 @@ interface IrFactory {
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrFieldSymbol,
name: Name, name: Name,
type: IrType,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrFieldSymbol,
type: IrType,
isFinal: Boolean, isFinal: Boolean,
isExternal: Boolean,
isStatic: Boolean, isStatic: Boolean,
isExternal: Boolean,
): IrField ): IrField
fun createFunction( fun createFunction(
@@ -97,13 +97,13 @@ abstract class AbstractIrFactoryImpl : IrFactory {
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrFieldSymbol,
name: Name, name: Name,
type: IrType,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrFieldSymbol,
type: IrType,
isFinal: Boolean, isFinal: Boolean,
isExternal: Boolean,
isStatic: Boolean, isStatic: Boolean,
isExternal: Boolean,
): IrField = ): IrField =
IrFieldImpl(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic, factory = this) IrFieldImpl(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic, factory = this)
@@ -138,25 +138,25 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrFieldSymbol,
name: Name, name: Name,
type: IrType,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrFieldSymbol,
type: IrType,
isFinal: Boolean, isFinal: Boolean,
isExternal: Boolean, isStatic: Boolean,
isStatic: Boolean isExternal: Boolean
): IrField { ): IrField {
return super.createField( return super.createField(
startOffset, startOffset,
endOffset, endOffset,
origin, origin,
symbol,
name, name,
type,
visibility, visibility,
symbol,
type,
isFinal, isFinal,
isExternal,
isStatic, isStatic,
isExternal,
).register() ).register()
} }
@@ -81,17 +81,17 @@ class LazyIrFactory(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrFieldSymbol,
name: Name, name: Name,
type: IrType,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrFieldSymbol,
type: IrType,
isFinal: Boolean, isFinal: Boolean,
isExternal: Boolean, isStatic: Boolean,
isStatic: Boolean isExternal: Boolean
): IrField = if (symbol.isBound) ): IrField = if (symbol.isBound)
symbol.owner symbol.owner
else else
delegate.createField(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic) delegate.createField(startOffset, endOffset, origin, name, visibility, symbol, type, isFinal, isStatic, isExternal)
override fun createFunction( override fun createFunction(
startOffset: Int, startOffset: Int,
@@ -264,15 +264,16 @@ open class DeepCopyIrTreeWithSymbols(
override fun visitField(declaration: IrField): IrField = override fun visitField(declaration: IrField): IrField =
declaration.factory.createField( declaration.factory.createField(
declaration.startOffset, declaration.endOffset, startOffset = declaration.startOffset,
mapDeclarationOrigin(declaration.origin), endOffset = declaration.endOffset,
symbolRemapper.getDeclaredField(declaration.symbol), origin = mapDeclarationOrigin(declaration.origin),
symbolRenamer.getFieldName(declaration.symbol), name = symbolRenamer.getFieldName(declaration.symbol),
declaration.type.remapType(), visibility = declaration.visibility,
declaration.visibility, symbol = symbolRemapper.getDeclaredField(declaration.symbol),
type = declaration.type.remapType(),
isFinal = declaration.isFinal, isFinal = declaration.isFinal,
isExternal = declaration.isExternal,
isStatic = declaration.isStatic, isStatic = declaration.isStatic,
isExternal = declaration.isExternal,
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
initializer = declaration.initializer?.transform() initializer = declaration.initializer?.transform()
@@ -715,9 +715,16 @@ open class SymbolTable(
visibility: DescriptorVisibility? = null, visibility: DescriptorVisibility? = null,
fieldFactory: (IrFieldSymbol) -> IrField = { fieldFactory: (IrFieldSymbol) -> IrField = {
irFactory.createField( irFactory.createField(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(descriptor), type, startOffset = startOffset,
visibility ?: it.descriptor.visibility, !it.descriptor.isVar, it.descriptor.isEffectivelyExternal(), endOffset = endOffset,
it.descriptor.dispatchReceiverParameter == null origin = origin,
name = nameProvider.nameForDeclaration(descriptor),
visibility = visibility ?: it.descriptor.visibility,
symbol = it,
type = type,
isFinal = !it.descriptor.isVar,
isStatic = it.descriptor.dispatchReceiverParameter == null,
isExternal = it.descriptor.isEffectivelyExternal(),
).apply { ).apply {
metadata = DescriptorMetadataSource.Property(it.descriptor) metadata = DescriptorMetadataSource.Property(it.descriptor)
} }
@@ -690,14 +690,16 @@ class IrDeclarationDeserializer(
val field = symbolTable.declareField(uniqId, { symbol.checkSymbolType(FIELD_SYMBOL) }) { val field = symbolTable.declareField(uniqId, { symbol.checkSymbolType(FIELD_SYMBOL) }) {
irFactory.createField( irFactory.createField(
startOffset, endOffset, origin, startOffset = startOffset,
it, endOffset = endOffset,
deserializeName(nameType.nameIndex), origin = origin,
type, name = deserializeName(nameType.nameIndex),
flags.visibility, visibility = flags.visibility,
flags.isFinal, symbol = it,
flags.isExternal || isEffectivelyExternal, type = type,
flags.isStatic, isFinal = flags.isFinal,
isStatic = flags.isStatic,
isExternal = flags.isExternal || isEffectivelyExternal,
) )
} }
@@ -167,16 +167,16 @@ internal class CStructVarClassGenerator(
} }
val cleanerField = irFactory.createField( val cleanerField = irFactory.createField(
SYNTHETIC_OFFSET, startOffset = SYNTHETIC_OFFSET,
SYNTHETIC_OFFSET, endOffset = SYNTHETIC_OFFSET,
IrDeclarationOrigin.DEFINED, origin = IrDeclarationOrigin.DEFINED,
IrFieldSymbolImpl(), name = Name.identifier("cleaner"),
Name.identifier("cleaner"), visibility = DescriptorVisibilities.PRIVATE,
symbols.createCleaner.owner.returnType, symbol = IrFieldSymbolImpl(),
DescriptorVisibilities.PRIVATE, type = symbols.createCleaner.owner.returnType,
isFinal = true, isFinal = true,
isStatic = false,
isExternal = false, isExternal = false,
isStatic = false
).also { field -> ).also { field ->
field.parent = irClass field.parent = irClass
field.initializer = irBuilder(irBuiltIns, field.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).run { field.initializer = irBuilder(irBuiltIns, field.symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET).run {
@@ -136,9 +136,16 @@ fun AndroidIrBuilder.getParcelableCreator(irClass: IrClass): IrExpression {
// field access. // field access.
val creatorType = androidSymbols.androidOsParcelableCreator.typeWith(irClass.symbol.starProjectedType) val creatorType = androidSymbols.androidOsParcelableCreator.typeWith(irClass.symbol.starProjectedType)
val creatorField = irClass.factory.createField( val creatorField = irClass.factory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, startOffset = UNDEFINED_OFFSET,
IrFieldSymbolImpl(), CREATOR_NAME, creatorType, DescriptorVisibilities.PUBLIC, endOffset = UNDEFINED_OFFSET,
isFinal = true, isExternal = false, isStatic = true, origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB,
name = CREATOR_NAME,
visibility = DescriptorVisibilities.PUBLIC,
symbol = IrFieldSymbolImpl(),
type = creatorType,
isFinal = true,
isStatic = true,
isExternal = false,
).also { it.parent = irClass } ).also { it.parent = irClass }
return irGetField(null, creatorField) return irGetField(null, creatorField)