Support captured parameters in callable references
This commit is contained in:
+13
-8
@@ -282,7 +282,7 @@ class CallableReferenceLowering(val context: JvmBackendContext) : FileLoweringPa
|
|||||||
|
|
||||||
override fun buildIr(): IrConstructor {
|
override fun buildIr(): IrConstructor {
|
||||||
argumentToPropertiesMap = boundFunctionParameters.associate {
|
argumentToPropertiesMap = boundFunctionParameters.associate {
|
||||||
it to buildPropertyWithBackingField(it.name.safeName(), it.type, false)
|
it to buildPropertyWithBackingField(it.name.safeName(), it.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
val startOffset = irFunctionReference.startOffset
|
val startOffset = irFunctionReference.startOffset
|
||||||
@@ -310,15 +310,20 @@ class CallableReferenceLowering(val context: JvmBackendContext) : FileLoweringPa
|
|||||||
|
|
||||||
val irReceiver = valueParameters.firstOrNull()
|
val irReceiver = valueParameters.firstOrNull()
|
||||||
val receiver = boundFunctionParameters.singleOrNull()
|
val receiver = boundFunctionParameters.singleOrNull()
|
||||||
|
//TODO pass proper receiver
|
||||||
val receiverValue = receiver?.let {
|
val receiverValue = receiver?.let {
|
||||||
irGet(irReceiver!!.symbol.owner)
|
irGet(irReceiver!!.symbol.owner)
|
||||||
} ?: irNull()
|
} ?: irNull()
|
||||||
putValueArgument(1, receiverValue)
|
putValueArgument(1, receiverValue)
|
||||||
//TODO use receiver from base class
|
}
|
||||||
receiver?.let {
|
|
||||||
+irSetField(irGet(functionReferenceThis.owner), argumentToPropertiesMap[it]!!.owner, receiverValue)
|
//TODO don't write receiver again: use it from base class
|
||||||
}
|
boundFunctionParameters.forEachIndexed { index, it ->
|
||||||
|
+irSetField(
|
||||||
|
irGet(functionReferenceThis.owner),
|
||||||
|
argumentToPropertiesMap[it]!!.owner,
|
||||||
|
irGet(valueParameters[index])
|
||||||
|
)
|
||||||
}
|
}
|
||||||
+IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, context.irBuiltIns.unitType)
|
+IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, context.irBuiltIns.unitType)
|
||||||
// Save all arguments to fields.
|
// Save all arguments to fields.
|
||||||
@@ -409,10 +414,10 @@ class CallableReferenceLowering(val context: JvmBackendContext) : FileLoweringPa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildPropertyWithBackingField(name: Name, type: KotlinType, isMutable: Boolean): IrFieldSymbol {
|
private fun buildPropertyWithBackingField(name: Name, type: KotlinType): IrFieldSymbol {
|
||||||
val fieldSymbol = IrFieldSymbolImpl(
|
val fieldSymbol = IrFieldSymbolImpl(
|
||||||
JvmPropertyDescriptorImpl.createFinalField(
|
JvmPropertyDescriptorImpl.createFinalField(
|
||||||
Name.identifier("this$0"), type, functionReferenceClassDescriptor,
|
name, type, functionReferenceClassDescriptor,
|
||||||
Annotations.EMPTY, JavaVisibilities.PACKAGE_VISIBILITY, Opcodes.ACC_SYNTHETIC, SourceElement.NO_SOURCE
|
Annotations.EMPTY, JavaVisibilities.PACKAGE_VISIBILITY, Opcodes.ACC_SYNTHETIC, SourceElement.NO_SOURCE
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user