From dc71ab5bb370d6344c26ca3084ddc8eed9350a55 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 15 Jan 2020 18:15:20 +0900 Subject: [PATCH] EA-211010: Fix receiver parameter name for lambdas passed as value arguments --- .../jetbrains/kotlin/codegen/codegenUtil.kt | 14 ++++++++-- ...KotlinEvaluateExpressionTestGenerated.java | 5 ++++ .../frame/lambdaAsValueArgument.kt | 28 +++++++++++++++++++ .../frame/lambdaAsValueArgument.out | 28 +++++++++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.kt create mode 100644 idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.out diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt index 8e6c6864de1..06356031dd0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt @@ -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() } diff --git a/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java b/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java index 035c7930c23..edf78427184 100644 --- a/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/jvm-debugger/jvm-debugger-test/test/org/jetbrains/kotlin/idea/debugger/test/KotlinEvaluateExpressionTestGenerated.java @@ -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"); diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.kt b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.kt new file mode 100644 index 00000000000..59a6987f982 --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.kt @@ -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 \ No newline at end of file diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.out b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.out new file mode 100644 index 00000000000..009f1b04456 --- /dev/null +++ b/idea/jvm-debugger/jvm-debugger-test/testData/evaluation/singleBreakpoint/frame/lambdaAsValueArgument.out @@ -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