From a9ee10a8b7eeb5ccceedabd5df908c266b858092 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 1 Aug 2016 17:48:00 +0300 Subject: [PATCH] Ignore intervals that has no mapping for origin line (KT-12896) --- .../jetbrains/kotlin/codegen/inline/SMAP.kt | 4 ++ .../debugger/NoStrataPositionManagerHelper.kt | 10 ++- .../dexSeveralInlineFunctionsInOneFile.out | 23 ++++++ .../dexSeveralInlineFunctionsInOneFile.kt | 71 +++++++++++++++++++ .../debugger/KotlinSteppingTestGenerated.java | 6 ++ 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 idea/testData/debugger/tinyApp/outs/dexSeveralInlineFunctionsInOneFile.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/custom/dexSeveralInlineFunctionsInOneFile.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt index 2b34b76619a..dc7fb5dda40 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt @@ -352,6 +352,10 @@ data class RangeMapping(val source: Int, val dest: Int, var range: Int = 1, var return skip || (dest <= destLine && destLine < dest + range) } + fun hasMappingForSource(sourceLine: Int): Boolean { + return skip || (source <= sourceLine && sourceLine < source + range) + } + fun mapDestToSource(destLine: Int): Int { return if (skip) -1 else source + (destLine - dest) } diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt index 6abdbeadb22..3a95fe476db 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt @@ -82,7 +82,15 @@ private fun inlinedLinesNumbers( val smap = smapData.kotlinStrata ?: return listOf() val mappingsToInlinedFile = smap.fileMappings.filter() { it.name == inlineFileName } - return mappingsToInlinedFile.flatMap { it.lineMappings.map { it.mapSourceToDest(inlineLineNumber) } } + val mappingIntervals = mappingsToInlinedFile.flatMap { it.lineMappings } + + val mappedLines = mappingIntervals.asSequence(). + filter { rangeMapping -> rangeMapping.hasMappingForSource(inlineLineNumber) }. + map { rangeMapping -> rangeMapping.mapSourceToDest(inlineLineNumber) }. + filter { line -> line != -1 }. + toList() + + return mappedLines } @Volatile var emulateDexDebugInTests: Boolean = false diff --git a/idea/testData/debugger/tinyApp/outs/dexSeveralInlineFunctionsInOneFile.out b/idea/testData/debugger/tinyApp/outs/dexSeveralInlineFunctionsInOneFile.out new file mode 100644 index 00000000000..06d247b7dac --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/dexSeveralInlineFunctionsInOneFile.out @@ -0,0 +1,23 @@ +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:5 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:23 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:29 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:34 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:41 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:46 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:53 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:60 +LineBreakpoint created at dexSeveralInlineFunctionsInOneFile.kt:66 +!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! dexSeveralInlineFunctionsInOneFile.DexSeveralInlineFunctionsInOneFileKt +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +dexSeveralInlineFunctionsInOneFile.kt:5 +dexSeveralInlineFunctionsInOneFile.kt:23 +dexSeveralInlineFunctionsInOneFile.kt:29 +dexSeveralInlineFunctionsInOneFile.kt:41 +dexSeveralInlineFunctionsInOneFile.kt:66 +dexSeveralInlineFunctionsInOneFile.kt:34 +dexSeveralInlineFunctionsInOneFile.kt:46 +dexSeveralInlineFunctionsInOneFile.kt:53 +dexSeveralInlineFunctionsInOneFile.kt:60 +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/stepping/custom/dexSeveralInlineFunctionsInOneFile.kt b/idea/testData/debugger/tinyApp/src/stepping/custom/dexSeveralInlineFunctionsInOneFile.kt new file mode 100644 index 00000000000..ee0008ea734 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/custom/dexSeveralInlineFunctionsInOneFile.kt @@ -0,0 +1,71 @@ +package dexSeveralInlineFunctionsInOneFile + +fun main(args: Array) { + //Breakpoint! + inlineCalls() // line 5 +} + +fun inlineCalls() { + one() // line 23 + ObjectOne.one() // line 29 + ClassOne().one() // line 41 + + two() // line 66 + ObjectOne.two() // line 34 + ClassOne().two() // line 46 + + ObjectTwo.one() // line 53 + ClassTwo().one() // line 60 +} + +inline fun one() { + //Breakpoint! + some() +} + +object ObjectOne { + inline fun one() { + //Breakpoint! + some() + } + + inline fun two() { + //Breakpoint! + some() + } +} + +class ClassOne { + inline fun one() { + //Breakpoint! + some() + } + + inline fun two() { + //Breakpoint! + some() + } +} + +object ObjectTwo { + inline fun one() { + //Breakpoint! + some() + } +} + +class ClassTwo { + inline fun one() { + //Breakpoint! + some() + } +} + +inline fun two() { + //Breakpoint! + some() +} + +inline fun some() = 1 + +// RESUME: 9 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java index 630c2de0437..06f4f8b613c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java @@ -613,6 +613,12 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest { doCustomTest(fileName); } + @TestMetadata("dexSeveralInlineFunctionsInOneFile.kt") + public void testDexSeveralInlineFunctionsInOneFile() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/custom/dexSeveralInlineFunctionsInOneFile.kt"); + doCustomTest(fileName); + } + @TestMetadata("funLiteral.kt") public void testFunLiteral() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/custom/funLiteral.kt");