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
@@ -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() {}