Fix conversion between P1.(...)->R and (P1, ...)->R when inlining

This commit is contained in:
Svyatoslav Scherbina
2017-05-02 17:18:15 +03:00
committed by SvyatoslavScherbina
parent a8ab837035
commit c222eb8f04
3 changed files with 42 additions and 5 deletions
@@ -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.
+5
View File
@@ -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)
}
}