[IR] Reorder parameters in IrFactory#createValueParameter

This is to prepare for IrFactory auto-generation (KT-59308).
This commit is contained in:
Sergej Jaskiewicz
2023-06-14 14:32:58 +02:00
committed by Space Team
parent 2cc588d6d8
commit 9fcdc10019
23 changed files with 365 additions and 165 deletions
@@ -586,10 +586,18 @@ internal fun IrDeclarationParent.declareThisReceiverParameter(
explicitReceiver: FirReceiverParameter? = null, explicitReceiver: FirReceiverParameter? = null,
): IrValueParameter { ): IrValueParameter {
return symbolTable.irFactory.createValueParameter( return symbolTable.irFactory.createValueParameter(
startOffset, endOffset, thisOrigin, IrValueParameterSymbolImpl(), startOffset = startOffset,
name, UNDEFINED_PARAMETER_INDEX, thisType, endOffset = endOffset,
varargElementType = null, isCrossinline = false, isNoinline = false, origin = thisOrigin,
isHidden = false, isAssignable = false name = name,
type = thisType,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
).apply { ).apply {
this.parent = this@declareThisReceiverParameter this.parent = this@declareThisReceiverParameter
explicitReceiver?.let { annotationGenerator.generate(this, it) } explicitReceiver?.let { annotationGenerator.generate(this, it) }
@@ -331,11 +331,18 @@ class Fir2IrDeclarationStorage(
isNoinline: Boolean = false, isNoinline: Boolean = false,
): IrValueParameter { ): IrValueParameter {
return irFactory.createValueParameter( return irFactory.createValueParameter(
startOffset, endOffset, IrDeclarationOrigin.DEFINED, IrValueParameterSymbolImpl(), startOffset = startOffset,
name ?: SpecialNames.IMPLICIT_SET_PARAMETER, parent.contextReceiverParametersCount, type, endOffset = endOffset,
origin = IrDeclarationOrigin.DEFINED,
name = name ?: SpecialNames.IMPLICIT_SET_PARAMETER,
type = type,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = parent.contextReceiverParametersCount,
varargElementType = null, varargElementType = null,
isCrossinline = isCrossinline, isNoinline = isNoinline, isCrossinline = isCrossinline,
isHidden = false, isAssignable = false isNoinline = isNoinline,
isHidden = false,
).apply { ).apply {
this.parent = parent this.parent = parent
if (firValueParameter != null) { if (firValueParameter != null) {
@@ -1208,12 +1215,20 @@ class Fir2IrDeclarationStorage(
val type = valueParameter.returnTypeRef.toIrType(typeContext) val type = valueParameter.returnTypeRef.toIrType(typeContext)
val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset -> val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset ->
irFactory.createValueParameter( irFactory.createValueParameter(
startOffset, endOffset, origin, IrValueParameterSymbolImpl(), startOffset = startOffset,
valueParameter.name, index, type, endOffset = endOffset,
if (!valueParameter.isVararg) null origin = origin,
else valueParameter.returnTypeRef.coneType.arrayElementType()?.toIrType(typeContext), name = valueParameter.name,
isCrossinline = valueParameter.isCrossinline, isNoinline = valueParameter.isNoinline, type = type,
isHidden = false, isAssignable = false isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType =
if (!valueParameter.isVararg) null
else valueParameter.returnTypeRef.coneType.arrayElementType()?.toIrType(typeContext),
isCrossinline = valueParameter.isCrossinline,
isNoinline = valueParameter.isNoinline,
isHidden = false,
).apply { ).apply {
if (!skipDefaultParameter && valueParameter.defaultValue.let { if (!skipDefaultParameter && valueParameter.defaultValue.let {
it != null && (useStubForDefaultValueStub || it !is FirExpressionStub) it != null && (useStubForDefaultValueStub || it !is FirExpressionStub)
@@ -1240,11 +1255,18 @@ class Fir2IrDeclarationStorage(
val type = contextReceiver.typeRef.toIrType() val type = contextReceiver.typeRef.toIrType()
return contextReceiver.convertWithOffsets { startOffset, endOffset -> return contextReceiver.convertWithOffsets { startOffset, endOffset ->
irFactory.createValueParameter( irFactory.createValueParameter(
startOffset, endOffset, IrDeclarationOrigin.DEFINED, IrValueParameterSymbolImpl(), startOffset = startOffset,
NameUtils.contextReceiverName(index), index, type, endOffset = endOffset,
null, origin = IrDeclarationOrigin.DEFINED,
isCrossinline = false, isNoinline = false, name = NameUtils.contextReceiverName(index),
isHidden = false, isAssignable = false type = type,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
) )
} }
} }
@@ -262,18 +262,18 @@ internal class AdapterGenerator(
origin: IrDeclarationOrigin origin: IrDeclarationOrigin
): IrValueParameter = ): IrValueParameter =
irFactory.createValueParameter( irFactory.createValueParameter(
adapterFunction.startOffset, startOffset = adapterFunction.startOffset,
adapterFunction.endOffset, endOffset = adapterFunction.endOffset,
origin, origin = origin,
IrValueParameterSymbolImpl(), name = name,
name, type = type,
index, isAssignable = false,
type, symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = null, varargElementType = null,
isCrossinline = false, isCrossinline = false,
isNoinline = false, isNoinline = false,
isHidden = false, isHidden = false
isAssignable = false
).also { irAdapterValueParameter -> ).also { irAdapterValueParameter ->
irAdapterValueParameter.parent = adapterFunction irAdapterValueParameter.parent = adapterFunction
} }
@@ -277,8 +277,18 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
private fun createSyntheticIrParameter(irFunction: IrFunction, name: Name, type: IrType, index: Int = 0): IrValueParameter = private fun createSyntheticIrParameter(irFunction: IrFunction, name: Name, type: IrType, index: Int = 0): IrValueParameter =
components.irFactory.createValueParameter( components.irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.DEFINED, IrValueParameterSymbolImpl(), name, index, type, null, startOffset = UNDEFINED_OFFSET,
isCrossinline = false, isNoinline = false, isHidden = false, isAssignable = false endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.DEFINED,
name = name,
type = type,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false
).apply { ).apply {
parent = irFunction parent = irFunction
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName
import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
@@ -55,17 +56,18 @@ class EscapedIdentifiersLowering(context: JsIrBackendContext) : BodyLoweringPass
private val IrFunction.dummyDispatchReceiverParameter private val IrFunction.dummyDispatchReceiverParameter
get() = context.irFactory.createValueParameter( get() = context.irFactory.createValueParameter(
startOffset, endOffset, startOffset = startOffset,
origin, endOffset = endOffset,
IrValueParameterSymbolImpl(), origin = origin,
SpecialNames.THIS, name = SpecialNames.THIS,
-1, type = context.irBuiltIns.anyType,
context.irBuiltIns.anyType, isAssignable = false,
null, symbol = IrValueParameterSymbolImpl(),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false, isCrossinline = false,
isNoinline = false, isNoinline = false,
isHidden = false, isHidden = false,
isAssignable = false
).also { it.parent = this } ).also { it.parent = this }
override fun visitGetValue(expression: IrGetValue): IrExpression { override fun visitGetValue(expression: IrGetValue): IrExpression {
@@ -549,10 +549,18 @@ private class ScriptToClassTransformer(
private fun IrDeclarationParent.createThisReceiverParameter(origin: IrDeclarationOrigin, type: IrType): IrValueParameter = private fun IrDeclarationParent.createThisReceiverParameter(origin: IrDeclarationOrigin, type: IrType): IrValueParameter =
context.symbolTable.irFactory.createValueParameter( context.symbolTable.irFactory.createValueParameter(
startOffset, endOffset, origin, IrValueParameterSymbolImpl(), startOffset = startOffset,
SpecialNames.THIS, UNDEFINED_PARAMETER_INDEX, type, endOffset = endOffset,
varargElementType = null, isCrossinline = false, isNoinline = false, origin = origin,
isHidden = false, isAssignable = false name = SpecialNames.THIS,
type = type,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
).also { ).also {
it.parent = this it.parent = this
} }
@@ -127,8 +127,18 @@ class IrBuiltInsOverDescriptors(
val valueParameterDescriptor = operatorDescriptor.valueParameters[i] val valueParameterDescriptor = operatorDescriptor.valueParameters[i]
val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor) val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor)
irFactory.createValueParameter( irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, valueParameterSymbol, Name.identifier("arg$i"), i, startOffset = UNDEFINED_OFFSET,
valueParameterType, null, isCrossinline = false, isNoinline = false, isHidden = false, isAssignable = false endOffset = UNDEFINED_OFFSET,
origin = BUILTIN_OPERATOR,
name = Name.identifier("arg$i"),
type = valueParameterType,
isAssignable = false,
symbol = valueParameterSymbol,
index = i,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false
).apply { ).apply {
parent = operator parent = operator
} }
@@ -232,8 +242,18 @@ class IrBuiltInsOverDescriptors(
val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor) val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor)
val valueParameter = irFactory.createValueParameter( val valueParameter = irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, valueParameterSymbol, Name.identifier("arg0"), 0, startOffset = UNDEFINED_OFFSET,
valueIrType, null, isCrossinline = false, isNoinline = false, isHidden = false, isAssignable = false endOffset = UNDEFINED_OFFSET,
origin = BUILTIN_OPERATOR,
name = Name.identifier("arg0"),
type = valueIrType,
isAssignable = false,
symbol = valueParameterSymbol,
index = 0,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
) )
valueParameter.parent = operator valueParameter.parent = operator
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
@@ -279,12 +280,18 @@ class IrDescriptorBasedFunctionFactory(
private fun createThisReceiver(descriptorFactory: FunctionDescriptorFactory): IrValueParameter { private fun createThisReceiver(descriptorFactory: FunctionDescriptorFactory): IrValueParameter {
val descriptor = descriptorFactory.classReceiverParameterDescriptor() val descriptor = descriptorFactory.classReceiverParameterDescriptor()
return irFactory.createValueParameter( return irFactory.createValueParameter(
offset, offset, classOrigin, IrValueParameterSymbolImpl(descriptor), SpecialNames.THIS, -1, startOffset = offset,
typeTranslator.translateType(descriptor.type), null, endOffset = offset,
origin = classOrigin,
name = SpecialNames.THIS,
type = typeTranslator.translateType(descriptor.type),
isAssignable = false,
symbol = IrValueParameterSymbolImpl(descriptor),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false, isCrossinline = false,
isNoinline = false, isNoinline = false,
isHidden = false, isHidden = false,
isAssignable = false
) )
} }
@@ -330,11 +337,18 @@ class IrDescriptorBasedFunctionFactory(
buildSimpleType() buildSimpleType()
} }
val vDeclaration = irFactory.createValueParameter( val vDeclaration = irFactory.createValueParameter(
offset, offset, memberOrigin, vSymbol, Name.identifier("p$i"), i - 1, vType, null, startOffset = offset,
endOffset = offset,
origin = memberOrigin,
name = Name.identifier("p$i"),
type = vType,
isAssignable = false,
symbol = vSymbol,
index = i - 1,
varargElementType = null,
isCrossinline = false, isCrossinline = false,
isNoinline = false, isNoinline = false,
isHidden = false, isHidden = false,
isAssignable = false
) )
vDeclaration.parent = fDeclaration vDeclaration.parent = fDeclaration
fDeclaration.valueParameters += vDeclaration fDeclaration.valueParameters += vDeclaration
@@ -364,8 +378,18 @@ class IrDescriptorBasedFunctionFactory(
private fun IrFunction.createValueParameter(descriptor: ParameterDescriptor): IrValueParameter = with(descriptor) { private fun IrFunction.createValueParameter(descriptor: ParameterDescriptor): IrValueParameter = with(descriptor) {
irFactory.createValueParameter( irFactory.createValueParameter(
offset, offset, memberOrigin, IrValueParameterSymbolImpl(this), name, indexOrMinusOne, toIrType(type), startOffset = offset,
(this as? ValueParameterDescriptor)?.varargElementType?.let(::toIrType), isCrossinline, isNoinline, false, false endOffset = offset,
origin = memberOrigin,
name = name,
type = toIrType(type),
isAssignable = false,
symbol = IrValueParameterSymbolImpl(this),
index = indexOrMinusOne,
varargElementType = (this as? ValueParameterDescriptor)?.varargElementType?.let(::toIrType),
isCrossinline = isCrossinline,
isNoinline = isNoinline,
isHidden = false
).also { ).also {
it.parent = this@createValueParameter it.parent = this@createValueParameter
} }
@@ -449,9 +449,18 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
fun createValueParameter(name: String, index: Int, type: IrType): IrValueParameter = fun createValueParameter(name: String, index: Int, type: IrType): IrValueParameter =
context.irFactory.createValueParameter( context.irFactory.createValueParameter(
startOffset, endOffset, IrDeclarationOrigin.ADAPTER_PARAMETER_FOR_SUSPEND_CONVERSION, IrValueParameterSymbolImpl(), startOffset = startOffset,
Name.identifier(name), index, type, varargElementType = null, isCrossinline = false, isNoinline = false, endOffset = endOffset,
isHidden = false, isAssignable = false origin = IrDeclarationOrigin.ADAPTER_PARAMETER_FOR_SUSPEND_CONVERSION,
name = Name.identifier(name),
type = type,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
) )
irAdapterFun.extensionReceiverParameter = createValueParameter("callee", -1, funType.toIrType()) irAdapterFun.extensionReceiverParameter = createValueParameter("callee", -1, funType.toIrType())
@@ -497,13 +497,18 @@ internal class ReflectionReferencesGenerator(statementGenerator: StatementGenera
private fun createAdapterParameter(startOffset: Int, endOffset: Int, name: Name, index: Int, type: KotlinType): IrValueParameter = private fun createAdapterParameter(startOffset: Int, endOffset: Int, name: Name, index: Int, type: KotlinType): IrValueParameter =
context.irFactory.createValueParameter( context.irFactory.createValueParameter(
startOffset, endOffset, startOffset = startOffset,
IrDeclarationOrigin.ADAPTER_PARAMETER_FOR_CALLABLE_REFERENCE, endOffset = endOffset,
IrValueParameterSymbolImpl(), origin = IrDeclarationOrigin.ADAPTER_PARAMETER_FOR_CALLABLE_REFERENCE,
name, name = name,
index, type = type.toIrType(),
type.toIrType(), isAssignable = false,
varargElementType = null, isCrossinline = false, isNoinline = false, isHidden = false, isAssignable = false symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
) )
fun generateCallableReference( fun generateCallableReference(
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.IrFunctionBuilder import org.jetbrains.kotlin.ir.builders.declarations.IrFunctionBuilder
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
@@ -62,12 +63,18 @@ internal class ScriptGenerator(declarationGenerator: DeclarationGenerator) : Dec
type type
) { symbol -> ) { symbol ->
context.irFactory.createValueParameter( context.irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
origin, symbol, context.symbolTable.nameProvider.nameForDeclaration(descriptor), endOffset = UNDEFINED_OFFSET,
if (index != -1) index else descriptor.indexOrMinusOne, origin = origin,
type, varargElementType, name = context.symbolTable.nameProvider.nameForDeclaration(descriptor),
descriptor.isCrossinline, descriptor.isNoinline, type = type,
isHidden = false, isAssignable = false isAssignable = false,
symbol = symbol,
index = if (index != UNDEFINED_PARAMETER_INDEX) index else descriptor.indexOrMinusOne,
varargElementType = varargElementType,
isCrossinline = descriptor.isCrossinline,
isNoinline = descriptor.isNoinline,
isHidden = false,
) )
}.also { it.parent = irScript } }.also { it.parent = irScript }
} }
@@ -92,12 +99,18 @@ internal class ScriptGenerator(declarationGenerator: DeclarationGenerator) : Dec
fun createValueParameter(valueParameterDescriptor: ValueParameterDescriptor): IrValueParameter { fun createValueParameter(valueParameterDescriptor: ValueParameterDescriptor): IrValueParameter {
return context.irFactory.createValueParameter( return context.irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
IrDeclarationOrigin.SCRIPT_CALL_PARAMETER, IrValueParameterSymbolImpl(), endOffset = UNDEFINED_OFFSET,
valueParameterDescriptor.name, parametersIndex++, origin = IrDeclarationOrigin.SCRIPT_CALL_PARAMETER,
valueParameterDescriptor.type.toIrType(), valueParameterDescriptor.varargElementType?.toIrType(), name = valueParameterDescriptor.name,
valueParameterDescriptor.isCrossinline, valueParameterDescriptor.isNoinline, type = valueParameterDescriptor.type.toIrType(),
false, false isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = parametersIndex++,
varargElementType = valueParameterDescriptor.varargElementType?.toIrType(),
isCrossinline = valueParameterDescriptor.isCrossinline,
isNoinline = valueParameterDescriptor.isNoinline,
isHidden = false
).also { it.parent = irScript } ).also { it.parent = irScript }
} }
@@ -130,9 +143,18 @@ internal class ScriptGenerator(declarationGenerator: DeclarationGenerator) : Dec
IrDeclarationOrigin.SCRIPT_PROVIDED_PROPERTY, parameter, type IrDeclarationOrigin.SCRIPT_PROVIDED_PROPERTY, parameter, type
) { symbol -> ) { symbol ->
context.irFactory.createValueParameter( context.irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
IrDeclarationOrigin.SCRIPT_PROVIDED_PROPERTY, symbol, descriptor.name, endOffset = UNDEFINED_OFFSET,
parametersIndex, type, null, isCrossinline = false, isNoinline = false, isHidden = false, isAssignable = false origin = IrDeclarationOrigin.SCRIPT_PROVIDED_PROPERTY,
name = descriptor.name,
type = type,
isAssignable = false,
symbol = symbol,
index = parametersIndex,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
).also { it.parent = irScript } ).also { it.parent = irScript }
} }
parametersIndex++ parametersIndex++
@@ -291,10 +291,18 @@ fun <D> buildReceiverParameter(
): IrValueParameter ): IrValueParameter
where D : IrDeclaration, D : IrDeclarationParent = where D : IrDeclaration, D : IrDeclarationParent =
parent.factory.createValueParameter( parent.factory.createValueParameter(
startOffset, endOffset, origin, startOffset = startOffset,
IrValueParameterSymbolImpl(), endOffset = endOffset,
SpecialNames.THIS, -1, type, null, isCrossinline = false, isNoinline = false, origin = origin,
isHidden = false, isAssignable = false name = SpecialNames.THIS,
type = type,
isAssignable = false,
symbol = IrValueParameterSymbolImpl(),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
).also { ).also {
it.parent = parent it.parent = parent
} }
@@ -302,9 +310,18 @@ fun <D> buildReceiverParameter(
fun IrFactory.buildValueParameter(builder: IrValueParameterBuilder, parent: IrDeclarationParent): IrValueParameter = fun IrFactory.buildValueParameter(builder: IrValueParameterBuilder, parent: IrDeclarationParent): IrValueParameter =
with(builder) { with(builder) {
return createValueParameter( return createValueParameter(
startOffset, endOffset, origin, startOffset = startOffset,
IrValueParameterSymbolImpl(), endOffset = endOffset,
name, index, type, varargElementType, isCrossInline, isNoinline, isHidden, isAssignable origin = origin,
name = name,
type = type,
isAssignable = isAssignable,
symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = varargElementType,
isCrossinline = isCrossInline,
isNoinline = isNoinline,
isHidden = isHidden
).also { ).also {
it.parent = parent it.parent = parent
} }
@@ -194,15 +194,15 @@ interface IrFactory {
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrValueParameterSymbol,
name: Name, name: Name,
index: Int,
type: IrType, type: IrType,
isAssignable: Boolean,
symbol: IrValueParameterSymbol,
index: Int,
varargElementType: IrType?, varargElementType: IrType?,
isCrossinline: Boolean, isCrossinline: Boolean,
isNoinline: Boolean, isNoinline: Boolean,
isHidden: Boolean, isHidden: Boolean
isAssignable: Boolean
): IrValueParameter ): IrValueParameter
// Bodies // Bodies
@@ -236,15 +236,15 @@ abstract class AbstractIrFactoryImpl : IrFactory {
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrValueParameterSymbol,
name: Name, name: Name,
index: Int,
type: IrType, type: IrType,
isAssignable: Boolean,
symbol: IrValueParameterSymbol,
index: Int,
varargElementType: IrType?, varargElementType: IrType?,
isCrossinline: Boolean, isCrossinline: Boolean,
isNoinline: Boolean, isNoinline: Boolean,
isHidden: Boolean, isHidden: Boolean,
isAssignable: Boolean,
): IrValueParameter = ): IrValueParameter =
IrValueParameterImpl( IrValueParameterImpl(
startOffset, endOffset, origin, symbol, name, index, type, varargElementType, startOffset, endOffset, origin, symbol, name, index, type, varargElementType,
@@ -368,29 +368,29 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrValueParameterSymbol,
name: Name, name: Name,
index: Int,
type: IrType, type: IrType,
isAssignable: Boolean,
symbol: IrValueParameterSymbol,
index: Int,
varargElementType: IrType?, varargElementType: IrType?,
isCrossinline: Boolean, isCrossinline: Boolean,
isNoinline: Boolean, isNoinline: Boolean,
isHidden: Boolean, isHidden: Boolean
isAssignable: Boolean
): IrValueParameter { ): IrValueParameter {
return super.createValueParameter( return super.createValueParameter(
startOffset, startOffset,
endOffset, endOffset,
origin, origin,
symbol,
name, name,
index,
type, type,
isAssignable,
symbol,
index,
varargElementType, varargElementType,
isCrossinline, isCrossinline,
isNoinline, isNoinline,
isHidden, isHidden,
isAssignable,
).register() ).register()
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.declarations.lazy
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
@@ -30,9 +31,18 @@ interface IrLazyDeclarationBase : IrDeclaration {
fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter = fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter =
factory.createValueParameter( factory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrValueParameterSymbolImpl(this), startOffset = UNDEFINED_OFFSET,
name, -1, type.toIrType(), null, isCrossinline = false, isNoinline = false, endOffset = UNDEFINED_OFFSET,
isHidden = false, isAssignable = false origin = origin,
name = name,
type = type.toIrType(),
isAssignable = false,
symbol = IrValueParameterSymbolImpl(this),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
) )
fun createLazyAnnotations(): ReadWriteProperty<Any?, List<IrConstructorCall>> = lazyVar(stubGenerator.lock) { fun createLazyAnnotations(): ReadWriteProperty<Any?, List<IrConstructorCall>> = lazyVar(stubGenerator.lock) {
@@ -43,9 +43,18 @@ interface IrLazyFunctionBase : IrLazyDeclarationBase, IrTypeParametersContainer
val result = arrayListOf<IrValueParameter>() val result = arrayListOf<IrValueParameter>()
descriptor.contextReceiverParameters.mapIndexedTo(result) { i, contextReceiverParameter -> descriptor.contextReceiverParameters.mapIndexedTo(result) { i, contextReceiverParameter ->
factory.createValueParameter( factory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrValueParameterSymbolImpl(contextReceiverParameter), startOffset = UNDEFINED_OFFSET,
Name.identifier("contextReceiverParameter$i"), i, contextReceiverParameter.type.toIrType(), endOffset = UNDEFINED_OFFSET,
null, isCrossinline = false, isNoinline = false, isHidden = false, isAssignable = false origin = origin,
name = Name.identifier("contextReceiverParameter$i"),
type = contextReceiverParameter.type.toIrType(),
isAssignable = false,
symbol = IrValueParameterSymbolImpl(contextReceiverParameter),
index = i,
varargElementType = null,
isCrossinline = false,
isNoinline = false,
isHidden = false,
).apply { parent = this@IrLazyFunctionBase } ).apply { parent = this@IrLazyFunctionBase }
} }
descriptor.valueParameters.mapTo(result) { descriptor.valueParameters.mapTo(result) {
@@ -91,17 +91,18 @@ class FakeOverrideCopier(
override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter = override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter =
declaration.factory.createValueParameter( declaration.factory.createValueParameter(
declaration.startOffset, declaration.endOffset, startOffset = declaration.startOffset,
mapDeclarationOrigin(declaration.origin), endOffset = declaration.endOffset,
symbolRemapper.getDeclaredValueParameter(declaration.symbol), origin = mapDeclarationOrigin(declaration.origin),
symbolRenamer.getValueParameterName(declaration.symbol), name = symbolRenamer.getValueParameterName(declaration.symbol),
declaration.index, type = declaration.type.remapType(),
declaration.type.remapType(), isAssignable = declaration.isAssignable,
declaration.varargElementType?.remapType(), symbol = symbolRemapper.getDeclaredValueParameter(declaration.symbol),
declaration.isCrossinline, index = declaration.index,
declaration.isNoinline, varargElementType = declaration.varargElementType?.remapType(),
declaration.isHidden, isCrossinline = declaration.isCrossinline,
declaration.isAssignable isNoinline = declaration.isNoinline,
isHidden = declaration.isHidden,
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
// Don't set the default value for fake overrides. // Don't set the default value for fake overrides.
@@ -373,17 +373,18 @@ open class DeepCopyIrTreeWithSymbols(
override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter = override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter =
declaration.factory.createValueParameter( declaration.factory.createValueParameter(
declaration.startOffset, declaration.endOffset, startOffset = declaration.startOffset,
mapDeclarationOrigin(declaration.origin), endOffset = declaration.endOffset,
symbolRemapper.getDeclaredValueParameter(declaration.symbol), origin = mapDeclarationOrigin(declaration.origin),
symbolRenamer.getValueParameterName(declaration.symbol), name = symbolRenamer.getValueParameterName(declaration.symbol),
declaration.index, type = declaration.type.remapType(),
declaration.type.remapType(), isAssignable = declaration.isAssignable,
declaration.varargElementType?.remapType(), symbol = symbolRemapper.getDeclaredValueParameter(declaration.symbol),
declaration.isCrossinline, index = declaration.index,
declaration.isNoinline, varargElementType = declaration.varargElementType?.remapType(),
declaration.isHidden, isCrossinline = declaration.isCrossinline,
declaration.isAssignable isNoinline = declaration.isNoinline,
isHidden = declaration.isHidden,
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
defaultValue = declaration.defaultValue?.transform() defaultValue = declaration.defaultValue?.transform()
@@ -8,10 +8,7 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor import org.jetbrains.kotlin.ir.builders.declarations.*
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
import org.jetbrains.kotlin.ir.builders.irImplicitCast import org.jetbrains.kotlin.ir.builders.irImplicitCast
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
@@ -799,9 +796,18 @@ fun IrValueParameter.copyTo(
} }
} }
return factory.createValueParameter( return factory.createValueParameter(
startOffset, endOffset, origin, symbol, startOffset = startOffset,
name, index, type, varargElementType, isCrossinline = isCrossinline, endOffset = endOffset,
isNoinline = isNoinline, isHidden = false, isAssignable = isAssignable origin = origin,
name = name,
type = type,
isAssignable = isAssignable,
symbol = symbol,
index = index,
varargElementType = varargElementType,
isCrossinline = isCrossinline,
isNoinline = isNoinline,
isHidden = false,
).also { ).also {
it.parent = irFunction it.parent = irFunction
it.defaultValue = defaultValueCopy it.defaultValue = defaultValueCopy
@@ -823,13 +829,18 @@ fun IrTypeParameter.copyToWithoutSuperTypes(
fun IrFunction.copyReceiverParametersFrom(from: IrFunction, substitutionMap: Map<IrTypeParameterSymbol, IrType>) { fun IrFunction.copyReceiverParametersFrom(from: IrFunction, substitutionMap: Map<IrTypeParameterSymbol, IrType>) {
dispatchReceiverParameter = from.dispatchReceiverParameter?.run { dispatchReceiverParameter = from.dispatchReceiverParameter?.run {
factory.createValueParameter( factory.createValueParameter(
startOffset, endOffset, origin, startOffset = startOffset,
IrValueParameterSymbolImpl(), endOffset = endOffset,
name, index, origin = origin,
type.substitute(substitutionMap), name = name,
varargElementType?.substitute(substitutionMap), type = type.substitute(substitutionMap),
isCrossinline, isNoinline, isAssignable = isAssignable,
isHidden, isAssignable symbol = IrValueParameterSymbolImpl(),
index = index,
varargElementType = varargElementType?.substitute(substitutionMap),
isCrossinline = isCrossinline,
isNoinline = isNoinline,
isHidden = isHidden,
).also { parameter -> ).also { parameter ->
parameter.parent = this@copyReceiverParametersFrom parameter.parent = this@copyReceiverParametersFrom
} }
@@ -1098,17 +1109,18 @@ fun IrFunction.createDispatchReceiverParameter(origin: IrDeclarationOrigin? = nu
assert(dispatchReceiverParameter == null) assert(dispatchReceiverParameter == null)
dispatchReceiverParameter = factory.createValueParameter( dispatchReceiverParameter = factory.createValueParameter(
startOffset, endOffset, startOffset = startOffset,
origin ?: parentAsClass.origin, endOffset = endOffset,
IrValueParameterSymbolImpl(), origin = origin ?: parentAsClass.origin,
SpecialNames.THIS, name = SpecialNames.THIS,
-1, type = parentAsClass.defaultType,
parentAsClass.defaultType, isAssignable = false,
null, symbol = IrValueParameterSymbolImpl(),
index = UNDEFINED_PARAMETER_INDEX,
varargElementType = null,
isCrossinline = false, isCrossinline = false,
isNoinline = false, isNoinline = false,
isHidden = false, isHidden = false,
isAssignable = false
).apply { ).apply {
parent = this@createDispatchReceiverParameter parent = this@createDispatchReceiverParameter
} }
@@ -1065,9 +1065,18 @@ open class SymbolTable(
isAssignable: Boolean = false, isAssignable: Boolean = false,
valueParameterFactory: (IrValueParameterSymbol) -> IrValueParameter = { valueParameterFactory: (IrValueParameterSymbol) -> IrValueParameter = {
irFactory.createValueParameter( irFactory.createValueParameter(
startOffset, endOffset, origin, it, name ?: nameProvider.nameForDeclaration(descriptor), startOffset = startOffset,
index ?: descriptor.indexOrMinusOne, type, varargElementType, descriptor.isCrossinline, descriptor.isNoinline, endOffset = endOffset,
isHidden = false, isAssignable = isAssignable origin = origin,
name = name ?: nameProvider.nameForDeclaration(descriptor),
type = type,
isAssignable = isAssignable,
symbol = it,
index = index ?: descriptor.indexOrMinusOne,
varargElementType = varargElementType,
isCrossinline = descriptor.isCrossinline,
isNoinline = descriptor.isNoinline,
isHidden = false,
) )
} }
): IrValueParameter = ): IrValueParameter =
@@ -329,16 +329,18 @@ class IrDeclarationDeserializer(
val flags = ValueParameterFlags.decode(fcode) val flags = ValueParameterFlags.decode(fcode)
val nameAndType = BinaryNameAndType.decode(proto.nameType) val nameAndType = BinaryNameAndType.decode(proto.nameType)
irFactory.createValueParameter( irFactory.createValueParameter(
startOffset, endOffset, origin, startOffset = startOffset,
symbol.checkSymbolType(fallbackSymbolKind = null), endOffset = endOffset,
deserializeName(nameAndType.nameIndex), origin = origin,
index, name = deserializeName(nameAndType.nameIndex),
deserializeIrType(nameAndType.typeIndex), type = deserializeIrType(nameAndType.typeIndex),
if (proto.hasVarargElementType()) deserializeIrType(proto.varargElementType) else null, isAssignable = flags.isAssignable,
flags.isCrossInline, symbol = symbol.checkSymbolType(fallbackSymbolKind = null),
flags.isNoInline, index = index,
flags.isHidden, varargElementType = if (proto.hasVarargElementType()) deserializeIrType(proto.varargElementType) else null,
flags.isAssignable isCrossinline = flags.isCrossInline,
isNoinline = flags.isNoInline,
isHidden = flags.isHidden,
).apply { ).apply {
if (proto.hasDefaultValue()) if (proto.hasDefaultValue())
defaultValue = deserializeExpressionBody(proto.defaultValue) defaultValue = deserializeExpressionBody(proto.defaultValue)
@@ -361,9 +361,18 @@ private fun TranslationPluginContext.declareParameterStub(parameterDescriptor: P
val type = typeTranslator.translateType(parameterDescriptor.type) val type = typeTranslator.translateType(parameterDescriptor.type)
val varargElementType = parameterDescriptor.varargElementType?.let { typeTranslator.translateType(it) } val varargElementType = parameterDescriptor.varargElementType?.let { typeTranslator.translateType(it) }
return irFactory.createValueParameter( return irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.DEFINED, symbol, parameterDescriptor.name, startOffset = UNDEFINED_OFFSET,
parameterDescriptor.indexOrMinusOne, type, varargElementType, parameterDescriptor.isCrossinline, endOffset = UNDEFINED_OFFSET,
parameterDescriptor.isNoinline, isHidden = false, isAssignable = false origin = IrDeclarationOrigin.DEFINED,
name = parameterDescriptor.name,
type = type,
isAssignable = false,
symbol = symbol,
index = parameterDescriptor.indexOrMinusOne,
varargElementType = varargElementType,
isCrossinline = parameterDescriptor.isCrossinline,
isNoinline = parameterDescriptor.isNoinline,
isHidden = false,
) )
} }