diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt index 06257e326a9..dda1af52a7f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt @@ -212,6 +212,10 @@ public class JetPsiFactory(private val project: Project) { return createFunction("fun foo() {}").getBodyExpression()!! } + public fun createAnonymousInitializer(): JetClassInitializer { + return createClass("class A { {} }").getAnonymousInitializers().first!! + } + public fun createEmptyClassBody(): JetClassBody { return createClass("class A(){}").getBody()!! } diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/extractFunctionForDebuggerUtil.kt b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/extractFunctionForDebuggerUtil.kt index 13a35d4b1e1..e490fa12f1a 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/extractFunctionForDebuggerUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/extractFunctionForDebuggerUtil.kt @@ -183,6 +183,12 @@ private fun addDebugExpressionBeforeContextElement(codeFragment: JetCodeFragment contextElement is JetProperty && !contextElement.isLocal() -> { wrapInRunFun(contextElement.getDelegateExpressionOrInitializer()!!) } + contextElement is JetClass -> { + val initializer = psiFactory.createAnonymousInitializer() + val newInitializer = (contextElement.getBody().addAfter(initializer, contextElement.getBody().getFirstChild()) as JetClassInitializer) + val block = newInitializer.getBody() as JetBlockExpression + block.getLastChild() + } contextElement is JetFunctionLiteral -> { val block = contextElement.getBodyExpression()!! block.getStatements().first ?: block.getLastChild() diff --git a/idea/testData/debugger/tinyApp/outs/onClassHeader.out b/idea/testData/debugger/tinyApp/outs/onClassHeader.out new file mode 100644 index 00000000000..391eeecbb42 --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/onClassHeader.out @@ -0,0 +1,12 @@ +LineBreakpoint created at onClassHeader.kt:6 +!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !APP_PATH!\classes;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! onClassHeader.OnClassHeaderPackage +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +onClassHeader.kt:6 +onClassHeader.kt:18 +onClassHeader.kt:16 +Compile bytecode for 1 + 1 +Compile bytecode for this +Compile bytecode for this.foo("a") +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/onClassHeader.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/onClassHeader.kt new file mode 100644 index 00000000000..7a1a7adfa0b --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/onClassHeader.kt @@ -0,0 +1,31 @@ +package onClassHeader + +fun main(args: Array) { + val d: Base = Derived() + //Breakpoint! + d.foo("") + val a = 1 +} + +open class Base { + open fun foo(t: T): Int { + return 1 + } +} + +class Derived: Base() { + override fun foo(t: String): Int { + return 2 + } +} + +// STEP_INTO: 2 + +// EXPRESSION: 1 + 1 +// RESULT: 2: I + +// EXPRESSION: this +// RESULT: instance of onClassHeader.Derived(id=ID): LonClassHeader/Derived; + +// EXPRESSION: this.foo("a") +// RESULT: 2: I \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java index 152fe4f838e..246af4c4d77 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -154,6 +154,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat doSingleBreakpointTest(fileName); } + @TestMetadata("onClassHeader.kt") + public void testOnClassHeader() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/onClassHeader.kt"); + doSingleBreakpointTest(fileName); + } + @TestMetadata("privateMember.kt") public void testPrivateMember() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/privateMember.kt");