From 01d4ec4187097b04f3f441205f312d5b73e2ce59 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Thu, 24 Nov 2016 02:34:24 +0300 Subject: [PATCH] Debugger: ability to set breakpoint to lambda in return statement (KT-14615) #KT-14615 Fixed --- .../debugger/breakpoints/breakpointTypeUtils.kt | 7 ++++--- .../positionManager/functionLiteralInVal.kt | 2 +- .../debugger/tinyApp/outs/lambdaOnReturn.out | 8 ++++++++ .../singleBreakpoint/lambdas/lambdaOnReturn.kt | 15 +++++++++++++++ .../KotlinEvaluateExpressionTestGenerated.java | 6 ++++++ 5 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 idea/testData/debugger/tinyApp/outs/lambdaOnReturn.out create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/lambdas/lambdaOnReturn.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt index fcc3f137002..0706e5287a7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt @@ -142,13 +142,14 @@ fun getLambdasAtLineIfAny(file: KtFile, line: Int): List { val start = topMostElement.startOffset val end = topMostElement.endOffset - val allInlineFunctionCalls = CodeInsightUtils. + val allLiterals = CodeInsightUtils. findElementsOfClassInRange(file, start, end, KtFunction::class.java) - .filter { KtPsiUtil.getParentCallIfPresent(it as KtExpression) != null } .filterIsInstance() + // filter function literals and functional expressions + .filter { it is KtFunctionLiteral || it.name == null } .toSet() - return allInlineFunctionCalls.filter { + return allLiterals.filter { val statement = (it.bodyExpression as? KtBlockExpression)?.statements?.firstOrNull() ?: it statement.getLineNumber() == line && statement.getLineNumber(false) == line } diff --git a/idea/testData/debugger/positionManager/functionLiteralInVal.kt b/idea/testData/debugger/positionManager/functionLiteralInVal.kt index 28a5a528d52..ed341deace4 100644 --- a/idea/testData/debugger/positionManager/functionLiteralInVal.kt +++ b/idea/testData/debugger/positionManager/functionLiteralInVal.kt @@ -2,7 +2,7 @@ class A { fun foo() { val a = { fun innerFoo() { - val b = {} // A\$foo\$a\$1\$1 + val b = 1 // A\$foo\$a\$1\$1 } innerFoo() }() diff --git a/idea/testData/debugger/tinyApp/outs/lambdaOnReturn.out b/idea/testData/debugger/tinyApp/outs/lambdaOnReturn.out new file mode 100644 index 00000000000..36ba40a6ea9 --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/lambdaOnReturn.out @@ -0,0 +1,8 @@ +LineBreakpoint created at lambdaOnReturn.kt:14 lambdaOrdinal = 1 +!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! lambdaOnReturn.LambdaOnReturnKt +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +lambdaOnReturn.kt:14 +Compile bytecode for y +Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/lambdas/lambdaOnReturn.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/lambdas/lambdaOnReturn.kt new file mode 100644 index 00000000000..9984c0463cf --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/lambdas/lambdaOnReturn.kt @@ -0,0 +1,15 @@ +package lambdaOnReturn + +// KT-14615 + +fun main(args: Array) { + val f1 = MyClass() + f1(1) +} + +fun MyClass(): (Int) -> String { + // EXPRESSION: y + // RESULT: 1: I + //Breakpoint! (lambdaOrdinal = 1) + return { y: Int -> y.toString() } +} 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 a01e7a75b17..a42e04ab5d9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -814,6 +814,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat doSingleBreakpointTest(fileName); } + @TestMetadata("lambdaOnReturn.kt") + public void testLambdaOnReturn() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/lambdas/lambdaOnReturn.kt"); + doSingleBreakpointTest(fileName); + } + @TestMetadata("lambdaOnSecondLine.kt") public void testLambdaOnSecondLine() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/lambdas/lambdaOnSecondLine.kt");