diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt index 088d8731739..04c98cddfd5 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.types.IrDynamicType import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.util.referenceFunction import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.psi.KtElement @@ -127,6 +126,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator IrCallImpl( startOffset, endOffset, descriptor.type.toIrType(), getterSymbol, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY ).apply { + context.callToSubstitutedDescriptorMap[this] = getterDescriptor putTypeArguments(typeArguments) { it.toIrType() } } } else @@ -142,6 +142,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator context.irBuiltIns.unitType, constructorSymbol ).apply { + context.callToSubstitutedDescriptorMap[this] = descriptor putTypeArguments(call.typeArguments) { it.toIrType() } this.dispatchReceiver = dispatchReceiver?.load() this.extensionReceiver = extensionReceiver?.load() @@ -160,6 +161,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator if (extensionReceiver != null) throw AssertionError("Extension receiver should be null: $extensionReceiver") val constructorSymbol = context.symbolTable.referenceConstructor(constructorDescriptor.original) val irCall = IrEnumConstructorCallImpl(startOffset, endOffset, context.irBuiltIns.unitType, constructorSymbol) + context.callToSubstitutedDescriptorMap[irCall] = constructorDescriptor addParametersToCall(startOffset, endOffset, call, irCall, context.irBuiltIns.unitType) } } @@ -208,6 +210,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator IrStatementOrigin.GET_PROPERTY, superQualifierSymbol ).apply { + context.callToSubstitutedDescriptorMap[this] = getMethodDescriptor putTypeArguments(call.typeArguments) { it.toIrType() } dispatchReceiver = dispatchReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load() @@ -254,6 +257,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator originalSymbol, origin ).run { + context.callToSubstitutedDescriptorMap[this] = constructorDescriptor putTypeArguments(call.typeArguments) { it.toIrType() } dispatchReceiver = dispatchReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load() @@ -328,6 +332,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator origin, call.superQualifier?.let { context.symbolTable.referenceClass(it) } ).run { + context.callToSubstitutedDescriptorMap[this] = functionDescriptor putTypeArguments(call.typeArguments) { it.toIrType() } dispatchReceiver = dispatchReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load() 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 a7e4352e69c..e4cb79d72db 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 @@ -285,6 +285,7 @@ class ClassGenerator( originalSymbol, substitutedOverridden.typeParametersCount ).apply { + context.callToSubstitutedDescriptorMap[this] = substitutedOverridden val typeArguments = getTypeArgumentsForOverriddenDescriptorDelegatingCall(delegated, overridden) putTypeArguments(typeArguments) { it.toIrType() } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt index e84110569a1..cfe3493c6da 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt @@ -18,10 +18,12 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.NotFoundClasses import org.jetbrains.kotlin.ir.builders.IrGeneratorContext import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.util.ConstantValueGenerator import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.TypeTranslator @@ -41,6 +43,7 @@ class GeneratorContext( val constantValueGenerator: ConstantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable) val typeTranslator: TypeTranslator = TypeTranslator(symbolTable, languageVersionSettings, builtIns = moduleDescriptor.builtIns) + val callToSubstitutedDescriptorMap = mutableMapOf() init { typeTranslator.constantValueGenerator = constantValueGenerator diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt index e03fcac3a3e..e4730ab3016 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt @@ -422,6 +422,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat origin = null, superQualifierSymbol = null ).apply { + context.callToSubstitutedDescriptorMap[this] = functionDescriptor dispatchReceiver = receiver } } @@ -506,6 +507,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat checkNotNullSymbol, origin ).apply { + context.callToSubstitutedDescriptorMap[this] = checkNotNullSubstituted putTypeArgument(0, argumentType.toIrType().makeNotNull()) putValueArgument(0, irArgument) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 98212fd7d52..bfe22883342 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -122,7 +122,9 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St context.symbolTable.referenceLocalDelegatedProperty(variableDescriptor), irDelegateSymbol, getterSymbol, setterSymbol, origin - ) + ).apply { + context.callToSubstitutedDescriptorMap[this] = variableDescriptor + } } private fun generatePropertyReference( @@ -148,6 +150,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St originalSetter?.let { context.symbolTable.referenceSimpleFunction(it) }, origin ).apply { + context.callToSubstitutedDescriptorMap[this] = propertyDescriptor putTypeArguments(typeArguments) { it.toIrType() } } } @@ -174,6 +177,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St startOffset, endOffset, type.toIrType(), symbol, descriptor.typeParametersCount, origin ).apply { + context.callToSubstitutedDescriptorMap[this] = descriptor putTypeArguments(typeArguments) { it.toIrType() } } } \ No newline at end of file diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt index 12e83087aaa..8dc523b0e23 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/PropertyLValue.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.psi2ir.intermediate import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.ir.builders.IrGeneratorContext import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression @@ -27,9 +26,10 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext abstract class PropertyLValueBase( - protected val context: IrGeneratorContext, + protected val context: GeneratorContext, val scope: Scope, val startOffset: Int, val endOffset: Int, @@ -66,7 +66,7 @@ abstract class PropertyLValueBase( } class FieldPropertyLValue( - context: IrGeneratorContext, + context: GeneratorContext, scope: Scope, startOffset: Int, endOffset: Int, @@ -117,7 +117,7 @@ class FieldPropertyLValue( } class AccessorPropertyLValue( - context: IrGeneratorContext, + context: GeneratorContext, scope: Scope, startOffset: Int, endOffset: Int, @@ -150,6 +150,7 @@ class AccessorPropertyLValue( origin, superQualifier ).apply { + context.callToSubstitutedDescriptorMap[this] = getterDescriptor putTypeArguments() dispatchReceiver = dispatchReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load() @@ -166,6 +167,7 @@ class AccessorPropertyLValue( origin, superQualifier ).apply { + context.callToSubstitutedDescriptorMap[this] = setterDescriptor putTypeArguments() dispatchReceiver = dispatchReceiverValue?.load() extensionReceiver = extensionReceiverValue?.load() diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt index 43ffa8c6159..8064122d00b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.psi2ir.transformations import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrClass @@ -31,6 +32,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.originalKotlinType import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.ir.util.coerceToUnitIfNeeded +import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.psi2ir.containsNull import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext @@ -44,7 +46,13 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable fun insertImplicitCasts(element: IrElement, context: GeneratorContext) { element.transformChildren( - InsertImplicitCasts(context.builtIns, context.irBuiltIns, context.typeTranslator, context.extensions.samConversion), + InsertImplicitCasts( + context.builtIns, + context.irBuiltIns, + context.typeTranslator, + context.callToSubstitutedDescriptorMap, + context.extensions.samConversion + ), null ) } @@ -53,30 +61,38 @@ open class InsertImplicitCasts( private val builtIns: KotlinBuiltIns, private val irBuiltIns: IrBuiltIns, private val typeTranslator: TypeTranslator, + private val callToSubstitutedDescriptorMap: Map, private val samConversion: GeneratorExtensions.SamConversion ) : IrElementTransformerVoid() { private fun KotlinType.toIrType() = typeTranslator.translateType(this) - override fun visitCallableReference(expression: IrCallableReference): IrExpression = - expression.transformPostfix { - transformReceiverArguments() - } + private val IrMemberAccessExpression.substitutedDescriptor + get() = callToSubstitutedDescriptorMap[this] ?: symbol.descriptor as CallableDescriptor - private fun IrMemberAccessExpression.transformReceiverArguments() { - dispatchReceiver = dispatchReceiver?.cast(descriptor.dispatchReceiverParameter?.type) - extensionReceiver = extensionReceiver?.cast(descriptor.extensionReceiverParameter?.type) + override fun visitCallableReference(expression: IrCallableReference): IrExpression { + val substitutedDescriptor = expression.substitutedDescriptor + return expression.transformPostfix { + transformReceiverArguments(substitutedDescriptor) + } } - override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression = - expression.transformPostfix { - transformReceiverArguments() - for (index in descriptor.valueParameters.indices) { + private fun IrMemberAccessExpression.transformReceiverArguments(substitutedDescriptor: CallableDescriptor) { + dispatchReceiver = dispatchReceiver?.cast(substitutedDescriptor.dispatchReceiverParameter?.type) + extensionReceiver = extensionReceiver?.cast(substitutedDescriptor.extensionReceiverParameter?.type) + } + + override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression { + val substitutedDescriptor = expression.substitutedDescriptor + return expression.transformPostfix { + transformReceiverArguments(substitutedDescriptor) + for (index in substitutedDescriptor.valueParameters.indices) { val argument = getValueArgument(index) ?: continue - val parameterType = descriptor.valueParameters[index].type + val parameterType = substitutedDescriptor.valueParameters[index].type putValueArgument(index, argument.cast(parameterType)) } } + } override fun visitBlockBody(body: IrBlockBody): IrBody = body.transformPostfix {