Fix conversion between P1.(...)->R and (P1, ...)->R when inlining
This commit is contained in:
committed by
SvyatoslavScherbina
parent
a8ab837035
commit
c222eb8f04
+16
-5
@@ -262,15 +262,26 @@ private class Inliner(val currentScope: ScopeWithIr, val context: Context) {
|
||||
argumentExpression = irCall.dispatchReceiver!!
|
||||
)
|
||||
|
||||
if (irCall.extensionReceiver != null && // Only if there are non null extension receivers both
|
||||
functionDescriptor.extensionReceiverParameter != null) // on call site and in function declaration.
|
||||
val valueArguments =
|
||||
irCall.descriptor.valueParameters.map { irCall.getValueArgument(it) }.toMutableList()
|
||||
|
||||
if (functionDescriptor.extensionReceiverParameter != null) {
|
||||
parameterToArgument += ParameterToArgument(
|
||||
parameterDescriptor = functionDescriptor.extensionReceiverParameter!!,
|
||||
argumentExpression = irCall.extensionReceiver!!
|
||||
parameterDescriptor = functionDescriptor.extensionReceiverParameter!!,
|
||||
argumentExpression = if (irCall.extensionReceiver != null) {
|
||||
irCall.extensionReceiver!!
|
||||
} else {
|
||||
// Special case: lambda with receiver is called as usual lambda:
|
||||
valueArguments.removeAt(0)!!
|
||||
}
|
||||
)
|
||||
} else if (irCall.extensionReceiver != null) {
|
||||
// Special case: usual lambda is called as lambda with receiver:
|
||||
valueArguments.add(0, irCall.extensionReceiver!!)
|
||||
}
|
||||
|
||||
functionDescriptor.valueParameters.forEach { parameterDescriptor -> // Iterate value parameter descriptors.
|
||||
val argument = irCall.getValueArgument(parameterDescriptor.index) // Get appropriate argument from call site.
|
||||
val argument = valueArguments[parameterDescriptor.index] // Get appropriate argument from call site.
|
||||
when {
|
||||
argument != null -> { // Argument is good enough.
|
||||
parameterToArgument += ParameterToArgument( // Associate current parameter with the argument.
|
||||
|
||||
@@ -1707,6 +1707,11 @@ task inline24(type: RunKonanTest) {
|
||||
source = "codegen/inline/inline24.kt"
|
||||
}
|
||||
|
||||
task inline25(type: RunKonanTest) {
|
||||
goldValue = "Ok\nOk\n"
|
||||
source = "codegen/inline/inline25.kt"
|
||||
}
|
||||
|
||||
task deserialized_inline0(type: RunKonanTest) {
|
||||
source = "serialization/deserialized_inline0.kt"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
inline fun foo(block: String.() -> Unit) {
|
||||
"Ok".block()
|
||||
}
|
||||
|
||||
inline fun bar(block: (String) -> Unit) {
|
||||
foo(block)
|
||||
}
|
||||
|
||||
inline fun baz(block: String.() -> Unit) {
|
||||
block("Ok")
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
bar {
|
||||
println(it)
|
||||
}
|
||||
|
||||
baz {
|
||||
println(this)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user