From 9120ccc0543f8f948fba364085c0e78907b5f0e5 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 6 Mar 2017 21:25:06 +0300 Subject: [PATCH] Fix breakpoints in inline calls in fields initialization (KT-16525) Backend generates properties initializer in constructor context #KT-16525 Fixed --- .../debugger/DebuggerClassNameProvider.kt | 5 ++++ .../tinyApp/outs/stopInInlineCallInField.out | 8 +++++++ ...allInFieldInClassWithNonDefaultPrimary.out | 8 +++++++ .../stopInInlineCallInFieldInLocalClass.out | 8 +++++++ .../stepOver/stopInInlineCallInField.kt | 20 ++++++++++++++++ ...CallInFieldInClassWithNonDefaultPrimary.kt | 23 +++++++++++++++++++ .../stopInInlineCallInFieldInLocalClass.kt | 20 ++++++++++++++++ .../debugger/KotlinSteppingTestGenerated.java | 18 +++++++++++++++ 8 files changed, 110 insertions(+) create mode 100644 idea/testData/debugger/tinyApp/outs/stopInInlineCallInField.out create mode 100644 idea/testData/debugger/tinyApp/outs/stopInInlineCallInFieldInClassWithNonDefaultPrimary.out create mode 100644 idea/testData/debugger/tinyApp/outs/stopInInlineCallInFieldInLocalClass.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInField.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInLocalClass.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt index ea369de95f9..511d4b78f22 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.inline.InlineUtil import org.jetbrains.kotlin.resolve.scopes.LexicalScope +import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull @@ -235,6 +236,10 @@ class DebuggerClassNameProvider(val myDebugProcess: DebugProcess, val scopes: Li (ownerDescriptor is CallableDescriptor && ownerDeclaration is KtElement && CoroutineCodegen.shouldCreateByLambda(ownerDescriptor, ownerDeclaration))) { Name.identifier(DO_RESUME_METHOD_NAME) } + else if (ownerDescriptor is PropertyDescriptor && lexicalScope.kind == LexicalScopeKind.PROPERTY_INITIALIZER_OR_DELEGATE && + ownerDescriptor.containingDeclaration is ClassDescriptor) { + (ownerDescriptor.containingDeclaration as ClassDescriptor).constructors.first().name + } else { ownerDescriptor.name } diff --git a/idea/testData/debugger/tinyApp/outs/stopInInlineCallInField.out b/idea/testData/debugger/tinyApp/outs/stopInInlineCallInField.out new file mode 100644 index 00000000000..f4a310ae011 --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/stopInInlineCallInField.out @@ -0,0 +1,8 @@ +LineBreakpoint created at stopInInlineCallInField.kt:9 +!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! stopInInlineCallInField.StopInInlineCallInFieldKt +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +stopInInlineCallInField.kt:9 +stopInInlineCallInField.kt:10 +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/outs/stopInInlineCallInFieldInClassWithNonDefaultPrimary.out b/idea/testData/debugger/tinyApp/outs/stopInInlineCallInFieldInClassWithNonDefaultPrimary.out new file mode 100644 index 00000000000..cb380216249 --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/stopInInlineCallInFieldInClassWithNonDefaultPrimary.out @@ -0,0 +1,8 @@ +LineBreakpoint created at stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt:9 +!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! stopInInlineCallInFieldInClassWithNonDefaultPrimary.StopInInlineCallInFieldInClassWithNonDefaultPrimaryKt +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt:9 +stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt:10 +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/outs/stopInInlineCallInFieldInLocalClass.out b/idea/testData/debugger/tinyApp/outs/stopInInlineCallInFieldInLocalClass.out new file mode 100644 index 00000000000..f2abd8f5f81 --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/stopInInlineCallInFieldInLocalClass.out @@ -0,0 +1,8 @@ +LineBreakpoint created at stopInInlineCallInFieldInLocalClass.kt:12 +!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! stopInInlineCallInFieldInLocalClass.StopInInlineCallInFieldInLocalClassKt +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +stopInInlineCallInFieldInLocalClass.kt:12 +stopInInlineCallInFieldInLocalClass.kt:13 +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/stepOver/stopInInlineCallInField.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInField.kt new file mode 100644 index 00000000000..aaa5e34b446 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInField.kt @@ -0,0 +1,20 @@ +package stopInInlineCallInField + +class A { + var value = 42 + + var b: String = "".inlineApply { + { + //Breakpoint! + foo(value) + }() + } +} + +fun foo(a: Any) {} + +fun main(args: Array) { + A() +} + +inline fun T.inlineApply(block: T.() -> kotlin.Unit): T { this.block(); return this } \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt new file mode 100644 index 00000000000..ed74fd9bb26 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt @@ -0,0 +1,23 @@ +package stopInInlineCallInFieldInClassWithNonDefaultPrimary + +class A { + var value = 42 + + var b: String = "".inlineApply { + { + //Breakpoint! + foo(value) + }() + } + + constructor(): this("") + constructor(a: String) {} +} + +fun foo(a: Any) {} + +fun main(args: Array) { + A() +} + +inline fun T.inlineApply(block: T.() -> kotlin.Unit): T { this.block(); return this } \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInLocalClass.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInLocalClass.kt new file mode 100644 index 00000000000..d0a82a7415a --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInLocalClass.kt @@ -0,0 +1,20 @@ +package stopInInlineCallInFieldInLocalClass + +fun foo(a: Any) {} + +fun main(args: Array) { + class A { + var value = 42 + + var b: String = "".inlineApply { + { + //Breakpoint! + foo(value) + }() + } + } + + A() +} + +inline fun T.inlineApply(block: T.() -> kotlin.Unit): T { this.block(); return this } \ 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 44afe8f767a..da906f10472 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java @@ -728,6 +728,24 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest { doStepOverTest(fileName); } + @TestMetadata("stopInInlineCallInField.kt") + public void testStopInInlineCallInField() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInField.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt") + public void testStopInInlineCallInFieldInClassWithNonDefaultPrimary() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInClassWithNonDefaultPrimary.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("stopInInlineCallInFieldInLocalClass.kt") + public void testStopInInlineCallInFieldInLocalClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallInFieldInLocalClass.kt"); + doStepOverTest(fileName); + } + @TestMetadata("stopInInlineCallLocalFunLambda.kt") public void testStopInInlineCallLocalFunLambda() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/stopInInlineCallLocalFunLambda.kt");