[IR] Reorder parameters in IrFactory#createFunction

This is to prepare for IrFactory auto-generation (KT-59308).
This commit is contained in:
Sergej Jaskiewicz
2023-06-13 19:54:28 +02:00
committed by teamcity
parent 650b00e1b2
commit 7b77ec9930
23 changed files with 380 additions and 251 deletions
@@ -679,12 +679,22 @@ class Fir2IrClassifierStorage(
} }
private val temporaryParent by lazy { private val temporaryParent by lazy {
irFactory.createFunction( irFactory.createSimpleFunction(
startOffset = UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
IrDeclarationOrigin.DEFINED, IrSimpleFunctionSymbolImpl(), endOffset = UNDEFINED_OFFSET,
Name.special("<stub>"), DescriptorVisibilities.PRIVATE, Modality.FINAL, irBuiltIns.unitType, origin = IrDeclarationOrigin.DEFINED,
isInline = false, isExternal = false, isTailrec = false, name = Name.special("<stub>"),
isSuspend = false, isOperator = false, isInfix = false, isExpect = false visibility = DescriptorVisibilities.PRIVATE,
isInline = false,
isExpect = false,
returnType = irBuiltIns.unitType,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false,
isSuspend = false,
isOperator = false,
isInfix = false,
isExternal = false,
).apply { ).apply {
parent = IrExternalPackageFragmentImpl(IrExternalPackageFragmentSymbolImpl(), FqName.ROOT) parent = IrExternalPackageFragmentImpl(IrExternalPackageFragmentSymbolImpl(), FqName.ROOT)
} }
@@ -568,21 +568,22 @@ class Fir2IrDeclarationStorage(
val created = function.convertWithOffsets { startOffset, endOffset -> val created = function.convertWithOffsets { startOffset, endOffset ->
val result = declareIrSimpleFunction(signature) { symbol -> val result = declareIrSimpleFunction(signature) { symbol ->
classifierStorage.preCacheTypeParameters(function, symbol) classifierStorage.preCacheTypeParameters(function, symbol)
irFactory.createFunction( irFactory.createSimpleFunction(
if (updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER) SYNTHETIC_OFFSET else startOffset, startOffset = if (updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER) SYNTHETIC_OFFSET else startOffset,
if (updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER) SYNTHETIC_OFFSET else endOffset, endOffset = if (updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER) SYNTHETIC_OFFSET else endOffset,
updatedOrigin, symbol, origin = updatedOrigin,
name, components.visibilityConverter.convertToDescriptorVisibility(visibility), name = name,
simpleFunction?.modality ?: Modality.FINAL, visibility = components.visibilityConverter.convertToDescriptorVisibility(visibility),
function.returnTypeRef.toIrType(),
isInline = simpleFunction?.isInline == true, isInline = simpleFunction?.isInline == true,
isExternal = simpleFunction?.isExternal == true, isExpect = simpleFunction?.isExpect == true,
returnType = function.returnTypeRef.toIrType(),
modality = simpleFunction?.modality ?: Modality.FINAL,
symbol = symbol,
isTailrec = simpleFunction?.isTailRec == true, isTailrec = simpleFunction?.isTailRec == true,
isSuspend = isSuspend, isSuspend = isSuspend,
isExpect = simpleFunction?.isExpect == true,
isFakeOverride = updatedOrigin == IrDeclarationOrigin.FAKE_OVERRIDE,
isOperator = simpleFunction?.isOperator == true, isOperator = simpleFunction?.isOperator == true,
isInfix = simpleFunction?.isInfix == true, isInfix = simpleFunction?.isInfix == true,
isExternal = simpleFunction?.isExternal == true,
containerSource = simpleFunction?.containerSource, containerSource = simpleFunction?.containerSource,
).apply { ).apply {
metadata = FirMetadataSource.Function(function) metadata = FirMetadataSource.Function(function)
@@ -738,16 +739,22 @@ class Fir2IrDeclarationStorage(
val visibility = propertyAccessor?.visibility?.let { val visibility = propertyAccessor?.visibility?.let {
components.visibilityConverter.convertToDescriptorVisibility(it) components.visibilityConverter.convertToDescriptorVisibility(it)
} }
irFactory.createFunction( irFactory.createSimpleFunction(
startOffset, endOffset, origin, symbol, startOffset = startOffset,
Name.special("<$prefix-${correspondingProperty.name}>"), endOffset = endOffset,
visibility ?: (correspondingProperty as IrDeclarationWithVisibility).visibility, origin = origin,
(correspondingProperty as? IrOverridableMember)?.modality ?: Modality.FINAL, accessorReturnType, name = Name.special("<$prefix-${correspondingProperty.name}>"),
visibility = visibility ?: (correspondingProperty as IrDeclarationWithVisibility).visibility,
isInline = propertyAccessor?.isInline == true, isInline = propertyAccessor?.isInline == true,
isExternal = propertyAccessor?.isExternal == true, isExpect = false,
isTailrec = false, isSuspend = false, isOperator = false, returnType = accessorReturnType,
modality = (correspondingProperty as? IrOverridableMember)?.modality ?: Modality.FINAL,
symbol = symbol,
isTailrec = false,
isSuspend = false,
isOperator = false,
isInfix = false, isInfix = false,
isExpect = false, isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE, isExternal = propertyAccessor?.isExternal == true,
containerSource = containerSource, containerSource = containerSource,
).apply { ).apply {
correspondingPropertySymbol = (correspondingProperty as? IrProperty)?.symbol correspondingPropertySymbol = (correspondingProperty as? IrProperty)?.symbol
@@ -943,12 +943,24 @@ class IrBuiltInsOverFir(
this.isOperator = isOperator this.isOperator = isOperator
this.isInfix = isInfix this.isInfix = isInfix
build() build()
irFactory.createFunction( irFactory.createSimpleFunction(
startOffset, endOffset, this.origin, startOffset = startOffset,
symbol, endOffset = endOffset,
this.name, visibility, this.modality, this.returnType, origin = this.origin,
isInline, isExternal, isTailrec, isSuspend, this.isOperator, this.isInfix, isExpect, isFakeOverride, name = this.name,
containerSource, visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = this.returnType,
modality = this.modality,
symbol = symbol,
isTailrec = isTailrec,
isSuspend = isSuspend,
isOperator = this.isOperator,
isInfix = this.isInfix,
isExternal = isExternal,
containerSource = containerSource,
isFakeOverride = isFakeOverride,
) )
}.also { fn -> }.also { fn ->
valueParameterTypes.forEachIndexed { index, (pName, irType) -> valueParameterTypes.forEachIndexed { index, (pName, irType) ->
@@ -204,22 +204,22 @@ internal class AdapterGenerator(
val returnType = type.arguments.last().typeOrNull!! val returnType = type.arguments.last().typeOrNull!!
val parameterTypes = type.arguments.dropLast(1).map { it.typeOrNull!! } val parameterTypes = type.arguments.dropLast(1).map { it.typeOrNull!! }
val firMemberAdaptee = firAdaptee as FirMemberDeclaration val firMemberAdaptee = firAdaptee as FirMemberDeclaration
return irFactory.createFunction( return irFactory.createSimpleFunction(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE, endOffset = endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE,
adaptee.name, name = adaptee.name,
DescriptorVisibilities.LOCAL, visibility = DescriptorVisibilities.LOCAL,
Modality.FINAL,
returnType,
isInline = firMemberAdaptee.isInline, isInline = firMemberAdaptee.isInline,
isExternal = false, isExpect = false,
returnType = returnType,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false, isTailrec = false,
isSuspend = firMemberAdaptee.isSuspend || type.isSuspendFunction(), isSuspend = firMemberAdaptee.isSuspend || type.isSuspendFunction(),
isOperator = firMemberAdaptee.isOperator, isOperator = firMemberAdaptee.isOperator,
isInfix = firMemberAdaptee.isInfix, isInfix = firMemberAdaptee.isInfix,
isExpect = false, isExternal = false,
isFakeOverride = false
).also { irAdapterFunction -> ).also { irAdapterFunction ->
symbolTable.enterScope(irAdapterFunction) symbolTable.enterScope(irAdapterFunction)
irAdapterFunction.dispatchReceiverParameter = null irAdapterFunction.dispatchReceiverParameter = null
@@ -649,23 +649,23 @@ internal class AdapterGenerator(
): IrSimpleFunction { ): IrSimpleFunction {
val returnType = type.arguments.last().typeOrNull!! val returnType = type.arguments.last().typeOrNull!!
val parameterTypes = type.arguments.dropLast(1).map { it.typeOrNull!! } val parameterTypes = type.arguments.dropLast(1).map { it.typeOrNull!! }
return irFactory.createFunction( return irFactory.createSimpleFunction(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_FOR_SUSPEND_CONVERSION, endOffset = endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_FOR_SUSPEND_CONVERSION,
// TODO: need a better way to avoid name clash // TODO: need a better way to avoid name clash
Name.identifier("suspendConversion"), name = Name.identifier("suspendConversion"),
DescriptorVisibilities.LOCAL, visibility = DescriptorVisibilities.LOCAL,
Modality.FINAL,
returnType,
isInline = false, isInline = false,
isExternal = false, isExpect = false,
returnType = returnType,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false, isTailrec = false,
isSuspend = true, isSuspend = true,
isOperator = false, isOperator = false,
isInfix = false, isInfix = false,
isExpect = false, isExternal = false,
isFakeOverride = false
).also { irAdapterFunction -> ).also { irAdapterFunction ->
symbolTable.enterScope(irAdapterFunction) symbolTable.enterScope(irAdapterFunction)
irAdapterFunction.extensionReceiverParameter = createAdapterParameter( irAdapterFunction.extensionReceiverParameter = createAdapterParameter(
@@ -773,22 +773,22 @@ internal class AdapterGenerator(
val functionParameter = callableSymbol.valueParameterSymbols.singleOrNull() val functionParameter = callableSymbol.valueParameterSymbols.singleOrNull()
?: throw AssertionError("Single value parameter expected: ${callableSymbol.valueParameterSymbols}") ?: throw AssertionError("Single value parameter expected: ${callableSymbol.valueParameterSymbols}")
return irFactory.createFunction( return irFactory.createSimpleFunction(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_FOR_FUN_INTERFACE_CONSTRUCTOR, endOffset = endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_FOR_FUN_INTERFACE_CONSTRUCTOR,
callableSymbol.name, name = callableSymbol.name,
DescriptorVisibilities.LOCAL, visibility = DescriptorVisibilities.LOCAL,
Modality.FINAL,
irSamType,
isInline = false, isInline = false,
isExternal = false, isExpect = false,
returnType = irSamType,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false, isTailrec = false,
isSuspend = false, isSuspend = false,
isOperator = false, isOperator = false,
isInfix = false, isInfix = false,
isExpect = false, isExternal = false,
isFakeOverride = false
).also { irAdapterFunction -> ).also { irAdapterFunction ->
symbolTable.enterScope(irAdapterFunction) symbolTable.enterScope(irAdapterFunction)
irAdapterFunction.dispatchReceiverParameter = null irAdapterFunction.dispatchReceiverParameter = null
@@ -237,10 +237,23 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
): IrFunction { ): IrFunction {
val signature = if (lookupTag.classId.isLocal) null else components.signatureComposer.composeSignature(syntheticCounterpart) val signature = if (lookupTag.classId.isLocal) null else components.signatureComposer.composeSignature(syntheticCounterpart)
return components.declarationStorage.declareIrSimpleFunction(signature) { symbol -> return components.declarationStorage.declareIrSimpleFunction(signature) { symbol ->
components.irFactory.createFunction( components.irFactory.createSimpleFunction(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, DescriptorVisibilities.PUBLIC, Modality.OPEN, returnType, startOffset = UNDEFINED_OFFSET,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = isOperator, endOffset = UNDEFINED_OFFSET,
isInfix = false, isExpect = false, isFakeOverride = false, origin = origin,
name = name,
visibility = DescriptorVisibilities.PUBLIC,
isInline = false,
isExpect = false,
returnType = returnType,
modality = Modality.OPEN,
symbol = symbol,
isTailrec = false,
isSuspend = false,
isOperator = isOperator,
isInfix = false,
isExternal = false,
isFakeOverride = false,
).apply { ).apply {
if (otherParameterNeeded) { if (otherParameterNeeded) {
val irValueParameter = createSyntheticIrParameter( val irValueParameter = createSyntheticIrParameter(
@@ -88,23 +88,24 @@ class SyntheticAccessorLowering(private val context: CommonBackendContext) : Bod
private val copier = object : DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) { private val copier = object : DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) {
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction { override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction {
val newName = Name.identifier("${declaration.name.asString()}\$accessor\$$fileHash") val newName = Name.identifier("${declaration.name.asString()}\$accessor\$$fileHash")
return declaration.factory.createFunction( return declaration.factory.createSimpleFunction(
declaration.startOffset, declaration.endOffset, startOffset = declaration.startOffset,
mapDeclarationOrigin(declaration.origin), endOffset = declaration.endOffset,
symbolRemapper.getDeclaredFunction(declaration.symbol), origin = mapDeclarationOrigin(declaration.origin),
newName, name = newName,
DescriptorVisibilities.INTERNAL, visibility = DescriptorVisibilities.INTERNAL,
declaration.modality,
IrUninitializedType,
isInline = declaration.isInline, isInline = declaration.isInline,
isExternal = declaration.isExternal, isExpect = declaration.isExpect,
returnType = IrUninitializedType,
modality = declaration.modality,
symbol = symbolRemapper.getDeclaredFunction(declaration.symbol),
isTailrec = declaration.isTailrec, isTailrec = declaration.isTailrec,
isSuspend = declaration.isSuspend, isSuspend = declaration.isSuspend,
isOperator = declaration.isOperator, isOperator = declaration.isOperator,
isInfix = declaration.isInfix, isInfix = declaration.isInfix,
isExpect = declaration.isExpect, isExternal = declaration.isExternal,
isFakeOverride = declaration.isFakeOverride,
containerSource = declaration.containerSource, containerSource = declaration.containerSource,
isFakeOverride = declaration.isFakeOverride,
).apply { ).apply {
assert(declaration.overriddenSymbols.isEmpty()) { "Top level function overrides nothing" } assert(declaration.overriddenSymbols.isEmpty()) { "Top level function overrides nothing" }
transformFunctionChildren(declaration) transformFunctionChildren(declaration)
@@ -96,9 +96,22 @@ internal fun createTempFunction(
origin: IrDeclarationOrigin = TEMP_FUNCTION_FOR_INTERPRETER, origin: IrDeclarationOrigin = TEMP_FUNCTION_FOR_INTERPRETER,
visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC visibility: DescriptorVisibility = DescriptorVisibilities.PUBLIC
): IrSimpleFunction { ): IrSimpleFunction {
return IrFactoryImpl.createFunction( return IrFactoryImpl.createSimpleFunction(
SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, IrSimpleFunctionSymbolImpl(), name, visibility, Modality.FINAL, type, startOffset = SYNTHETIC_OFFSET,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = true, isInfix = false, isExpect = false endOffset = SYNTHETIC_OFFSET,
origin = origin,
name = name,
visibility = visibility,
isInline = false,
isExpect = false,
returnType = type,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false,
isSuspend = false,
isOperator = true,
isInfix = false,
isExternal = false,
) )
} }
@@ -103,23 +103,22 @@ class IrBuiltInsOverDescriptors(
} }
val symbol = symbolTable.declareSimpleFunctionIfNotExists(operatorDescriptor) { val symbol = symbolTable.declareSimpleFunctionIfNotExists(operatorDescriptor) {
val operator = irFactory.createFunction( val operator = irFactory.createSimpleFunction(
UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET,
BUILTIN_OPERATOR, origin = BUILTIN_OPERATOR,
it, name = Name.identifier(name),
Name.identifier(name), visibility = DescriptorVisibilities.PUBLIC,
DescriptorVisibilities.PUBLIC,
Modality.FINAL,
returnType,
isInline = false, isInline = false,
isExternal = false, isExpect = false,
returnType = returnType,
modality = Modality.FINAL,
symbol = it,
isTailrec = false, isTailrec = false,
isSuspend = false, isSuspend = false,
isOperator = false, isOperator = false,
isInfix = false, isInfix = false,
isExpect = false, isExternal = false,
isFakeOverride = false
) )
operator.parent = operatorsPackageFragment operator.parent = operatorsPackageFragment
operatorsPackageFragment.declarations += operator operatorsPackageFragment.declarations += operator
@@ -211,13 +210,22 @@ class IrBuiltInsOverDescriptors(
buildSimpleType() buildSimpleType()
} }
irFactory.createFunction( irFactory.createSimpleFunction(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, startOffset = UNDEFINED_OFFSET,
operatorSymbol, name, endOffset = UNDEFINED_OFFSET,
DescriptorVisibilities.PUBLIC, Modality.FINAL, origin = BUILTIN_OPERATOR,
returnIrType, name = name,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false, visibility = DescriptorVisibilities.PUBLIC,
isExpect = false, isFakeOverride = false isInline = false,
isExpect = false,
returnType = returnIrType,
modality = Modality.FINAL,
symbol = operatorSymbol,
isTailrec = false,
isSuspend = false,
isOperator = false,
isInfix = false,
isExternal = false,
).also { operator -> ).also { operator ->
operator.parent = operatorsPackageFragment operator.parent = operatorsPackageFragment
operatorsPackageFragment.declarations += operator operatorsPackageFragment.declarations += operator
@@ -296,16 +296,22 @@ class IrDescriptorBasedFunctionFactory(
buildSimpleType() buildSimpleType()
} }
irFactory.createFunction( irFactory.createSimpleFunction(
offset, offset, memberOrigin, it, Name.identifier("invoke"), DescriptorVisibilities.PUBLIC, Modality.ABSTRACT, startOffset = offset,
returnType, endOffset = offset,
origin = memberOrigin,
name = Name.identifier("invoke"),
visibility = DescriptorVisibilities.PUBLIC,
isInline = false, isInline = false,
isExternal = false, isExpect = false,
returnType = returnType,
modality = Modality.ABSTRACT,
symbol = it,
isTailrec = false, isTailrec = false,
isSuspend = isSuspend, isSuspend = isSuspend,
isOperator = true, isOperator = true,
isInfix = false, isInfix = false,
isExpect = false, isExternal = false,
isFakeOverride = false isFakeOverride = false
) )
} }
@@ -378,9 +384,23 @@ class IrDescriptorBasedFunctionFactory(
val returnType = descriptor.returnType?.let { toIrType(it) } ?: error("No return type for $descriptor") val returnType = descriptor.returnType?.let { toIrType(it) } ?: error("No return type for $descriptor")
val newFunction = symbolTable.declareSimpleFunction(descriptor) { val newFunction = symbolTable.declareSimpleFunction(descriptor) {
descriptor.run { descriptor.run {
irFactory.createFunction( irFactory.createSimpleFunction(
offset, offset, memberOrigin, it, name, visibility, modality, returnType, startOffset = offset,
isInline, isEffectivelyExternal(), isTailrec, isSuspend, isOperator, isInfix, isExpect, true endOffset = offset,
origin = memberOrigin,
name = name,
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = returnType,
modality = modality,
symbol = it,
isTailrec = isTailrec,
isSuspend = isSuspend,
isOperator = isOperator,
isInfix = isInfix,
isExternal = isEffectivelyExternal(),
isFakeOverride = true,
) )
} }
} }
@@ -427,16 +427,22 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
val irFunReturnType = funType.arguments.last().type.toIrType() val irFunReturnType = funType.arguments.last().type.toIrType()
val irSuspendFunReturnType = suspendFunType.arguments.last().type.toIrType() val irSuspendFunReturnType = suspendFunType.arguments.last().type.toIrType()
val irAdapterFun = context.irFactory.createFunction( val irAdapterFun = context.irFactory.createSimpleFunction(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_FOR_SUSPEND_CONVERSION, endOffset = endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_FOR_SUSPEND_CONVERSION,
Name.identifier(scope.inventNameForTemporary("suspendConversion")), name = Name.identifier(scope.inventNameForTemporary("suspendConversion")),
DescriptorVisibilities.LOCAL, Modality.FINAL, visibility = DescriptorVisibilities.LOCAL,
irSuspendFunReturnType, isInline = false,
isInline = false, isExternal = false, isTailrec = false, isExpect = false,
returnType = irSuspendFunReturnType,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false,
isSuspend = true, isSuspend = true,
isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false isOperator = false,
isInfix = false,
isExternal = false,
) )
context.symbolTable.enterScope(irAdapterFun) context.symbolTable.enterScope(irAdapterFun)
@@ -166,16 +166,22 @@ internal class ReflectionReferencesGenerator(statementGenerator: StatementGenera
val functionParameter = descriptor.valueParameters.singleOrNull() val functionParameter = descriptor.valueParameters.singleOrNull()
?: throw AssertionError("Single value parameter expected: $descriptor") ?: throw AssertionError("Single value parameter expected: $descriptor")
return context.irFactory.createFunction( return context.irFactory.createSimpleFunction(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_FOR_FUN_INTERFACE_CONSTRUCTOR, endOffset = endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_FOR_FUN_INTERFACE_CONSTRUCTOR,
name = samClassDescriptor.name, name = samClassDescriptor.name,
visibility = DescriptorVisibilities.LOCAL, visibility = DescriptorVisibilities.LOCAL,
modality = Modality.FINAL, isInline = false,
isExpect = false,
returnType = irSamType, returnType = irSamType,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false, modality = Modality.FINAL,
isExpect = false, isFakeOverride = false symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false,
isSuspend = false,
isOperator = false,
isInfix = false,
isExternal = false,
).also { irAdapterFun -> ).also { irAdapterFun ->
context.symbolTable.withScope(irAdapterFun) { context.symbolTable.withScope(irAdapterFun) {
irAdapterFun.metadata = null irAdapterFun.metadata = null
@@ -437,22 +443,22 @@ internal class ReflectionReferencesGenerator(statementGenerator: StatementGenera
val hasSuspendConversion = !adapteeDescriptor.isSuspend && val hasSuspendConversion = !adapteeDescriptor.isSuspend &&
callableReferenceType.isKSuspendFunctionType callableReferenceType.isKSuspendFunctionType
return context.irFactory.createFunction( return context.irFactory.createSimpleFunction(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE, endOffset = endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE,
adapteeDescriptor.name, name = adapteeDescriptor.name,
DescriptorVisibilities.LOCAL, visibility = DescriptorVisibilities.LOCAL,
Modality.FINAL,
ktExpectedReturnType.toIrType(),
isInline = adapteeDescriptor.isInline, // TODO ? isInline = adapteeDescriptor.isInline, // TODO ?
isExternal = false, isExpect = false,
returnType = ktExpectedReturnType.toIrType(),
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false, isTailrec = false,
isSuspend = adapteeDescriptor.isSuspend || hasSuspendConversion, isSuspend = adapteeDescriptor.isSuspend || hasSuspendConversion,
isOperator = adapteeDescriptor.isOperator, // TODO ? isOperator = adapteeDescriptor.isOperator, // TODO ?
isInfix = adapteeDescriptor.isInfix, isInfix = adapteeDescriptor.isInfix,
isExpect = false, isExternal = false,
isFakeOverride = false
).also { irAdapterFun -> ).also { irAdapterFun ->
context.symbolTable.withScope(irAdapterFun) { context.symbolTable.withScope(irAdapterFun) {
irAdapterFun.metadata = DescriptorMetadataSource.Function(adapteeDescriptor) irAdapterFun.metadata = DescriptorMetadataSource.Function(adapteeDescriptor)
@@ -208,9 +208,22 @@ internal class StandaloneDeclarationGenerator(private val context: GeneratorCont
defaultArgumentFactory: IrFunction.(IrValueParameter) -> IrExpressionBody? = { null } defaultArgumentFactory: IrFunction.(IrValueParameter) -> IrExpressionBody? = { null }
): IrSimpleFunction { ): IrSimpleFunction {
val irFunction = with(descriptor) { val irFunction = with(descriptor) {
irFactory.createFunction( irFactory.createSimpleFunction(
startOffset, endOffset, origin, symbol, name, visibility, modality, IrUninitializedType, startOffset = startOffset,
isInline, isEffectivelyExternal(), isTailrec, isSuspend, isOperator, isInfix, isExpect endOffset = endOffset,
origin = origin,
name = name,
visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = IrUninitializedType,
modality = modality,
symbol = symbol,
isTailrec = isTailrec,
isSuspend = isSuspend,
isOperator = isOperator,
isInfix = isInfix,
isExternal = isEffectivelyExternal(),
) )
} }
irFunction.metadata = DescriptorMetadataSource.Function(descriptor) irFunction.metadata = DescriptorMetadataSource.Function(descriptor)
@@ -172,12 +172,24 @@ inline fun IrProperty.addBackingField(builder: IrFieldBuilder.() -> Unit = {}):
@PublishedApi @PublishedApi
internal fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFunction = with(builder) { internal fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFunction = with(builder) {
createFunction( createSimpleFunction(
startOffset, endOffset, origin, startOffset = startOffset,
IrSimpleFunctionSymbolImpl(), endOffset = endOffset,
name, visibility, modality, returnType, origin = origin,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride, name = name,
containerSource, visibility = visibility,
isInline = isInline,
isExpect = isExpect,
returnType = returnType,
modality = modality,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = isTailrec,
isSuspend = isSuspend,
isOperator = isOperator,
isInfix = isInfix,
isExternal = isExternal,
containerSource = containerSource,
isFakeOverride = isFakeOverride,
) )
} }
@@ -88,24 +88,24 @@ interface IrFactory {
isExternal: Boolean, isExternal: Boolean,
): IrField ): IrField
fun createFunction( fun createSimpleFunction(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrSimpleFunctionSymbol,
name: Name, name: Name,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
modality: Modality,
returnType: IrType,
isInline: Boolean, isInline: Boolean,
isExternal: Boolean, isExpect: Boolean,
returnType: IrType,
modality: Modality,
symbol: IrSimpleFunctionSymbol,
isTailrec: Boolean, isTailrec: Boolean,
isSuspend: Boolean, isSuspend: Boolean,
isOperator: Boolean, isOperator: Boolean,
isInfix: Boolean, isInfix: Boolean,
isExpect: Boolean, isExternal: Boolean,
isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource? = null, containerSource: DeserializedContainerSource? = null,
isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
): IrSimpleFunction ): IrSimpleFunction
fun createFunctionWithLateBinding( fun createFunctionWithLateBinding(
@@ -107,24 +107,24 @@ abstract class AbstractIrFactoryImpl : IrFactory {
): 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)
override fun createFunction( override fun createSimpleFunction(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrSimpleFunctionSymbol,
name: Name, name: Name,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
modality: Modality,
returnType: IrType,
isInline: Boolean, isInline: Boolean,
isExternal: Boolean, isExpect: Boolean,
returnType: IrType,
modality: Modality,
symbol: IrSimpleFunctionSymbol,
isTailrec: Boolean, isTailrec: Boolean,
isSuspend: Boolean, isSuspend: Boolean,
isOperator: Boolean, isOperator: Boolean,
isInfix: Boolean, isInfix: Boolean,
isExpect: Boolean, isExternal: Boolean,
isFakeOverride: Boolean,
containerSource: DeserializedContainerSource?, containerSource: DeserializedContainerSource?,
isFakeOverride: Boolean,
): IrSimpleFunction = ): IrSimpleFunction =
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, origin, symbol, name, visibility, modality, returnType, startOffset, endOffset, origin, symbol, name, visibility, modality, returnType,
@@ -160,43 +160,43 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
).register() ).register()
} }
override fun createFunction( override fun createSimpleFunction(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrSimpleFunctionSymbol,
name: Name, name: Name,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
modality: Modality,
returnType: IrType,
isInline: Boolean, isInline: Boolean,
isExternal: Boolean, isExpect: Boolean,
returnType: IrType,
modality: Modality,
symbol: IrSimpleFunctionSymbol,
isTailrec: Boolean, isTailrec: Boolean,
isSuspend: Boolean, isSuspend: Boolean,
isOperator: Boolean, isOperator: Boolean,
isInfix: Boolean, isInfix: Boolean,
isExpect: Boolean, isExternal: Boolean,
isFakeOverride: Boolean, containerSource: DeserializedContainerSource?,
containerSource: DeserializedContainerSource? isFakeOverride: Boolean
): IrSimpleFunction { ): IrSimpleFunction {
return super.createFunction( return super.createSimpleFunction(
startOffset, startOffset,
endOffset, endOffset,
origin, origin,
symbol,
name, name,
visibility, visibility,
modality,
returnType,
isInline, isInline,
isExternal, isExpect,
returnType,
modality,
symbol,
isTailrec, isTailrec,
isSuspend, isSuspend,
isOperator, isOperator,
isInfix, isInfix,
isExpect, isExternal,
isFakeOverride,
containerSource, containerSource,
isFakeOverride,
).register() ).register()
} }
@@ -117,30 +117,30 @@ class LazyIrFactory(
else else
delegate.createField(startOffset, endOffset, origin, name, visibility, symbol, type, isFinal, isStatic, isExternal) delegate.createField(startOffset, endOffset, origin, name, visibility, symbol, type, isFinal, isStatic, isExternal)
override fun createFunction( override fun createSimpleFunction(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrSimpleFunctionSymbol,
name: Name, name: Name,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
modality: Modality,
returnType: IrType,
isInline: Boolean, isInline: Boolean,
isExternal: Boolean, isExpect: Boolean,
returnType: IrType,
modality: Modality,
symbol: IrSimpleFunctionSymbol,
isTailrec: Boolean, isTailrec: Boolean,
isSuspend: Boolean, isSuspend: Boolean,
isOperator: Boolean, isOperator: Boolean,
isInfix: Boolean, isInfix: Boolean,
isExpect: Boolean, isExternal: Boolean,
isFakeOverride: Boolean, containerSource: DeserializedContainerSource?,
containerSource: DeserializedContainerSource? isFakeOverride: Boolean
): IrSimpleFunction = if (symbol.isBound) ): IrSimpleFunction = if (symbol.isBound)
symbol.owner symbol.owner
else else
delegate.createFunction( delegate.createSimpleFunction(
startOffset, endOffset, origin, symbol, name, visibility, modality, returnType, startOffset, endOffset, origin, name, visibility, isInline, isExpect, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride, containerSource modality, symbol, isTailrec, isSuspend, isOperator, isInfix, isExternal, containerSource, isFakeOverride
) )
override fun createProperty( override fun createProperty(
@@ -171,23 +171,24 @@ open class DeepCopyIrTreeWithSymbols(
}.copyAttributes(declaration) }.copyAttributes(declaration)
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction = override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction =
declaration.factory.createFunction( declaration.factory.createSimpleFunction(
declaration.startOffset, declaration.endOffset, startOffset = declaration.startOffset,
mapDeclarationOrigin(declaration.origin), endOffset = declaration.endOffset,
symbolRemapper.getDeclaredFunction(declaration.symbol), origin = mapDeclarationOrigin(declaration.origin),
symbolRenamer.getFunctionName(declaration.symbol), name = symbolRenamer.getFunctionName(declaration.symbol),
declaration.visibility, visibility = declaration.visibility,
declaration.modality,
declaration.returnType,
isInline = declaration.isInline, isInline = declaration.isInline,
isExternal = declaration.isExternal, isExpect = declaration.isExpect,
returnType = declaration.returnType,
modality = declaration.modality,
symbol = symbolRemapper.getDeclaredFunction(declaration.symbol),
isTailrec = declaration.isTailrec, isTailrec = declaration.isTailrec,
isSuspend = declaration.isSuspend, isSuspend = declaration.isSuspend,
isOperator = declaration.isOperator, isOperator = declaration.isOperator,
isInfix = declaration.isInfix, isInfix = declaration.isInfix,
isExpect = declaration.isExpect, isExternal = declaration.isExternal,
isFakeOverride = declaration.isFakeOverride,
containerSource = declaration.containerSource, containerSource = declaration.containerSource,
isFakeOverride = declaration.isFakeOverride,
).apply { ).apply {
overriddenSymbols = declaration.overriddenSymbols.memoryOptimizedMap { overriddenSymbols = declaration.overriddenSymbols.memoryOptimizedMap {
symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol
@@ -1188,23 +1188,24 @@ fun IrFactory.createStaticFunctionWithReceivers(
typeParametersFromContext: List<IrTypeParameter> = listOf(), typeParametersFromContext: List<IrTypeParameter> = listOf(),
remapMultiFieldValueClassStructure: (IrFunction, IrFunction, Map<IrValueParameter, IrValueParameter>?) -> Unit remapMultiFieldValueClassStructure: (IrFunction, IrFunction, Map<IrValueParameter, IrValueParameter>?) -> Unit
): IrSimpleFunction { ): IrSimpleFunction {
return createFunction( return createSimpleFunction(
oldFunction.startOffset, oldFunction.endOffset, startOffset = oldFunction.startOffset,
origin, endOffset = oldFunction.endOffset,
IrSimpleFunctionSymbolImpl(), origin = origin,
name, name = name,
visibility, visibility = visibility,
modality,
oldFunction.returnType,
isInline = oldFunction.isInline, isInline = oldFunction.isInline,
isExternal = false, isExpect = oldFunction.isExpect,
returnType = oldFunction.returnType,
modality = modality,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false, isTailrec = false,
isSuspend = oldFunction.isSuspend, isSuspend = oldFunction.isSuspend,
isExpect = oldFunction.isExpect,
isFakeOverride = isFakeOverride,
isOperator = oldFunction is IrSimpleFunction && oldFunction.isOperator, isOperator = oldFunction is IrSimpleFunction && oldFunction.isOperator,
isInfix = oldFunction is IrSimpleFunction && oldFunction.isInfix, isInfix = oldFunction is IrSimpleFunction && oldFunction.isInfix,
isExternal = false,
containerSource = oldFunction.containerSource, containerSource = oldFunction.containerSource,
isFakeOverride = isFakeOverride,
).apply { ).apply {
parent = irParent parent = irParent
@@ -24,18 +24,22 @@ fun SymbolTable.declareSimpleFunctionWithOverrides(
) = ) =
declareSimpleFunction(descriptor) { declareSimpleFunction(descriptor) {
with(descriptor) { with(descriptor) {
irFactory.createFunction( irFactory.createSimpleFunction(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this), startOffset = startOffset,
visibility, endOffset = endOffset,
modality, origin = origin,
IrUninitializedType, name = nameProvider.nameForDeclaration(this),
isInline, visibility = visibility,
isEffectivelyExternal(), isInline = isInline,
isTailrec, isExpect = isExpect,
isSuspend, returnType = IrUninitializedType,
isOperator, modality = modality,
isInfix, symbol = it,
isExpect, isTailrec = isTailrec,
isSuspend = isSuspend,
isOperator = isOperator,
isInfix = isInfix,
isExternal = isEffectivelyExternal(),
isFakeOverride = descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE isFakeOverride = descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
).also { declaration -> ).also { declaration ->
declaration.metadata = DescriptorMetadataSource.Function(this) declaration.metadata = DescriptorMetadataSource.Function(this)
@@ -81,22 +81,22 @@ internal class MissingDeclarationStubGenerator(private val builtIns: IrBuiltIns)
} }
private fun generateSimpleFunction(symbol: IrSimpleFunctionSymbol): IrSimpleFunction { private fun generateSimpleFunction(symbol: IrSimpleFunctionSymbol): IrSimpleFunction {
return builtIns.irFactory.createFunction( return builtIns.irFactory.createSimpleFunction(
startOffset = UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET,
origin = PartiallyLinkedDeclarationOrigin.MISSING_DECLARATION, origin = PartiallyLinkedDeclarationOrigin.MISSING_DECLARATION,
symbol = symbol,
name = symbol.guessName(), name = symbol.guessName(),
visibility = DescriptorVisibilities.DEFAULT_VISIBILITY, visibility = DescriptorVisibilities.DEFAULT_VISIBILITY,
modality = Modality.FINAL,
returnType = builtIns.nothingType,
isInline = false, isInline = false,
isExternal = false, isExpect = false,
returnType = builtIns.nothingType,
modality = Modality.FINAL,
symbol = symbol,
isTailrec = false, isTailrec = false,
isSuspend = false, isSuspend = false,
isOperator = false, isOperator = false,
isInfix = false, isInfix = false,
isExpect = false isExternal = false
).setCommonParent() ).setCommonParent()
} }
@@ -599,21 +599,23 @@ class IrDeclarationDeserializer(
val flags = FunctionFlags.decode(fcode) val flags = FunctionFlags.decode(fcode)
symbolTable.declareSimpleFunction(idSig, { symbol }) { symbolTable.declareSimpleFunction(idSig, { symbol }) {
val nameType = BinaryNameAndType.decode(proto.base.nameType) val nameType = BinaryNameAndType.decode(proto.base.nameType)
irFactory.createFunction( irFactory.createSimpleFunction(
startOffset, endOffset, origin, startOffset = startOffset,
it, endOffset = endOffset,
deserializeName(nameType.nameIndex), origin = origin,
flags.visibility, name = deserializeName(nameType.nameIndex),
flags.modality, visibility = flags.visibility,
IrUninitializedType, isInline = flags.isInline,
flags.isInline, isExpect = flags.isExpect,
flags.isExternal || isEffectivelyExternal, returnType = IrUninitializedType,
flags.isTailrec, modality = flags.modality,
flags.isSuspend, symbol = it,
flags.isOperator, isTailrec = flags.isTailrec,
flags.isInfix, isSuspend = flags.isSuspend,
flags.isExpect, isOperator = flags.isOperator,
flags.isFakeOverride isInfix = flags.isInfix,
isExternal = flags.isExternal || isEffectivelyExternal,
isFakeOverride = flags.isFakeOverride,
) )
}.apply { }.apply {
overriddenSymbols = proto.overriddenList.memoryOptimizedMap { deserializeIrSymbolAndRemap(it).checkSymbolType(FUNCTION_SYMBOL) } overriddenSymbols = proto.overriddenList.memoryOptimizedMap { deserializeIrSymbolAndRemap(it).checkSymbolType(FUNCTION_SYMBOL) }
@@ -29,22 +29,22 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont
private val symbols = context.ir.symbols private val symbols = context.ir.symbols
private fun generateFunction(baseFunction: IrSimpleFunction, delegatingToFunction: IrSimpleFunction?, functionName: Name) = private fun generateFunction(baseFunction: IrSimpleFunction, delegatingToFunction: IrSimpleFunction?, functionName: Name) =
context.irFactory.createFunction( context.irFactory.createSimpleFunction(
baseFunction.startOffset, baseFunction.endOffset, startOffset = baseFunction.startOffset,
IrDeclarationOrigin.GENERATED_SETTER_GETTER, endOffset = baseFunction.endOffset,
IrSimpleFunctionSymbolImpl(), origin = IrDeclarationOrigin.GENERATED_SETTER_GETTER,
functionName, name = functionName,
DescriptorVisibilities.PUBLIC, visibility = DescriptorVisibilities.PUBLIC,
Modality.FINAL,
baseFunction.returnType,
isInline = false, isInline = false,
isExternal = true, isExpect = false,
returnType = baseFunction.returnType,
modality = Modality.FINAL,
symbol = IrSimpleFunctionSymbolImpl(),
isTailrec = false, isTailrec = false,
isSuspend = false, isSuspend = false,
isExpect = false,
isFakeOverride = false,
isOperator = false, isOperator = false,
isInfix = false isInfix = false,
isExternal = true,
).also { function -> ).also { function ->
function.parent = baseFunction.parent function.parent = baseFunction.parent
function.createDispatchReceiverParameter() function.createDispatchReceiverParameter()