From e12af0e2d160d5865bab21a5d50a9ea532c597fd Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 28 Nov 2018 16:10:21 +0900 Subject: [PATCH] Fix evaluation for captured inline classes (KT-28487) --- .../debugger/evaluate/KotlinEvaluationBuilder.kt | 3 ++- .../singleBreakpoint/inlineMethodsInSignature.kt | 12 ++++++++++++ .../singleBreakpoint/inlineMethodsInSignature.out | 9 +++++++++ .../KotlinEvaluateExpressionTestGenerated.java | 5 +++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.kt create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.out diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt index e4aa6b60228..b9e38818229 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -324,7 +324,8 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour ClassReader(mainClassBytecode).accept(object : ClassVisitor(ASM5) { override fun visitMethod(access: Int, name: String, desc: String, signature: String?, exceptions: Array?): MethodVisitor? { - if (name == GENERATED_FUNCTION_NAME) { + // Maybe just take the single method from the class, as it is done in 'evaluateWithCompilation' + if (name == GENERATED_FUNCTION_NAME || name.startsWith(GENERATED_FUNCTION_NAME + "-")) { val argumentTypes = Type.getArgumentTypes(desc) val args = context.getArgumentsForEval4j(compiledData.parameters, argumentTypes) diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.kt new file mode 100644 index 00000000000..02c7d2f9d4b --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.kt @@ -0,0 +1,12 @@ +package inlineMethodsInSignature + +inline class InlineMe(val x: Int) + +fun main() { + val i = InlineMe(1) + //Breakpoint! + println() +} + +// EXPRESSION: i +// RESULT: 1: I \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.out b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.out new file mode 100644 index 00000000000..c80547703de --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.out @@ -0,0 +1,9 @@ +LineBreakpoint created at inlineMethodsInSignature.kt:8 +Run Java +Connected to the target VM +inlineMethodsInSignature.kt:8 +Compile bytecode for i +Disconnected from the target VM + +Process finished with exit code 0 + diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java index d39ea12965a..c9c283c21a5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -186,6 +186,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineFunctionBreakpointVariants.kt"); } + @TestMetadata("inlineMethodsInSignature.kt") + public void testInlineMethodsInSignature() throws Exception { + runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/inlineMethodsInSignature.kt"); + } + @TestMetadata("innerClass.kt") public void testInnerClass() throws Exception { runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/innerClass.kt");