[JVM] Port line number tests to stepping framework.

Allow specifying JVM and JVM_IR as well as shared expectations.

Add the method name to the step.

Discard steps in synthetic methods.
This commit is contained in:
Mads Ager
2020-05-19 16:34:59 +02:00
committed by max-kammerer
parent 4dbd4a56d5
commit 9fa1614903
59 changed files with 896 additions and 540 deletions
+6 -6
View File
@@ -1,4 +1,4 @@
//FILE: test.kt
// FILE: test.kt
fun cond() = false
fun box() {
@@ -9,8 +9,8 @@ fun box() {
}
// LINENUMBERS
// test.kt:5
// test.kt:2
// test.kt:5
// test.kt:8
// test.kt:9
// test.kt:5 box
// test.kt:2 cond
// test.kt:5 box
// test.kt:8 box
// test.kt:9 box
+13
View File
@@ -0,0 +1,13 @@
// FILE: test.kt
fun box() {
{
"OK"
}()
}
// LINENUMBERS
// test.kt:4 box
// test.kt:5 invoke
// test.kt:4 box
// test.kt:7 box
+14 -14
View File
@@ -30,17 +30,17 @@ fun box(): String {
}
// LINENUMBERS
// test.kt:24
// test.kt:15
// test.kt:16
// test.kt:3
// test.kt:16
// test.kt:17
// test.kt:21
// test.kt:25
// test.kt:6
// test.kt:3
// test.kt:6
// test.kt:7
// test.kt:12
// test.kt:29
// test.kt:24 box
// test.kt:15 box
// test.kt:16 box
// test.kt:3 getMASSERTIONS_ENABLED
// test.kt:16 box
// test.kt:17 box
// test.kt:21 box
// test.kt:25 box
// test.kt:6 box
// test.kt:3 getMASSERTIONS_ENABLED
// test.kt:6 box
// test.kt:7 box
// test.kt:12 box
// test.kt:29 box
+8 -10
View File
@@ -11,13 +11,11 @@ fun f(block: () -> Unit) {
}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:10
// test.kt:5
// test.kt:6
// test.kt:-1
// test.kt:-1
// test.kt:10
// test.kt:11
// test.kt:7
// test.kt:3 box
// test.kt:4 box
// test.kt:10 f
// test.kt:5 invoke
// test.kt:6 invoke
// test.kt:10 f
// test.kt:11 f
// test.kt:7 box
+35
View File
@@ -0,0 +1,35 @@
// FILE: test.kt
class A {
val prop = 1
fun foo() {
prop
}
}
fun box() {
val a = A()
a.prop
a.foo()
}
// TODO: The JVM_IR backend has an extra line number on the return. This causes line
// three to be hit both on entry to the constructor and on exit after storing the
// value of prop.
// LINENUMBERS
// test.kt:12 box
// test.kt:3 <init>
// test.kt:4 <init>
// LINENUMBERS JVM_IR
// test.kt:3 <init>
// LINENUMBERS
// test.kt:12 box
// test.kt:13 box
// test.kt:4 getProp
// test.kt:13 box
// test.kt:14 box
// test.kt:7 foo
// test.kt:8 foo
// test.kt:15 box
+50
View File
@@ -0,0 +1,50 @@
// FILE: test.kt
class A {
companion object {
val prop0 = 1
val prop1 = 2
fun foo(): Int {
return prop0 + prop1
}
}
}
fun box() {
A.prop0
A.prop1
A.foo()
}
// The JVM version hits get getProp line numbers twice. That appears
// to be because the synthetic accessibility bridges (access$getProp0$cp)
// have line numbers (of the start of the surrounding class) in the JVM
// version and they do not have line numbers in the JVM_IR version.
// LINENUMBERS
// test.kt:14 box
// test.kt:5 getProp0
// LINENUMBERS JVM
// test.kt:5 getProp0
// LINENUMBERS
// test.kt:14 box
// test.kt:15 box
// test.kt:6 getProp1
// LINENUMBERS JVM
// test.kt:6 getProp1
// LINENUMBERS
// test.kt:15 box
// test.kt:16 box
// test.kt:8 foo
// test.kt:5 getProp0
// LINENUMBERS JVM
// test.kt:5 getProp0
// LINENUMBERS
// test.kt:8 foo
// test.kt:6 getProp1
// LINENUMBERS JVM
// test.kt:6 getProp1
// LINENUMBERS
// test.kt:8 foo
// test.kt:16 box
// test.kt:17 box
+13 -13
View File
@@ -1,4 +1,4 @@
//FILE: test.kt
// FILE: test.kt
fun box() {
val k = if (getA()
&& getB()
@@ -19,15 +19,15 @@ fun getC() = false
fun getD() = true
// LINENUMBERS
// test.kt:3
// test.kt:13
// test.kt:3
// test.kt:4
// test.kt:15
// test.kt:4
// test.kt:5
// test.kt:17
// test.kt:5
// test.kt:9
// test.kt:3
// test.kt:11
// test.kt:3 box
// test.kt:13 getA
// test.kt:3 box
// test.kt:4 box
// test.kt:15 getB
// test.kt:4 box
// test.kt:5 box
// test.kt:17 getC
// test.kt:5 box
// test.kt:9 box
// test.kt:3 box
// test.kt:11 box
+24
View File
@@ -0,0 +1,24 @@
// FILE: test.kt
class A {
fun computeParam() = 32
fun foo(param: Int = computeParam()) {
}
}
fun box() {
A().foo()
}
// FORCE_STEP_INTO
// LINENUMBERS
// test.kt:11 box
// test.kt:3 <init>
// test.kt:11 box
// test.kt:6 foo$default (synthetic)
// test.kt:4 computeParam
// test.kt:6 foo$default (synthetic)
// test.kt:7 foo
// test.kt:6 foo$default (synthetic)
// test.kt:12 box
+22
View File
@@ -0,0 +1,22 @@
// FILE: test.kt
enum class E {
E1;
fun foo() = {
prop
}
val prop = 22
}
fun box() {
E.E1.foo()
}
// LINENUMBERS
// test.kt:14 box
// test.kt:6 foo
// test.kt:8 foo
// test.kt:14 box
// test.kt:15 box
+12 -12
View File
@@ -1,4 +1,4 @@
//FILE: test.kt
// FILE: test.kt
fun box() {
for (i in 1..3) {
foo(i)
@@ -8,14 +8,14 @@ fun box() {
inline fun foo(n: Int) {}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:3
// test.kt:6
// test.kt:3 box
// test.kt:4 box
// test.kt:8 box
// test.kt:3 box
// test.kt:4 box
// test.kt:8 box
// test.kt:3 box
// test.kt:4 box
// test.kt:8 box
// test.kt:3 box
// test.kt:6 box
+13 -13
View File
@@ -1,4 +1,4 @@
//FILE: foo.kt
// FILE: foo.kt
import bar
fun foo(x: Int): Int {
if (x >= 0) { // 4
@@ -21,15 +21,15 @@ fun bar(x: Int) =
}
// LINENUMBERS
// test.kt:4
// foo.kt:4
// foo.kt:7
// test.kt:8
// test.kt:9
// foo.kt:4
// foo.kt:5
// test.kt:9
// test.kt:12
// foo.kt:7
// test.kt:4
// test.kt:5
// test.kt:4 box
// foo.kt:4 foo
// foo.kt:7 foo
// test.kt:8 bar
// test.kt:9 bar
// foo.kt:4 foo
// foo.kt:5 foo
// test.kt:9 bar
// test.kt:12 bar
// foo.kt:7 foo
// test.kt:4 box
// test.kt:5 box
+9 -9
View File
@@ -1,4 +1,4 @@
//FILE: test.kt
// FILE: test.kt
fun box(): Int {
if (
getB() ==
@@ -14,11 +14,11 @@ inline fun getB(): Int {
}
// LINENUMBERS
// test.kt:4
// test.kt:13
// test.kt:5
// test.kt:10
// test.kt:5
// test.kt:7
// test.kt:13
// test.kt:7
// test.kt:4 box
// test.kt:13 box
// test.kt:5 box
// test.kt:10 getA
// test.kt:5 box
// test.kt:7 box
// test.kt:13 box
// test.kt:7 box
+39
View File
@@ -0,0 +1,39 @@
// FILE: test.kt
fun foo(x: Int) {
if (x > 0) {
"OK"
}
if (x > 0) else {
"OK"
}
if (x > 0) {
"OK"
} else {
"ALSO OK"
}
}
fun box() {
foo(1)
foo(0)
}
// LINENUMBERS
// test.kt:20 box
// test.kt:4 foo
// test.kt:5 foo
// test.kt:8 foo
// test.kt:12 foo
// test.kt:13 foo
// test.kt:17 foo
// test.kt:21 box
// test.kt:4 foo
// test.kt:8 foo
// test.kt:9 foo
// test.kt:12 foo
// test.kt:15 foo
// test.kt:17 foo
// test.kt:22 box
+18 -18
View File
@@ -27,21 +27,21 @@ fun box() {
// that is the actual evaluation order.
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:5
// test.kt:6
// test.kt:7
// test.kt:6
// test.kt:8
// test.kt:9
// test.kt:10
// test.kt:9
// test.kt:11
// test.kt:13
// test.kt:12
// test.kt:15
// test.kt:16
// test.kt:15
// test.kt:14
// test.kt:17
// test.kt:3 box
// test.kt:4 box
// test.kt:5 box
// test.kt:6 box
// test.kt:7 box
// test.kt:6 box
// test.kt:8 box
// test.kt:9 box
// test.kt:10 box
// test.kt:9 box
// test.kt:11 box
// test.kt:13 box
// test.kt:12 box
// test.kt:15 box
// test.kt:16 box
// test.kt:15 box
// test.kt:14 box
// test.kt:17 box
@@ -11,10 +11,10 @@ inline fun f(block: () -> Unit) {
}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:10
// test.kt:5
// test.kt:6
// test.kt:11
// test.kt:7
// test.kt:3 box
// test.kt:4 box
// test.kt:10 box
// test.kt:5 box
// test.kt:6 box
// test.kt:11 box
// test.kt:7 box
@@ -11,10 +11,10 @@ inline fun f(block: () -> Unit) {
fun g() {}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:4
// test.kt:11
// test.kt:9
// test.kt:5
// test.kt:3 box
// test.kt:4 box
// test.kt:8 box
// test.kt:4 box
// test.kt:11 g
// test.kt:9 box
// test.kt:5 box
+46
View File
@@ -0,0 +1,46 @@
// FILE: test.kt
inline fun inlineFun(s: () -> Unit) {
s()
}
fun box() {
inlineFun ({
1
})
inlineFun {
2
}
inlineFun {
3
inlineFun {
4
}
}
}
// LINENUMBERS
// test.kt:8 box
// test.kt:4 box
// test.kt:9 box
// test.kt:10 box
// test.kt:5 box
// test.kt:12 box
// test.kt:4 box
// test.kt:13 box
// test.kt:14 box
// test.kt:5 box
// test.kt:16 box
// test.kt:4 box
// test.kt:17 box
// test.kt:19 box
// test.kt:4 box
// test.kt:20 box
// test.kt:21 box
// test.kt:5 box
// test.kt:22 box
// test.kt:5 box
// test.kt:23 box
+8 -8
View File
@@ -1,5 +1,5 @@
// FILE: test.kt
inline fun foo(stringMaker: () -> String): String {
return stringMaker()
}
@@ -14,10 +14,10 @@ fun box(): String {
}
// LINENUMBERS
// test.kt:8
// test.kt:4
// test.kt:8
// test.kt:9
// test.kt:4
// test.kt:10
// test.kt:13
// test.kt:8 box
// test.kt:4 box
// test.kt:8 box
// test.kt:9 box
// test.kt:4 box
// test.kt:10 box
// test.kt:13 box
@@ -31,12 +31,12 @@ fun box(): String {
// test.kt:17
// LINENUMBERS
// test.kt:15
// test.kt:3
// test.kt:4
// test.kt:3
// test.kt:16
// test.kt:7
// test.kt:11
// test.kt:8
// test.kt:17
// test.kt:15 box
// test.kt:3 box
// test.kt:4 box
// test.kt:3 box
// test.kt:16 box
// test.kt:7 box
// test.kt:11 box
// test.kt:8 box
// test.kt:17 box
@@ -0,0 +1,39 @@
// FILE: test.kt
fun normalFunction() {
"OK"
}
inline fun inlineFunction() {
"OK"
}
fun test1() {
inlineFunction()
"OK"
}
fun test2() {
normalFunction()
"OK"
}
fun box() {
test1()
test2()
}
// LINENUMBERS
// test.kt:22 box
// test.kt:12 test1
// test.kt:8 test1
// test.kt:9 test1
// test.kt:13 test1
// test.kt:14 test1
// test.kt:23 box
// test.kt:17 test2
// test.kt:4 normalFunction
// test.kt:5 normalFunction
// test.kt:18 test2
// test.kt:19 test2
// test.kt:24 box
+28
View File
@@ -0,0 +1,28 @@
// FILE: test.kt
fun box() {
"OK"
fun bar() {
"OK"
}
"OK"
bar()
"OK"
}
// LINENUMBERS
// test.kt:4 box
// LINENUMBERS JVM
// test.kt:5 box
// LINENUMBERS
// test.kt:8 box
// test.kt:9 box
// LINENUMBERS JVM
// test.kt:6 invoke
// test.kt:7 invoke
// LINENUMBERS JVM_IR
// test.kt:6 box$bar
// test.kt:7 box$bar
// LINENUMBERS
// test.kt:10 box
// test.kt:11 box
+8 -10
View File
@@ -11,13 +11,11 @@ fun f(block: () -> Unit) {
fun g() {}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:11
// test.kt:4
// test.kt:-1
// test.kt:-1
// test.kt:8
// test.kt:9
// test.kt:5
// test.kt:3 box
// test.kt:4 box
// test.kt:8 f
// test.kt:11 g
// test.kt:4 invoke
// test.kt:8 f
// test.kt:9 f
// test.kt:5 box
+19 -19
View File
@@ -42,22 +42,22 @@ inline fun html(init: () -> Unit) {
}
// LINENUMBERS
// test.kt:19
// test.kt:7
// test.kt:9
// 1.kt:18
// 1.kt:6
// test.kt:10
// 1.kt:14
// 1.kt:10
// 1.kt:11
// test.kt:11
// test.kt:12
// 1.kt:12
// 1.kt:14
// test.kt:13
// 1.kt:7
// 1.kt:18
// test.kt:15
// test.kt:19
// test.kt:21
// test.kt:19 box
// test.kt:7 box
// test.kt:9 box
// 1.kt:18 box
// 1.kt:6 box
// test.kt:10 box
// 1.kt:14 box
// 1.kt:10 box
// 1.kt:11 box
// test.kt:11 box
// test.kt:12 box
// 1.kt:12 box
// 1.kt:14 box
// test.kt:13 box
// 1.kt:7 box
// 1.kt:18 box
// test.kt:15 box
// test.kt:19 box
// test.kt:21 box
+20
View File
@@ -0,0 +1,20 @@
// FILE: test.kt
class A {
val prop : Int
get() {
return 1
}
}
fun box() {
A().prop
}
// LINENUMBERS
// test.kt:11 box
// test.kt:3 <init>
// test.kt:11 box
// test.kt:6 getProp
// test.kt:11 box
// test.kt:12 box
+15
View File
@@ -0,0 +1,15 @@
// FILE: test.kt
fun main(args: Array<String>) {
args[0]
}
fun box() {
main(arrayOf("OK"))
}
// LINENUMBERS
// test.kt:8 box
// test.kt:4 main
// test.kt:5 main
// test.kt:9 box
+13 -13
View File
@@ -1,4 +1,4 @@
//FILE: test.kt
// FILE: test.kt
fun box() {
val n = 3
val k = foo(n)
@@ -12,15 +12,15 @@ fun foo(n :Int ) : Int {
}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:11
// test.kt:8
// test.kt:11
// test.kt:8
// test.kt:9
// test.kt:11
// test.kt:11
// test.kt:4
// test.kt:5
// test.kt:3 box
// test.kt:4 box
// test.kt:8 foo
// test.kt:11 foo
// test.kt:8 foo
// test.kt:11 foo
// test.kt:8 foo
// test.kt:9 foo
// test.kt:11 foo
// test.kt:11 foo
// test.kt:4 box
// test.kt:5 box
+7 -6
View File
@@ -1,5 +1,5 @@
// FILE: test.kt
fun ifoo(ok: String = "OK"): String {
return ok
}
@@ -8,9 +8,10 @@ fun box(): String {
return ifoo()
}
// FORCE_STEP_INTO
// LINENUMBERS
// test.kt:8
// test.kt:3
// test.kt:4
// test.kt:3
// test.kt:8
// test.kt:8 box
// test.kt:3 ifoo$default (synthetic)
// test.kt:4 ifoo
// test.kt:3 ifoo$default (synthetic)
// test.kt:8 box
@@ -9,7 +9,7 @@ fun box(): String {
}
// TODO: IR Backend behaves like simpleDefaultArg: 8,3,4, _3_ ,8
// LINENUMBERS
// test.kt:8
// test.kt:3
// test.kt:4
// test.kt:8
// test.kt:8 box
// test.kt:3 box
// test.kt:4 box
// test.kt:8 box
+5 -5
View File
@@ -11,8 +11,8 @@ fun box(): String {
}
// LINENUMBERS
// test.kt:10
// test.kt:5
// test.kt:3
// test.kt:6
// test.kt:10
// test.kt:10 box
// test.kt:5 box
// test.kt:3 box
// test.kt:6 box
// test.kt:10 box
+19
View File
@@ -0,0 +1,19 @@
// FILE: test.kt
inline fun inlineFun(s: () -> Unit) {
s()
}
fun box() {
inlineFun {
"OK"
}
}
// LINENUMBERS
// test.kt:8 box
// test.kt:4 box
// test.kt:9 box
// test.kt:10 box
// test.kt:5 box
// test.kt:11 box
+11 -11
View File
@@ -1,4 +1,4 @@
//FILE: test.kt
// FILE: test.kt
fun box() {
val a = 1
val b = 2
@@ -15,13 +15,13 @@ fun throwIfLess(a: Int, b: Int) {
throw java.lang.IllegalStateException()
}
// LINENUMBERS
// test.kt:3
// test.kt:4
// test.kt:5
// test.kt:6
// test.kt:14
// test.kt:15
// test.kt:7
// test.kt:8
// test.kt:14
// test.kt:15
// test.kt:3 box
// test.kt:4 box
// test.kt:5 box
// test.kt:6 box
// test.kt:14 throwIfLess
// test.kt:15 throwIfLess
// test.kt:7 box
// test.kt:8 box
// test.kt:14 throwIfLess
// test.kt:15 throwIfLess
+15
View File
@@ -0,0 +1,15 @@
// FILE: test.kt
fun foo() = prop
val prop = 1
fun box() {
foo()
}
// LINENUMBERS
// test.kt:8 box
// test.kt:3 foo
// test.kt:8 box
// test.kt:9 box
+41
View File
@@ -0,0 +1,41 @@
// FILE: test.kt
interface A {
fun foo() = 32
fun bar(): Int {
return foo()
}
}
fun box() {
(object : A {}).bar()
}
// The JVM backend generates non-synthetic overrides of foo and bar
// in the object both with line number 12. That means that there will
// be steps on line number 12 on entry and exit to both bar and foo.
// TODO: Is this what we want? Should they be marked as bridges instead?
// Doesn't look like the intellij debugger skips non-synthetic bridges?
// There seems to be some heuristics in intellij dealing with this as
// the stepping behavior with repeated step-into is mostly OK.
// IGNORE_BACKEND: JVM_IR
// The JVM_IR backend generates non-synthetic overrides of foo and bar
// with no line numbers. That leads to steps on line -1 but only on
// exit from bar and foo.
// LINENUMBERS
// test.kt:12 box
// test.kt:12 <init>
// test.kt:12 box
// test.kt:12 bar
// test.kt:7 bar
// test.kt:12 foo
// test.kt:4 foo
// test.kt:12 foo
// test.kt:7 bar
// test.kt:12 bar
// test.kt:12 box
// test.kt:13 box
+30
View File
@@ -0,0 +1,30 @@
// FILE: test.kt
fun foo(shouldThrow: Boolean) {
try {
if (shouldThrow) throw Exception()
} catch (e: Exception) {
"OK"
}
"OK"
}
fun box() {
foo(false)
foo(true)
}
// LINENUMBERS
// test.kt:13 box
// test.kt:4 foo
// test.kt:5 foo
// test.kt:9 foo
// test.kt:10 foo
// test.kt:14 box
// test.kt:4 foo
// test.kt:5 foo
// test.kt:6 foo
// test.kt:7 foo
// test.kt:9 foo
// test.kt:10 foo
// test.kt:15 box
+8 -8
View File
@@ -1,5 +1,5 @@
// FILE: test.kt
fun box(): String {
run { "O" + "K" }
run {
@@ -9,10 +9,10 @@ fun box(): String {
}
// LINENUMBERS
// test.kt:4
// fake.kt:1
// test.kt:4
// test.kt:5
// test.kt:6
// test.kt:5
// test.kt:8
// test.kt:4 box
// fake.kt:1 box
// test.kt:4 box
// test.kt:5 box
// test.kt:6 box
// test.kt:5 box
// test.kt:8 box
+25
View File
@@ -0,0 +1,25 @@
// FILE: test.kt
fun box() {
var x = 2
while (--x > 0) {
"OK"
}
x = 2
do {
"OK"
} while (--x > 0)
}
// LINENUMBERS
// test.kt:4 box
// test.kt:5 box
// test.kt:6 box
// test.kt:5 box
// test.kt:9 box
// test.kt:11 box
// test.kt:12 box
// test.kt:11 box
// test.kt:12 box
// test.kt:13 box