diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 7c9ac9e4312..3a4cfff91a1 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -1601,7 +1601,7 @@ class ExpressionCodegen( //avoid ambiguity with type constructor type parameters emptyMap() } else typeArgumentContainer.typeParameters.associate { - it.symbol to element.getTypeArgumentOrDefault(it) + it.symbol to (element.getTypeArgument(it.index) ?: it.defaultType) } val mappings = TypeParameterMappings(typeMapper.typeSystem, typeArguments, allReified = false, typeMapper::mapTypeParameter) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index 5caff5a989d..36db9b192fc 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -862,3 +862,13 @@ internal fun unwrapCallableDescriptorAndTypeArguments(resolvedCall: ResolvedCall return CallBuilder(resolvedCall, substitutedUnwrappedDescriptor, unwrappedTypeArguments) } + +internal inline fun IrMemberAccessExpression<*>.putTypeArguments( + typeArguments: Map?, + toIrType: (KotlinType) -> IrType +) { + if (typeArguments == null) return + for ((typeParameter, typeArgument) in typeArguments) { + putTypeArgument(typeParameter.index, toIrType(typeArgument)) + } +} diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 275d14974c8..67f0e2360c0 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -28,7 +28,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl -import org.jetbrains.kotlin.ir.expressions.putTypeArguments import org.jetbrains.kotlin.ir.expressions.typeParametersCount import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.types.IrSimpleType diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt index 8127518109b..ebe361e66ad 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt @@ -8,14 +8,10 @@ package org.jetbrains.kotlin.ir.expressions import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.types.KotlinType @@ -92,9 +88,6 @@ internal fun IrMemberAccessExpression<*>.throwNoSuchArgumentSlotException(kind: ) } -fun IrMemberAccessExpression<*>.getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): IrType? = - getTypeArgument(typeParameterDescriptor.index) - fun IrMemberAccessExpression<*>.copyTypeArgumentsFrom(other: IrMemberAccessExpression<*>, shift: Int = 0) { assert(typeArgumentsCount == other.typeArgumentsCount + shift) { "Mismatching type arguments: $typeArgumentsCount vs ${other.typeArgumentsCount} + $shift" @@ -104,16 +97,6 @@ fun IrMemberAccessExpression<*>.copyTypeArgumentsFrom(other: IrMemberAccessExpre } } -inline fun IrMemberAccessExpression<*>.putTypeArguments( - typeArguments: Map?, - toIrType: (KotlinType) -> IrType -) { - if (typeArguments == null) return - for ((typeParameter, typeArgument) in typeArguments) { - putTypeArgument(typeParameter.index, toIrType(typeArgument)) - } -} - val CallableDescriptor.typeParametersCount: Int get() = when (this) { @@ -121,43 +104,6 @@ val CallableDescriptor.typeParametersCount: Int else -> typeParameters.size } -fun IrMemberAccessExpression<*>.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) = - getTypeArgument(irTypeParameter.index) ?: irTypeParameter.defaultType - -fun IrMemberAccessExpression<*>.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) = - getValueArgument(valueParameterDescriptor.index) - -fun IrMemberAccessExpression<*>.putValueArgument(valueParameterDescriptor: ValueParameterDescriptor, valueArgument: IrExpression?) { - putValueArgument(valueParameterDescriptor.index, valueArgument) -} - -@ObsoleteDescriptorBasedAPI -inline fun > T.mapTypeParameters(transform: (TypeParameterDescriptor) -> IrType) : T = - apply { - val descriptor = symbol.descriptor as CallableDescriptor - descriptor.typeParameters.forEach { - putTypeArgument(it.index, transform(it)) - } - } - -@ObsoleteDescriptorBasedAPI -inline fun > T.mapValueParameters(transform: (ValueParameterDescriptor) -> IrExpression?): T = - apply { - val descriptor = symbol.descriptor as CallableDescriptor - descriptor.valueParameters.forEach { - putValueArgument(it.index, transform(it)) - } - } - -@ObsoleteDescriptorBasedAPI -inline fun > T.mapValueParametersIndexed(transform: (Int, ValueParameterDescriptor) -> IrExpression?): T = - apply { - val descriptor = symbol.descriptor as CallableDescriptor - descriptor.valueParameters.forEach { - putValueArgument(it.index, transform(it.index, it)) - } - } - fun IrMemberAccessExpression<*>.putArgument(callee: IrFunction, parameter: IrValueParameter, argument: IrExpression) = when (parameter) { callee.dispatchReceiverParameter -> dispatchReceiver = argument diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt index 73bd871edbd..a3e1df7fe63 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt @@ -117,10 +117,11 @@ abstract class DataClassMembersGenerator( irClass.defaultType, constructedClass = irClass ).apply { - mapTypeParameters(::transform) - mapValueParameters { - val irValueParameter = irFunction.valueParameters[it.index] - irGet(irValueParameter.type, irValueParameter.symbol) + for ((i, typeParameter) in constructorSymbol.descriptor.typeParameters.withIndex()) { + putTypeArgument(i, transform(typeParameter)) + } + for ((i, valueParameter) in irFunction.valueParameters.withIndex()) { + putValueArgument(i, irGet(valueParameter.type, valueParameter.symbol)) } } ) 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 597191d899d..db86162e52b 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 @@ -82,7 +82,7 @@ fun IrFunctionAccessExpression.getArgumentsWithSymbols(): List