diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index b9ef597b7c9..22eff0f0ea7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility -import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.Scope @@ -432,14 +431,20 @@ fun IrFunction.createDispatchReceiverParameter(origin: IrDeclarationOrigin? = nu val IrFunction.allParameters: List get() = if (this is IrConstructor) { - listOf( - this.constructedClass.thisReceiver - ?: error(this.render()) - ) + explicitParameters + ArrayList(allParametersCount).also { + it.add( + this.constructedClass.thisReceiver + ?: error(this.render()) + ) + addExplicitParametersTo(it) + } } else { explicitParameters } +val IrFunction.allParametersCount: Int + get() = if (this is IrConstructor) explicitParametersCount + 1 else explicitParametersCount + private object FakeOverrideBuilder : FakeOverrideBuilderStrategy() { override fun linkFakeOverride(fakeOverride: IrOverridableMember) { when (fakeOverride) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineIntrinsicsSupport.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineIntrinsicsSupport.kt index 4d533132e76..7e916c196b5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineIntrinsicsSupport.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineIntrinsicsSupport.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen -import org.jetbrains.kotlin.backend.common.ir.allParameters +import org.jetbrains.kotlin.backend.common.ir.allParametersCount import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.intrinsics.SignatureString import org.jetbrains.kotlin.backend.jvm.lower.FunctionReferenceLowering @@ -64,7 +64,7 @@ class IrInlineIntrinsicsSupport( // thus cannot have a backing field, and is required to have a getter. val getter = property.getter ?: error("Property without getter: ${property.render()}") - val arity = getter.allParameters.size + val arity = getter.allParametersCount val implClass = (if (property.isVar) MUTABLE_PROPERTY_REFERENCE_IMPL else PROPERTY_REFERENCE_IMPL).getOrNull(arity) ?: error("No property reference impl class with arity $arity (${property.render()}") @@ -77,7 +77,7 @@ class IrInlineIntrinsicsSupport( v.anew(implClass) v.dup() if (withArity) { - v.aconst(function.allParameters.size) + v.aconst(function.allParametersCount) } putClassInstance(v, FunctionReferenceLowering.getOwnerKClassType(declaration.parent, context)) v.aconst(declaration.name.asString()) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 5f347bcccd0..5130c0f99dc 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.utils.DFS +import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs /** @@ -199,8 +200,22 @@ val IrClass.primaryConstructor: IrConstructor? val IrDeclarationContainer.properties: Sequence get() = declarations.asSequence().filterIsInstance() +fun IrFunction.addExplicitParametersTo(parametersList: MutableList) { + parametersList.addIfNotNull(dispatchReceiverParameter) + parametersList.addIfNotNull(extensionReceiverParameter) + parametersList.addAll(valueParameters) +} + +private fun Boolean.toInt(): Int = if (this) 1 else 0 + +val IrFunction.explicitParametersCount: Int + get() = (dispatchReceiverParameter != null).toInt() + (extensionReceiverParameter != null).toInt() + + valueParameters.size + val IrFunction.explicitParameters: List - get() = (listOfNotNull(dispatchReceiverParameter, extensionReceiverParameter) + valueParameters) + get() = ArrayList(explicitParametersCount).also { + addExplicitParametersTo(it) + } val IrBody.statements: List get() = when (this) {