Support multiple breakpoints at one line (especially for lambdas)

This commit is contained in:
Natalia Ukhorskaya
2015-10-27 10:40:07 +03:00
parent c071bf5c63
commit e534636f03
20 changed files with 452 additions and 83 deletions
@@ -1,4 +1,4 @@
LineBreakpoint created at ceAnonymousObjectCapturedInClosure.kt:7
LineBreakpoint created at ceAnonymousObjectCapturedInClosure.kt:7 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! ceAnonymousObjectCapturedInClosure.CeAnonymousObjectCapturedInClosureKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
ceAnonymousObjectCapturedInClosure.kt:7
@@ -0,0 +1,38 @@
LineBreakpoint created at multipleBreakpointsAtLine.kt:9 lambdaOrdinal = -1
LineBreakpoint created at multipleBreakpointsAtLine.kt:14 lambdaOrdinal = 0
LineBreakpoint created at multipleBreakpointsAtLine.kt:19 lambdaOrdinal = 1
LineBreakpoint created at multipleBreakpointsAtLine.kt:30
LineBreakpoint created at multipleBreakpointsAtLine.kt:38 lambdaOrdinal = -1
LineBreakpoint created at multipleBreakpointsAtLine.kt:43 lambdaOrdinal = 0
LineBreakpoint created at multipleBreakpointsAtLine.kt:48 lambdaOrdinal = 1
LineBreakpoint created at multipleBreakpointsAtLine.kt:62
LineBreakpoint created at multipleBreakpointsAtLine.kt:67 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! multipleBreakpointsAtLine.MultipleBreakpointsAtLineKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
multipleBreakpointsAtLine.kt:9
multipleBreakpointsAtLine.kt:14
Compile bytecode for it + 2
multipleBreakpointsAtLine.kt:19
Compile bytecode for it + 3
multipleBreakpointsAtLine.kt:30
multipleBreakpointsAtLine.kt:30
Compile bytecode for it + 5
multipleBreakpointsAtLine.kt:30
Compile bytecode for it + 6
multipleBreakpointsAtLine.kt:38
multipleBreakpointsAtLine.kt:38
multipleBreakpointsAtLine.kt:43
Compile bytecode for it + 9
multipleBreakpointsAtLine.kt:48
Compile bytecode for it + 10
multipleBreakpointsAtLine.kt:62
multipleBreakpointsAtLine.kt:62
Compile bytecode for it + 12
multipleBreakpointsAtLine.kt:62
multipleBreakpointsAtLine.kt:62
Compile bytecode for it + 14
multipleBreakpointsAtLine.kt:67
Compile bytecode for it + 15
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
+1 -1
View File
@@ -1,4 +1,4 @@
LineBreakpoint created at severalFunLiterals.kt:6
LineBreakpoint created at severalFunLiterals.kt:6 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! severalFunLiterals.SeveralFunLiteralsKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
severalFunLiterals.kt:6
@@ -1,4 +1,4 @@
LineBreakpoint created at severalFunLiteralsInClass.kt:20
LineBreakpoint created at severalFunLiteralsInClass.kt:20 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! severalFunLiteralsInClass.SeveralFunLiteralsInClassKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
severalFunLiteralsInClass.kt:20
@@ -2,12 +2,14 @@ LineBreakpoint created at smartStepIntoInlinedFunLiteral.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 !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! smartStepIntoInlinedFunLiteral.SmartStepIntoInlinedFunLiteralKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
smartStepIntoInlinedFunLiteral.kt:6
smartStepIntoInlinedFunLiteral.kt:9
smartStepIntoInlinedFunLiteral.kt:10
smartStepIntoInlinedFunLiteral.kt:13
smartStepIntoInlinedFunLiteral.kt:14
smartStepIntoInlinedFunLiteral.kt:11
smartStepIntoInlinedFunLiteral.kt:12
smartStepIntoInlinedFunLiteral.kt:17
smartStepIntoInlinedFunLiteral.kt:18
smartStepIntoInlinedFunLiteral.kt:20
smartStepIntoInlinedFunLiteral.kt:24
smartStepIntoInlinedFunLiteral.kt:26
smartStepIntoInlinedFunLiteral.kt:32
smartStepIntoInlinedFunLiteral.kt:32
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -2,12 +2,14 @@ LineBreakpoint created at smartStepIntoInlinedFunctionalExpression.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 !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! smartStepIntoInlinedFunctionalExpression.SmartStepIntoInlinedFunctionalExpressionKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
smartStepIntoInlinedFunctionalExpression.kt:6
smartStepIntoInlinedFunctionalExpression.kt:9
smartStepIntoInlinedFunctionalExpression.kt:10
smartStepIntoInlinedFunctionalExpression.kt:13
smartStepIntoInlinedFunctionalExpression.kt:14
smartStepIntoInlinedFunctionalExpression.kt:11
smartStepIntoInlinedFunctionalExpression.kt:12
smartStepIntoInlinedFunctionalExpression.kt:17
smartStepIntoInlinedFunctionalExpression.kt:18
smartStepIntoInlinedFunctionalExpression.kt:20
smartStepIntoInlinedFunctionalExpression.kt:24
smartStepIntoInlinedFunctionalExpression.kt:26
smartStepIntoInlinedFunctionalExpression.kt:31
smartStepIntoInlinedFunctionalExpression.kt:31
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -1,4 +1,4 @@
LineBreakpoint created at twoLambdasOnOneLineFirst.kt:9
LineBreakpoint created at twoLambdasOnOneLineFirst.kt:9 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! twoLambdasOnOneLineFirst.TwoLambdasOnOneLineFirstKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
twoLambdasOnOneLineFirst.kt:9
@@ -0,0 +1,82 @@
package multipleBreakpointsAtLine
fun main(args: Array<String>) {
val a = A()
// EXPRESSION: it + 1
// RESULT: Unresolved reference: it
//Breakpoint! (-1)
a.foo(1) { 1 }.foo(2) { 1 }
// EXPRESSION: it + 2
// RESULT: 3: I
//Breakpoint! (0)
a.foo(1) { 1 }.foo(2) { 1 }
// EXPRESSION: it + 3
// RESULT: 5: I
//Breakpoint! (1)
a.foo(1) { 1 }.foo(2) { 1 }
// EXPRESSION: it + 4
// RESULT: Unresolved reference: it
// EXPRESSION: it + 5
// RESULT: 6: I
// EXPRESSION: it + 6
// RESULT: 8: I
//Breakpoint!
a.foo(1) { 1 }.foo(2) { 1 }
// EXPRESSION: it + 7
// RESULT: Unresolved reference: it
// EXPRESSION: it + 8
// RESULT: Unresolved reference: it
//Breakpoint! (-1)
a.bar(1) { 1 }.bar(2) { 1 }
// EXPRESSION: it + 9
// RESULT: 10: I
//Breakpoint! (0)
a.bar(1) { 1 }.bar(2) { 1 }
// EXPRESSION: it + 10
// RESULT: 12: I
//Breakpoint! (1)
a.bar(1) { 1 }.bar(2) { 1 }
// EXPRESSION: it + 11
// RESULT: Unresolved reference: it
// EXPRESSION: it + 12
// RESULT: 13: I
// EXPRESSION: it + 13
// RESULT: Unresolved reference: it
// EXPRESSION: it + 14
// RESULT: 16: I
//Breakpoint!
a.bar(1) { 1 }.bar(2) { 1 }
// EXPRESSION: it + 15
// RESULT: 17: I
//Breakpoint! (1)
a.bar(1) { 1 }.bar(2) { 1 + 1
1 + 1
}
}
class A {
fun foo(i: Int, f: (i: Int) -> Int): A {
f(i)
return this
}
inline fun bar(i: Int, f: (i: Int) -> Int): A {
f(i)
return this
}
}
@@ -3,7 +3,7 @@ package ceAnonymousObjectCapturedInClosure
fun main(args: Array<String>) {
val localObject = object { fun test() = 1 }
var localObjectVar = object { fun test() = 1 }
//Breakpoint!
//Breakpoint! (-1)
lambda { localObjectVar.test() }
}
@@ -5,7 +5,7 @@ fun main(args: Array<String>) {
// EXPRESSION: it
// RESULT: 1: I
// STEP_INTO: 2
//Breakpoint!
//Breakpoint! (-1)
a.foo { a }.foo { a }
}
@@ -2,7 +2,7 @@ package severalFunLiterals
fun main(args: Array<String>) {
val myClass = MyClass()
//Breakpoint!
//Breakpoint! (-1)
myClass.f1 { test() }.f2 {
test()
}
@@ -22,4 +22,4 @@ class MyClass {
fun test() {}
// SMART_STEP_INTO_BY_INDEX: 4
// SMART_STEP_INTO_BY_INDEX: 4
@@ -16,7 +16,7 @@ class MyClass {
}
fun inClass() {
//Breakpoint!
//Breakpoint! (-1)
f1 { test() }.f2 {
test()
}
@@ -25,4 +25,4 @@ class MyClass {
fun test() {}
// SMART_STEP_INTO_BY_INDEX: 4
// SMART_STEP_INTO_BY_INDEX: 4
@@ -5,20 +5,31 @@ fun main(args: Array<String>) {
//Breakpoint!
val myClass = MyClass()
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// smart step into f2.invoke(), one-line lambda
myClass.f1 { test() }
.f2 { test() }
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 2
// smart step into map.invoke(), multiline lambda
array.map {
it *2
}
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// smart step into filter.invoke()
array.map { it * 2 }
.filter {
it > 2
}
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// smart step into f2.invoke(), one-line lambda
myClass.f1 { test() }.f2 { test() }
}
class MyClass {
@@ -35,11 +46,4 @@ class MyClass {
}
}
fun test() {}
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 2
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
fun test() {}
@@ -5,20 +5,32 @@ fun main(args: Array<String>) {
//Breakpoint!
val myClass = MyClass()
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// smart step into f2.invoke(), one-line lambda
myClass.f1(fun () { test() })
.f2(fun () { test() })
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 2
// smart step into map.invoke(), multiline lambda
array.map(fun (it): Int {
return it * 2
})
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// smart step into filter.invoke()
array.map(fun (it): Int { return it * 2 })
.filter(fun (it): Boolean {
return it > 2
})
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 2
myClass.f3(fun () = myClass.f3 {
println()
})
}
class MyClass {
@@ -33,13 +45,11 @@ class MyClass {
f1Param()
return this
}
inline fun f3(f1Param: () -> Unit): Unit {
test()
f1Param()
}
}
fun test() {}
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 2
// STEP_OVER: 1
// SMART_STEP_INTO_BY_INDEX: 4
fun test() {}