EA-211010: Fix receiver parameter name for lambdas passed as value arguments

This commit is contained in:
Yan Zhulanow
2020-01-15 18:15:20 +09:00
parent b1414fa477
commit dc71ab5bb3
4 changed files with 72 additions and 3 deletions

View File

@@ -461,10 +461,18 @@ fun getCallLabelForLambdaArgument(declaration: KtFunctionLiteral, bindingContext
lambdaExpressionParent.name?.let { return it }
}
val lambdaArgument = lambdaExpression.parent as? KtLambdaArgument ?: return null
val callExpression = lambdaArgument.parent as? KtCallExpression ?: return null
val call = callExpression.getResolvedCall(bindingContext) ?: return null
val callExpression = when (val argument = lambdaExpression.parent) {
is KtLambdaArgument -> {
argument.parent as? KtCallExpression ?: return null
}
is KtValueArgument -> {
val valueArgumentList = argument.parent as? KtValueArgumentList ?: return null
valueArgumentList.parent as? KtCallExpression ?: return null
}
else -> return null
}
val call = callExpression.getResolvedCall(bindingContext) ?: return null
return call.resultingDescriptor.name.asString()
}

View File

@@ -904,6 +904,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/inlineFunThisKotlinVariables.kt");
}
@TestMetadata("lambdaAsValueArgument.kt")
public void testLambdaAsValueArgument() throws Exception {
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.kt");
}
@TestMetadata("lambdaFun1.kt")
public void testLambdaFun1() throws Exception {
runTest("idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaFun1.kt");

View File

@@ -0,0 +1,28 @@
package lambdaAsValueArgument
fun main() {
contactMapper.toString()
}
object MyContext
data class User(val firstName: String, val lastName: String, val age: Int)
fun foo(block: User.(User) -> Unit) {
val item = User("a", "b", 10)
item.block(item)
}
val contactMapper = MyContext.run {
foo({ i ->
//Breakpoint!
this.copy(
firstName = "Foo",
lastName = "Bar",
age = 100
)
})
}
// PRINT_FRAME
// SHOW_KOTLIN_VARIABLES

View File

@@ -0,0 +1,28 @@
LineBreakpoint created at lambdaAsValueArgument.kt:19
Run Java
Connected to the target VM
lambdaAsValueArgument.kt:19
frame = invoke:19, LambdaAsValueArgumentKt$contactMapper$1$1 {lambdaAsValueArgument}
local = this: lambdaAsValueArgument.User = {lambdaAsValueArgument.User@uniqueID}User(firstName=a, lastName=b, age=10) (sp = null)
field = firstName: java.lang.String = a (sp = lambdaAsValueArgument.kt, 9)
field = value: char[] = {char[1]@uniqueID} (sp = String.!EXT!)
element = 0 = 'a' 97
field = hash: int = 0 (sp = String.!EXT!)
field = lastName: java.lang.String = b (sp = lambdaAsValueArgument.kt, 9)
field = value: char[] = {char[1]@uniqueID} (sp = String.!EXT!)
element = 0 = 'b' 98
field = hash: int = 0 (sp = String.!EXT!)
field = age: int = 10 (sp = lambdaAsValueArgument.kt, 9)
local = i: lambdaAsValueArgument.User = {lambdaAsValueArgument.User@uniqueID}User(firstName=a, lastName=b, age=10) (sp = lambdaAsValueArgument.kt, 17)
field = firstName: java.lang.String = a (sp = lambdaAsValueArgument.kt, 9)
field = value: char[] = {char[1]@uniqueID} (sp = String.!EXT!)
element = 0 = 'a' 97
field = hash: int = 0 (sp = String.!EXT!)
field = lastName: java.lang.String = b (sp = lambdaAsValueArgument.kt, 9)
field = value: char[] = {char[1]@uniqueID} (sp = String.!EXT!)
element = 0 = 'b' 98
field = hash: int = 0 (sp = String.!EXT!)
field = age: int = 10 (sp = lambdaAsValueArgument.kt, 9)
Disconnected from the target VM
Process finished with exit code 0