From be3eed5f1ff9fe2b636ec6daa084cd0457357776 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Fri, 15 Nov 2019 14:43:00 +0100 Subject: [PATCH] Access to receiver thought reference class --- .../jvm/lower/CallableReferenceLowering.kt | 18 +++++++++++++----- .../jvm/lower/PropertyReferenceLowering.kt | 15 +++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt index 966551e767d..2acdfa9b843 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt @@ -22,10 +22,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.builders.declarations.addConstructor -import org.jetbrains.kotlin.ir.builders.declarations.addFunction -import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter -import org.jetbrains.kotlin.ir.builders.declarations.buildClass +import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl @@ -147,6 +144,17 @@ internal class CallableReferenceLowering(private val context: JvmBackendContext) copyAttributes(irFunctionReference) } + private val receiverFieldFromSuper = context.ir.symbols.functionReferenceReceiverField.owner + + val fakeOverrideReceiverField = functionReferenceClass.addField { + name = receiverFieldFromSuper.name + origin = IrDeclarationOrigin.FAKE_OVERRIDE + type = receiverFieldFromSuper.type + isFinal = receiverFieldFromSuper.isFinal + isStatic = receiverFieldFromSuper.isStatic + visibility = receiverFieldFromSuper.visibility + } + fun build(): IrExpression = context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run { irBlock { val constructor = createConstructor() @@ -282,7 +290,7 @@ internal class CallableReferenceLowering(private val context: JvmBackendContext) // will put it into a field. if (samSuperType == null) irImplicitCast( - irGetField(irGet(dispatchReceiverParameter!!), irSymbols.functionReferenceReceiverField.owner), + irGetField(irGet(dispatchReceiverParameter!!), fakeOverrideReceiverField), boundReceiver.second.type ) else diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt index 5261b31de01..be80aa6a1e2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt @@ -20,9 +20,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.builders.declarations.addFunction -import org.jetbrains.kotlin.ir.builders.declarations.buildClass -import org.jetbrains.kotlin.ir.builders.declarations.buildField +import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.* @@ -255,7 +253,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class // See propertyReferenceKindFor -- only one of them could ever be present. val numOfSuperArgs = if (expression.dispatchReceiver != null || expression.extensionReceiver != null) 1 else 0 val superConstructor = superClass.constructors.single { it.valueParameters.size == numOfSuperArgs } - val receiverField = superClass.properties.single { it.name.asString() == "receiver" }.backingField!! + val backingFieldFromSuper = superClass.properties.single { it.name.asString() == "receiver" }.backingField!! val getName = superClass.functions.single { it.name.asString() == "getName" } val getOwner = superClass.functions.single { it.name.asString() == "getOwner" } val getSignature = superClass.functions.single { it.name.asString() == "getSignature" } @@ -268,6 +266,15 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class referenceClass.addOverride(getOwner) { buildReflectedContainerReference(expression) } referenceClass.addOverride(getSignature) { irString(expression.signature) } + val receiverField = referenceClass.addField { + name = backingFieldFromSuper.name + origin = IrDeclarationOrigin.FAKE_OVERRIDE + type = backingFieldFromSuper.type + isFinal = backingFieldFromSuper.isFinal + isStatic = backingFieldFromSuper.isStatic + visibility = backingFieldFromSuper.visibility + } + val field = expression.field?.owner if (field == null) { fun IrBuilderWithScope.setCallArguments(call: IrCall, arguments: List) {