[IR] Reorder parameters in IrFactory#createConstructor

This is to prepare for IrFactory auto-generation (KT-59308).
This commit is contained in:
Sergej Jaskiewicz
2023-06-13 19:25:05 +02:00
committed by Space Team
parent f486fc942b
commit 0ae95b39c3
16 changed files with 152 additions and 83 deletions
@@ -665,10 +665,17 @@ class Fir2IrDeclarationStorage(
declareIrConstructor(signature) { symbol ->
classifierStorage.preCacheTypeParameters(constructor, symbol)
irFactory.createConstructor(
startOffset, endOffset, origin, symbol,
SpecialNames.INIT, components.visibilityConverter.convertToDescriptorVisibility(visibility),
constructor.returnTypeRef.toIrType(),
isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = constructor.isExpect
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = SpecialNames.INIT,
visibility = components.visibilityConverter.convertToDescriptorVisibility(visibility),
isInline = false,
isExpect = constructor.isExpect,
returnType = constructor.returnTypeRef.toIrType(),
symbol = symbol,
isPrimary = isPrimary,
isExternal = false,
).apply {
metadata = FirMetadataSource.Function(constructor)
// Add to cache before generating parameters to prevent an infinite loop when an annotation value parameter is annotated
@@ -796,8 +796,17 @@ class IrBuiltInsOverFir(
): IrConstructorSymbol {
val name = SpecialNames.INIT
val ctor = irFactory.createConstructor(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrConstructorSymbolImpl(), name, visibility, defaultType,
isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = false
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = origin,
name = name,
visibility = visibility,
isInline = false,
isExpect = false,
returnType = defaultType,
symbol = IrConstructorSymbolImpl(),
isPrimary = isPrimary,
isExternal = false,
)
ctor.parent = this
ctor.build()
@@ -334,12 +334,18 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext, val inner
returnType = irScriptClass.thisReceiver!!.type as IrSimpleType
}) {
irScriptClass.factory.createConstructor(
startOffset, endOffset, origin,
IrConstructorSymbolImpl(),
SpecialNames.INIT,
visibility, returnType,
isInline = isInline, isExternal = isExternal, isPrimary = isPrimary, isExpect = isExpect,
containerSource = containerSource
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = SpecialNames.INIT,
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = returnType,
symbol = IrConstructorSymbolImpl(),
isPrimary = isPrimary,
isExternal = isExternal,
containerSource = containerSource,
)
}.also { irConstructor ->
irConstructor.valueParameters = buildList {
@@ -192,9 +192,17 @@ class WasmSharedVariablesManager(val context: JsCommonBackendContext, val builtI
val symbol = IrConstructorSymbolImpl()
val declaration = context.irFactory.createConstructor(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, JsLoweredDeclarationOrigin.JS_CLOSURE_BOX_CLASS_DECLARATION, symbol,
SpecialNames.INIT, DescriptorVisibilities.PUBLIC, closureBoxClassDeclaration.defaultType,
isInline = false, isExternal = false, isPrimary = true, isExpect = false
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = JsLoweredDeclarationOrigin.JS_CLOSURE_BOX_CLASS_DECLARATION,
name = SpecialNames.INIT,
visibility = DescriptorVisibilities.PUBLIC,
isInline = false,
isExpect = false,
returnType = closureBoxClassDeclaration.defaultType,
symbol = symbol,
isPrimary = true,
isExternal = false,
)
declaration.parent = closureBoxClassDeclaration
@@ -284,8 +284,17 @@ internal class FunctionGenerator(declarationGenerator: DeclarationGenerator) : D
return context.symbolTable.declareConstructor(constructorDescriptor) {
with(constructorDescriptor) {
context.irFactory.createConstructor(
startOffset, endOffset, origin, it, context.symbolTable.nameProvider.nameForDeclaration(this),
visibility, IrUninitializedType, isInline, isEffectivelyExternal(), isPrimary, isExpect
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = context.symbolTable.nameProvider.nameForDeclaration(this),
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = IrUninitializedType,
symbol = it,
isPrimary = isPrimary,
isExternal = isEffectivelyExternal(),
)
}.apply {
metadata = DescriptorMetadataSource.Function(it.descriptor)
@@ -156,11 +156,17 @@ internal class ScriptGenerator(declarationGenerator: DeclarationGenerator) : Dec
returnType = irScript.thisReceiver!!.type as IrSimpleType
}) {
irScript.factory.createConstructor(
startOffset, endOffset, origin,
context.symbolTable.referenceConstructor(descriptor.unsubstitutedPrimaryConstructor),
SpecialNames.INIT,
visibility, returnType,
isInline = isInline, isExternal = isExternal, isPrimary = isPrimary, isExpect = isExpect,
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = SpecialNames.INIT,
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = returnType,
symbol = context.symbolTable.referenceConstructor(descriptor.unsubstitutedPrimaryConstructor),
isPrimary = isPrimary,
isExternal = isExternal,
containerSource = containerSource
)
}.also { irConstructor ->
@@ -167,8 +167,17 @@ internal class StandaloneDeclarationGenerator(private val context: GeneratorCont
): IrConstructor {
val irConstructor = with(descriptor) {
irFactory.createConstructor(
startOffset, endOffset, origin, symbol, name, visibility, IrUninitializedType, isInline,
isEffectivelyExternal(), isPrimary, isExpect
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = name,
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = IrUninitializedType,
symbol = symbol,
isPrimary = isPrimary,
isExternal = isEffectivelyExternal(),
)
}
irConstructor.metadata = DescriptorMetadataSource.Function(descriptor)
@@ -11,14 +11,10 @@ import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorPublicSymbolImpl
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtBlockCodeFragment
import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset
import org.jetbrains.kotlin.psi.psiUtil.pureStartOffset
import org.jetbrains.kotlin.psi2ir.generators.Generator
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
import org.jetbrains.kotlin.psi2ir.generators.createBodyGenerator
@@ -66,14 +62,14 @@ open class FragmentDeclarationGenerator(
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.DEFINED,
symbol = IrConstructorPublicSymbolImpl(context.symbolTable.signaturer.composeSignature(irClass.descriptor)!!),
Name.special("<init>"),
irClass.visibility,
irClass.defaultType,
name = Name.special("<init>"),
visibility = irClass.visibility,
isInline = false,
isExternal = false,
isExpect = false,
returnType = irClass.defaultType,
symbol = IrConstructorPublicSymbolImpl(context.symbolTable.signaturer.composeSignature(irClass.descriptor)!!),
isPrimary = true,
isExpect = false
isExternal = false
)
constructor.parent = irClass
constructor.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET).apply {
@@ -173,12 +173,18 @@ internal fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFuncti
@PublishedApi
internal fun IrFactory.buildConstructor(builder: IrFunctionBuilder): IrConstructor = with(builder) {
return createConstructor(
startOffset, endOffset, origin,
IrConstructorSymbolImpl(),
SpecialNames.INIT,
visibility, returnType,
isInline = isInline, isExternal = isExternal, isPrimary = isPrimary, isExpect = isExpect,
containerSource = containerSource
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = SpecialNames.INIT,
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = returnType,
symbol = IrConstructorSymbolImpl(),
isPrimary = isPrimary,
isExternal = isExternal,
containerSource = containerSource,
)
}
@@ -50,14 +50,14 @@ interface IrFactory {
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
symbol: IrConstructorSymbol,
name: Name,
visibility: DescriptorVisibility,
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
returnType: IrType,
symbol: IrConstructorSymbol,
isPrimary: Boolean,
isExternal: Boolean,
containerSource: DeserializedContainerSource? = null
): IrConstructor
@@ -62,14 +62,14 @@ abstract class AbstractIrFactoryImpl : IrFactory {
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
symbol: IrConstructorSymbol,
name: Name,
visibility: DescriptorVisibility,
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
returnType: IrType,
symbol: IrConstructorSymbol,
isPrimary: Boolean,
isExternal: Boolean,
containerSource: DeserializedContainerSource?,
): IrConstructor =
IrConstructorImpl(
@@ -88,28 +88,28 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
symbol: IrConstructorSymbol,
name: Name,
visibility: DescriptorVisibility,
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
returnType: IrType,
symbol: IrConstructorSymbol,
isPrimary: Boolean,
isExternal: Boolean,
containerSource: DeserializedContainerSource?
): IrConstructor {
return super.createConstructor(
startOffset,
endOffset,
origin,
symbol,
name,
visibility,
returnType,
isInline,
isExternal,
isPrimary,
isExpect,
returnType,
symbol,
isPrimary,
isExternal,
containerSource,
).register()
}
@@ -49,21 +49,31 @@ class LazyIrFactory(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
symbol: IrConstructorSymbol,
name: Name,
visibility: DescriptorVisibility,
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
returnType: IrType,
symbol: IrConstructorSymbol,
isPrimary: Boolean,
isExternal: Boolean,
containerSource: DeserializedContainerSource?
): IrConstructor = if (symbol.isBound)
symbol.owner
else
delegate.createConstructor(
startOffset, endOffset, origin, symbol, name, visibility, returnType,
isInline, isExternal, isPrimary, isExpect, containerSource
startOffset,
endOffset,
origin,
name,
visibility,
isInline,
isExpect,
returnType,
symbol,
isPrimary,
isExternal,
containerSource,
)
override fun createEnumEntry(
@@ -198,16 +198,17 @@ open class DeepCopyIrTreeWithSymbols(
override fun visitConstructor(declaration: IrConstructor): IrConstructor =
declaration.factory.createConstructor(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredConstructor(declaration.symbol),
declaration.name,
declaration.visibility,
declaration.returnType,
startOffset = declaration.startOffset,
endOffset = declaration.endOffset,
origin = mapDeclarationOrigin(declaration.origin),
name = declaration.name,
visibility = declaration.visibility,
isInline = declaration.isInline,
isExternal = declaration.isExternal,
isPrimary = declaration.isPrimary,
isExpect = declaration.isExpect,
returnType = declaration.returnType,
symbol = symbolRemapper.getDeclaredConstructor(declaration.symbol),
isPrimary = declaration.isPrimary,
isExternal = declaration.isExternal,
containerSource = declaration.containerSource,
).apply {
transformFunctionChildren(declaration)
@@ -105,14 +105,14 @@ internal class MissingDeclarationStubGenerator(private val builtIns: IrBuiltIns)
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = PartiallyLinkedDeclarationOrigin.MISSING_DECLARATION,
symbol = symbol,
name = SpecialNames.INIT,
visibility = DescriptorVisibilities.DEFAULT_VISIBILITY,
returnType = builtIns.nothingType,
isInline = false,
isExternal = false,
isPrimary = false,
isExpect = false,
returnType = builtIns.nothingType,
symbol = symbol,
isPrimary = false,
isExternal = false,
).setCommonParent()
}
@@ -668,15 +668,17 @@ class IrDeclarationDeserializer(
val nameType = BinaryNameAndType.decode(proto.base.nameType)
symbolTable.declareConstructor(idSig, { symbol }) {
irFactory.createConstructor(
startOffset, endOffset, origin,
it,
deserializeName(nameType.nameIndex),
flags.visibility,
IrUninitializedType,
flags.isInline,
flags.isExternal || isEffectivelyExternal,
flags.isPrimary,
flags.isExpect
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = deserializeName(nameType.nameIndex),
visibility = flags.visibility,
isInline = flags.isInline,
isExpect = flags.isExpect,
returnType = IrUninitializedType,
symbol = it,
isPrimary = flags.isPrimary,
isExternal = flags.isExternal || isEffectivelyExternal,
)
}
}