diff --git a/compiler/testData/cfg-variables/basic/IfWithUninitialized.values b/compiler/testData/cfg-variables/basic/IfWithUninitialized.values new file mode 100644 index 00000000000..e6daa6655db --- /dev/null +++ b/compiler/testData/cfg-variables/basic/IfWithUninitialized.values @@ -0,0 +1,28 @@ +== foo == +fun foo() { + val b: Boolean + if (1 < 2) { + use(b) + } + else { + b = true + } +} +--------------------- +1 NEW() +< NEW(, ) +2 NEW() +1 < 2 COPY +use NEW() +b NEW() +use(b) COPY +{ use(b) } COPY +true NEW() +if (1 < 2) { use(b) } else { b = true } COPY +{ val b: Boolean if (1 < 2) { use(b) } else { b = true } } COPY +===================== +== use == +fun use(vararg a: Any?) = a +--------------------- +a NEW() +===================== diff --git a/compiler/testData/cfg-variables/basic/InitializedNotDeclared.values b/compiler/testData/cfg-variables/basic/InitializedNotDeclared.values new file mode 100644 index 00000000000..bf873438e03 --- /dev/null +++ b/compiler/testData/cfg-variables/basic/InitializedNotDeclared.values @@ -0,0 +1,10 @@ +== A == +class A { + { + x = 1 + } + val x: Int +} +--------------------- +1 NEW() +===================== diff --git a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.values b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.values new file mode 100644 index 00000000000..e904d6ab89e --- /dev/null +++ b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.values @@ -0,0 +1,32 @@ +== foo == +fun foo() { + val a = 1 + val f = { (x: Int) -> + val y = x + a + use(a) + } +} +--------------------- +1 NEW() +{ (x: Int) -> val y = x + a use(a) } NEW() +===================== +== anonymous_0 == +{ (x: Int) -> + val y = x + a + use(a) + } +--------------------- +x NEW() ++ NEW(, ) +a NEW() +x + a COPY +use NEW() +a NEW() +use(a) COPY +val y = x + a use(a) COPY +===================== +== use == +fun use(vararg a: Any?) = a +--------------------- +a NEW() +===================== diff --git a/compiler/testData/cfg-variables/basic/VariablesInitialization.values b/compiler/testData/cfg-variables/basic/VariablesInitialization.values new file mode 100644 index 00000000000..8a7d7b27c17 --- /dev/null +++ b/compiler/testData/cfg-variables/basic/VariablesInitialization.values @@ -0,0 +1,34 @@ +== foo == +fun foo() { + val a = 1 + val b: Int + b = 2 + 42 +} +--------------------- +1 NEW() +2 NEW() +42 NEW() +{ val a = 1 val b: Int b = 2 42 } COPY +===================== +== bar == +fun bar(foo: Foo) { + foo.c + foo.c = 2 + 42 +} +--------------------- +foo NEW() +c NEW() +foo.c COPY +foo NEW() +2 NEW() +42 NEW() +{ foo.c foo.c = 2 42 } COPY +===================== +== Foo == +trait Foo { + var c: Int +} +--------------------- +===================== diff --git a/compiler/testData/cfg-variables/basic/VariablesUsage.values b/compiler/testData/cfg-variables/basic/VariablesUsage.values new file mode 100644 index 00000000000..3882cde42ce --- /dev/null +++ b/compiler/testData/cfg-variables/basic/VariablesUsage.values @@ -0,0 +1,31 @@ +== foo == +fun foo() { + var a = 1 + use(a) + a = 2 + use(a) +} +--------------------- +1 NEW() +use NEW() +a NEW() +use(a) COPY +2 NEW() +use NEW() +a NEW() +use(a) COPY +{ var a = 1 use(a) a = 2 use(a) } COPY +===================== +== bar == +fun bar() { + val b: Int + b = 3 +} +--------------------- +3 NEW() +===================== +== use == +fun use(a: Int) = a +--------------------- +a NEW() +===================== diff --git a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.values b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.values new file mode 100644 index 00000000000..7a620f24e85 --- /dev/null +++ b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.values @@ -0,0 +1,62 @@ +== TestFunctionLiteral == +class TestFunctionLiteral { + val sum: (Int)->Int = { (x: Int) -> + sum(x - 1) + x + } +} +--------------------- +{ (x: Int) -> sum(x - 1) + x } NEW() +===================== +== anonymous_0 == +{ (x: Int) -> + sum(x - 1) + x + } +--------------------- +sum NEW(, ) +x NEW() +- NEW(, ) +1 NEW() +x - 1 COPY +sum(x - 1) COPY ++ NEW(, ) +x NEW() +sum(x - 1) + x COPY +sum(x - 1) + x COPY +===================== +== A == +open class A(val a: A) +--------------------- +===================== +== TestObjectLiteral == +class TestObjectLiteral { + val obj: A = object: A(obj) { + { + val x = obj + } + fun foo() { + val y = obj + } + } +} +--------------------- +obj NEW() +obj NEW() +object: A(obj) { { val x = obj } fun foo() { val y = obj } } NEW() +===================== +== foo == +fun foo() { + val y = obj + } +--------------------- +obj NEW() +===================== +== TestOther == +class TestOther { + val x: Int = x + 1 +} +--------------------- +x NEW() ++ NEW(, ) +1 NEW() +x + 1 COPY +===================== diff --git a/compiler/testData/cfg-variables/bugs/varInitializationInIf.values b/compiler/testData/cfg-variables/bugs/varInitializationInIf.values new file mode 100644 index 00000000000..4a868cca85f --- /dev/null +++ b/compiler/testData/cfg-variables/bugs/varInitializationInIf.values @@ -0,0 +1,23 @@ +== foo == +fun foo() { + val b: Boolean + if (1 < 2) { + b = false + } + else { + b = true + } + use(b) +} +--------------------- +1 NEW() +< NEW(, ) +2 NEW() +1 < 2 COPY +false NEW() +true NEW() +use NEW() +b NEW() +use(b) COPY +{ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) } COPY +===================== diff --git a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.values b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.values new file mode 100644 index 00000000000..84f88ed4a43 --- /dev/null +++ b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.values @@ -0,0 +1,31 @@ +== foo == +fun foo(numbers: Collection) { + for (i in numbers) { + val b: Boolean + if (1 < 2) { + b = false + } + else { + b = true + } + use(b) + continue + } +} +--------------------- +numbers NEW() +1 NEW() +< NEW(, ) +2 NEW() +1 < 2 COPY +false NEW() +true NEW() +use NEW() +b NEW() +use(b) COPY +===================== +== use == +fun use(vararg a: Any?) = a +--------------------- +a NEW() +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.values b/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.values new file mode 100644 index 00000000000..98eff65562e --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.values @@ -0,0 +1,18 @@ +== foo == +fun foo() { + "before" + do { + var a = 2 + } while (a > 0) + "after" +} +--------------------- +"before" NEW() +2 NEW() +a NEW() +> NEW(, ) +0 NEW() +a > 0 COPY +"after" NEW() +{ "before" do { var a = 2 } while (a > 0) "after" } COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/forScope.values b/compiler/testData/cfg-variables/lexicalScopes/forScope.values new file mode 100644 index 00000000000..b71c3152de6 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/forScope.values @@ -0,0 +1,18 @@ +== foo == +fun foo() { + "before" + for (i in 1..10) { + val a = i + } + "after" +} +--------------------- +"before" NEW() +1 NEW() +.. NEW(, ) +10 NEW() +1..10 COPY +i NEW() +"after" NEW() +{ "before" for (i in 1..10) { val a = i } "after" } COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.values b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.values new file mode 100644 index 00000000000..10e8faf963a --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.values @@ -0,0 +1,26 @@ +== foo == +fun foo() { + "before" + val b = 1 + val f = { (x: Int) -> + val a = x + b + } + "after" +} +--------------------- +"before" NEW() +1 NEW() +{ (x: Int) -> val a = x + b } NEW() +"after" NEW() +{ "before" val b = 1 val f = { (x: Int) -> val a = x + b } "after" } COPY +===================== +== anonymous_0 == +{ (x: Int) -> + val a = x + b + } +--------------------- +x NEW() ++ NEW(, ) +b NEW() +x + b COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/ifScope.values b/compiler/testData/cfg-variables/lexicalScopes/ifScope.values new file mode 100644 index 00000000000..83e8b451ad0 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/ifScope.values @@ -0,0 +1,19 @@ +== foo == +fun foo() { + "before" + if (true) { + val a = 1 + } + else { + val b = 2 + } + "after" +} +--------------------- +"before" NEW() +true NEW() +1 NEW() +2 NEW() +"after" NEW() +{ "before" if (true) { val a = 1 } else { val b = 2 } "after" } COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localClass.values b/compiler/testData/cfg-variables/lexicalScopes/localClass.values new file mode 100644 index 00000000000..90604b386e7 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/localClass.values @@ -0,0 +1,26 @@ +== foo == +fun foo() { + "before" + class A(val x: Int) { + { + val a = x + } + fun foo() { + val b = x + } + } + "after" +} +--------------------- +"before" NEW() +x NEW() +"after" NEW() +{ "before" class A(val x: Int) { { val a = x } fun foo() { val b = x } } "after" } COPY +===================== +== foo == +fun foo() { + val b = x + } +--------------------- +x NEW() +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.values b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.values new file mode 100644 index 00000000000..bd4aac4f811 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.values @@ -0,0 +1,25 @@ +== foo == +fun foo() { + "before" + val b = 1 + fun local(x: Int) { + val a = x + b + } + "after" +} +--------------------- +"before" NEW() +1 NEW() +"after" NEW() +{ "before" val b = 1 fun local(x: Int) { val a = x + b } "after" } COPY +===================== +== local == +fun local(x: Int) { + val a = x + b + } +--------------------- +x NEW() ++ NEW(, ) +b NEW() +x + b COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.values b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.values new file mode 100644 index 00000000000..59399b76c4a --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.values @@ -0,0 +1,21 @@ +== foo == +fun foo() { + "before" + val b = 1 + fun local(x: Int) = x + b + "after" +} +--------------------- +"before" NEW() +1 NEW() +"after" NEW() +{ "before" val b = 1 fun local(x: Int) = x + b "after" } COPY +===================== +== local == +fun local(x: Int) = x + b +--------------------- +x NEW() ++ NEW(, ) +b NEW() +x + b COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localObject.values b/compiler/testData/cfg-variables/lexicalScopes/localObject.values new file mode 100644 index 00000000000..ac41b36e842 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/localObject.values @@ -0,0 +1,26 @@ +== foo == +fun foo() { + "before" + object A { + { + val a = 1 + } + fun foo() { + val b = 2 + } + } + "after" +} +--------------------- +"before" NEW() +1 NEW() +"after" NEW() +{ "before" object A { { val a = 1 } fun foo() { val b = 2 } } "after" } COPY +===================== +== foo == +fun foo() { + val b = 2 + } +--------------------- +2 NEW() +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.values b/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.values new file mode 100644 index 00000000000..73e6fa3cdef --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.values @@ -0,0 +1,27 @@ +== foo == +fun foo() { + "before" + val bar = object { + { + val x = 1 + } + fun foo() { + val a = 2 + } + } + "after" +} +--------------------- +"before" NEW() +1 NEW() +object { { val x = 1 } fun foo() { val a = 2 } } NEW() +"after" NEW() +{ "before" val bar = object { { val x = 1 } fun foo() { val a = 2 } } "after" } COPY +===================== +== foo == +fun foo() { + val a = 2 + } +--------------------- +2 NEW() +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values new file mode 100644 index 00000000000..aff6f416c7b --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values @@ -0,0 +1,28 @@ +== foo == +fun foo() { + class A { + var a : Int + get() { + return $a + } + set(v: Int) { + $a = v + } + } +} +--------------------- +===================== +== get_a == +get() { + return $a + } +--------------------- +$a NEW() +===================== +== set_a == +set(v: Int) { + $a = v + } +--------------------- +v NEW() +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/tryScope.values b/compiler/testData/cfg-variables/lexicalScopes/tryScope.values new file mode 100644 index 00000000000..018cd518e40 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/tryScope.values @@ -0,0 +1,25 @@ +== foo == +fun foo() { + "before" + try { + foo() + } + catch (e: Exception) { + val a = e + } + finally { + val a = 1 + } + "after" +} +--------------------- +"before" NEW() +foo NEW() +foo() COPY +{ foo() } COPY +e NEW() +1 NEW() +try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 } COPY +"after" NEW() +{ "before" try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 } "after" } COPY +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/whileScope.values b/compiler/testData/cfg-variables/lexicalScopes/whileScope.values new file mode 100644 index 00000000000..01858675810 --- /dev/null +++ b/compiler/testData/cfg-variables/lexicalScopes/whileScope.values @@ -0,0 +1,14 @@ +== foo == +fun foo() { + "before" + while (true) { + val a: Int + } + "after" +} +--------------------- +"before" NEW() +true NEW() +"after" NEW() +{ "before" while (true) { val a: Int } "after" } COPY +===================== diff --git a/compiler/testData/cfg/arrays/ArrayAccess.values b/compiler/testData/cfg/arrays/ArrayAccess.values new file mode 100644 index 00000000000..be36a822660 --- /dev/null +++ b/compiler/testData/cfg/arrays/ArrayAccess.values @@ -0,0 +1,31 @@ +== foo == +fun foo() { + val a = Array + 3 + a[10] = 4 + 2 + a[10] + 100 + a[10] += 1 +} +--------------------- +Array NEW() +Array COPY +3 NEW() +a NEW() +10 NEW() +4 NEW() +a[10] = 4 NEW(, , ) +2 NEW() +a NEW() +10 NEW() +a[10] NEW(, ) +100 NEW() +a NEW() +10 NEW() +a[10] NEW(, ) ++= NEW(, ) +1 NEW() +a[10] += 1 NEW(, , ) +{ val a = Array 3 a[10] = 4 2 a[10] 100 a[10] += 1 } COPY +===================== diff --git a/compiler/testData/cfg/arrays/ArrayOfFunctions.values b/compiler/testData/cfg/arrays/ArrayOfFunctions.values new file mode 100644 index 00000000000..0ffffeb1c4e --- /dev/null +++ b/compiler/testData/cfg/arrays/ArrayOfFunctions.values @@ -0,0 +1,12 @@ +== test == +fun test(array: Array<(Int)->Unit>) { + array[11](3) +} +--------------------- +array NEW() +11 NEW() +array[11] NEW(, ) +3 NEW() +array[11](3) COPY +{ array[11](3) } COPY +===================== diff --git a/compiler/testData/cfg/arrays/arrayAccessExpression.values b/compiler/testData/cfg/arrays/arrayAccessExpression.values new file mode 100644 index 00000000000..0335aaa2dae --- /dev/null +++ b/compiler/testData/cfg/arrays/arrayAccessExpression.values @@ -0,0 +1,23 @@ +== Ab == +abstract class Ab { + abstract fun getArray() : Array +} +--------------------- +===================== +== getArray == +abstract fun getArray() : Array +--------------------- +===================== +== test == +fun test(ab: Ab) { + ab.getArray()[1] +} +--------------------- +ab NEW() +getArray NEW() +getArray() COPY +ab.getArray() COPY +1 NEW() +ab.getArray()[1] NEW(, ) +{ ab.getArray()[1] } COPY +===================== diff --git a/compiler/testData/cfg/arrays/arrayInc.values b/compiler/testData/cfg/arrays/arrayInc.values new file mode 100644 index 00000000000..542818d8993 --- /dev/null +++ b/compiler/testData/cfg/arrays/arrayInc.values @@ -0,0 +1,12 @@ +== foo == +fun foo(a: Array) { + a[0]++ +} +--------------------- +a NEW() +0 NEW() +a[0] NEW(, ) +++ NEW() +a[0]++ NEW(, , ) +{ a[0]++ } COPY +===================== diff --git a/compiler/testData/cfg/arrays/arraySet.values b/compiler/testData/cfg/arrays/arraySet.values new file mode 100644 index 00000000000..bfed5c9d479 --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySet.values @@ -0,0 +1,11 @@ +== foo == +fun foo(a: Array) { + a[1] = 2 +} +--------------------- +a NEW() +1 NEW() +2 NEW() +a[1] = 2 NEW(, , ) +{ a[1] = 2 } COPY +===================== diff --git a/compiler/testData/cfg/arrays/arraySetPlusAssign.values b/compiler/testData/cfg/arrays/arraySetPlusAssign.values new file mode 100644 index 00000000000..43e25c717e8 --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetPlusAssign.values @@ -0,0 +1,13 @@ +== foo == +fun foo(a: Array) { + a[0] += 1 +} +--------------------- +a NEW() +0 NEW() +a[0] NEW(, ) ++= NEW(, ) +1 NEW() +a[0] += 1 NEW(, , ) +{ a[0] += 1 } COPY +===================== diff --git a/compiler/testData/cfg/basic/Basic.values b/compiler/testData/cfg/basic/Basic.values new file mode 100644 index 00000000000..8c7a13ea445 --- /dev/null +++ b/compiler/testData/cfg/basic/Basic.values @@ -0,0 +1,73 @@ +== f == +fun f(a : Boolean) : Unit { + 1 + a + 2.toLong() + foo(a, 3) + genfun() + flfun {1} + 3.equals(4) + + 3 equals 4 + + 1 + 2 + + a && true + a || false + +} +--------------------- +1 NEW() +a NEW() +2 NEW() +toLong NEW() +toLong() COPY +2.toLong() COPY +foo NEW(, ) +a NEW() +3 NEW() +foo(a, 3) COPY +genfun NEW() +genfun() COPY +flfun NEW() +{1} NEW() +flfun {1} COPY +3 NEW() +equals NEW(, ) +4 NEW() +equals(4) COPY +3.equals(4) COPY +3 NEW() +equals NEW(, ) +4 NEW() +3 equals 4 COPY +1 NEW() ++ NEW(, ) +2 NEW() +1 + 2 COPY +a NEW() +true NEW() +a && true NEW(, ) +a NEW() +false NEW() +a || false NEW(, ) +{ 1 a 2.toLong() foo(a, 3) genfun() flfun {1} 3.equals(4) 3 equals 4 1 + 2 a && true a || false } COPY +===================== +== anonymous_0 == +{1} +--------------------- +1 NEW() +1 COPY +===================== +== foo == +fun foo(a : Boolean, b : Int) : Unit {} +--------------------- +===================== +== genfun == +fun genfun() : Unit {} +--------------------- +===================== +== flfun == +fun flfun(f : () -> Any) : Unit {} +--------------------- +===================== diff --git a/compiler/testData/cfg/basic/EmptyFunction.values b/compiler/testData/cfg/basic/EmptyFunction.values new file mode 100644 index 00000000000..aa2ff2b4cb4 --- /dev/null +++ b/compiler/testData/cfg/basic/EmptyFunction.values @@ -0,0 +1,4 @@ +== empty == +fun empty() {} +--------------------- +===================== diff --git a/compiler/testData/cfg/basic/ShortFunction.values b/compiler/testData/cfg/basic/ShortFunction.values new file mode 100644 index 00000000000..c30b60d47d4 --- /dev/null +++ b/compiler/testData/cfg/basic/ShortFunction.values @@ -0,0 +1,5 @@ +== short == +fun short() = 1 +--------------------- +1 NEW() +===================== diff --git a/compiler/testData/cfg/bugs/jumpToOuterScope.values b/compiler/testData/cfg/bugs/jumpToOuterScope.values new file mode 100644 index 00000000000..3f158c01d81 --- /dev/null +++ b/compiler/testData/cfg/bugs/jumpToOuterScope.values @@ -0,0 +1,19 @@ +== foo == +fun foo(c: Collection) { + for (e in c) { + { + break + } + } +} +--------------------- +c NEW() +{ break } NEW() +{ { break } } COPY +===================== +== anonymous_0 == +{ + break + } +--------------------- +===================== diff --git a/compiler/testData/cfg/controlStructures/Finally.values b/compiler/testData/cfg/controlStructures/Finally.values new file mode 100644 index 00000000000..938ca6510df --- /dev/null +++ b/compiler/testData/cfg/controlStructures/Finally.values @@ -0,0 +1,388 @@ +== t1 == +fun t1() { + try { + 1 + } finally { + 2 + } +} +--------------------- +1 NEW() +{ 1 } COPY +2 NEW() +{ 2 } COPY +try { 1 } finally { 2 } COPY +{ try { 1 } finally { 2 } } COPY +===================== +== t2 == +fun t2() { + try { + 1 + if (2 > 3) { + return + } + } finally { + 2 + } +} +--------------------- +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +2 NEW() +{ 2 } COPY +===================== +== t3 == +fun t3() { + try { + 1 + @l{ () -> + if (2 > 3) { + return@l + } + } + } finally { + 2 + } +} +--------------------- +1 NEW() +{ () -> if (2 > 3) { return@l } } NEW() +@l{ () -> if (2 > 3) { return@l } } COPY +{ 1 @l{ () -> if (2 > 3) { return@l } } } COPY +2 NEW() +{ 2 } COPY +try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } COPY +{ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } } COPY +===================== +== anonymous_0 == +{ () -> + if (2 > 3) { + return@l + } + } +--------------------- +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +===================== +== t4 == +fun t4() { + @l{ () -> + try { + 1 + if (2 > 3) { + return@l + } + } finally { + 2 + } + } +} +--------------------- +{ () -> try { 1 if (2 > 3) { return@l } } finally { 2 } } NEW() +@l{ () -> try { 1 if (2 > 3) { return@l } } finally { 2 } } COPY +{ @l{ () -> try { 1 if (2 > 3) { return@l } } finally { 2 } } } COPY +===================== +== anonymous_1 == +{ () -> + try { + 1 + if (2 > 3) { + return@l + } + } finally { + 2 + } + } +--------------------- +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +2 NEW() +{ 2 } COPY +===================== +== t5 == +fun t5() { + @l while(true) { + try { + 1 + if (2 > 3) { + break @l + } + } finally { + 2 + } + } +} +--------------------- +true NEW() +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +2 NEW() +{ 2 } COPY +===================== +== t6 == +fun t6() { + try { + @l while(true) { + 1 + if (2 > 3) { + break @l + } + } + 5 + } finally { + 2 + } +} +--------------------- +true NEW() +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +5 NEW() +{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } COPY +2 NEW() +{ 2 } COPY +try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } COPY +{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } COPY +===================== +== t7 == +fun t7() { + try { + @l while(true) { + 1 + if (2 > 3) { + break @l + } + } + } finally { + 2 + } +} +--------------------- +true NEW() +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +2 NEW() +{ 2 } COPY +===================== +== t8 == +fun t8(a : Int) { + @l for (i in 1..a) { + try { + 1 + if (2 > 3) { + continue @l + } + } finally { + 2 + } + } +} +--------------------- +1 NEW() +.. NEW(, ) +a NEW() +1..a COPY +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +2 NEW() +{ 2 } COPY +===================== +== t9 == +fun t9(a : Int) { + try { + @l for (i in 1..a) { + 1 + if (2 > 3) { + continue @l + } + } + 5 + } finally { + 2 + } +} +--------------------- +1 NEW() +.. NEW(, ) +a NEW() +1..a COPY +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +5 NEW() +{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } COPY +2 NEW() +{ 2 } COPY +try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } COPY +{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } COPY +===================== +== t10 == +fun t10(a : Int) { + try { + @l for (i in 1..a) { + 1 + if (2 > 3) { + continue @l + } + } + } finally { + 2 + } +} +--------------------- +1 NEW() +.. NEW(, ) +a NEW() +1..a COPY +1 NEW() +2 NEW() +> NEW(, ) +3 NEW() +2 > 3 COPY +2 NEW() +{ 2 } COPY +===================== +== t11 == +fun t11() { + try { + return 1 + } + finally { + return 2 + } +} +--------------------- +1 NEW() +2 NEW() +===================== +== t12 == +fun t12() : Int { + try { + return 1 + } + finally { + doSmth(3) + } +} +--------------------- +1 NEW() +doSmth NEW() +3 NEW() +doSmth(3) COPY +{ doSmth(3) } COPY +===================== +== t13 == +fun t13() : Int { + try { + return 1 + } + catch (e: UnsupportedOperationException) { + doSmth(2) + } + finally { + doSmth(3) + } +} +--------------------- +1 NEW() +doSmth NEW() +2 NEW() +doSmth(2) COPY +{ doSmth(2) } COPY +doSmth NEW() +3 NEW() +doSmth(3) COPY +{ doSmth(3) } COPY +try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } COPY +{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } } COPY +===================== +== t14 == +fun t14() : Int { + try { + return 1 + } + catch (e: UnsupportedOperationException) { + doSmth(2) + } +} +--------------------- +1 NEW() +doSmth NEW() +2 NEW() +doSmth(2) COPY +{ doSmth(2) } COPY +try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } COPY +{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } } COPY +===================== +== t15 == +fun t15() : Int { + try { + return 1 + } + catch (e: UnsupportedOperationException) { + return 2 + } + finally { + doSmth(3) + } +} +--------------------- +1 NEW() +2 NEW() +doSmth NEW() +3 NEW() +doSmth(3) COPY +{ doSmth(3) } COPY +===================== +== t16 == +fun t16() : Int { + try { + doSmth(1) + } + catch (e: UnsupportedOperationException) { + return 2 + } + finally { + doSmth(3) + } +} +--------------------- +doSmth NEW() +1 NEW() +doSmth(1) COPY +{ doSmth(1) } COPY +2 NEW() +doSmth NEW() +3 NEW() +doSmth(3) COPY +{ doSmth(3) } COPY +try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } COPY +{ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } COPY +===================== +== doSmth == +fun doSmth(i: Int) { +} +--------------------- +===================== diff --git a/compiler/testData/cfg/controlStructures/FinallyTestCopy.values b/compiler/testData/cfg/controlStructures/FinallyTestCopy.values new file mode 100644 index 00000000000..090cc3cfe00 --- /dev/null +++ b/compiler/testData/cfg/controlStructures/FinallyTestCopy.values @@ -0,0 +1,131 @@ +== doSmth == +fun doSmth() {} +--------------------- +===================== +== doSmth1 == +fun doSmth1() {} +--------------------- +===================== +== doSmth2 == +fun doSmth2() {} +--------------------- +===================== +== cond == +fun cond() {} +--------------------- +===================== +== testCopy1 == +fun testCopy1() : Int { + try { + doSmth() + } + catch (e: NullPointerException) { + doSmth1() + } + catch (e: Exception) { + doSmth2() + } + finally { + return 1 + } +} +--------------------- +doSmth NEW() +doSmth() COPY +{ doSmth() } COPY +doSmth1 NEW() +doSmth1() COPY +{ doSmth1() } COPY +doSmth2 NEW() +doSmth2() COPY +{ doSmth2() } COPY +1 NEW() +try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } NEW(, , ) +{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } } COPY +===================== +== testCopy2 == +fun testCopy2() { + while (cond()) { + try { + doSmth() + } + catch (e: NullPointerException) { + doSmth1() + } + catch (e: Exception) { + doSmth2() + } + finally { + if (cond()) return + else continue + } + } +} +--------------------- +cond NEW() +cond() COPY +doSmth NEW() +doSmth() COPY +{ doSmth() } COPY +doSmth1 NEW() +doSmth1() COPY +{ doSmth1() } COPY +doSmth2 NEW() +doSmth2() COPY +{ doSmth2() } COPY +cond NEW() +cond() COPY +try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } NEW(, , ) +{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } COPY +===================== +== testCopy3 == +fun testCopy3() { + try { + doSmth() + } + catch (e: NullPointerException) { + doSmth1() + } + catch (e: Exception) { + doSmth2() + } + finally { + while (cond()); + } +} +--------------------- +doSmth NEW() +doSmth() COPY +{ doSmth() } COPY +doSmth1 NEW() +doSmth1() COPY +{ doSmth1() } COPY +doSmth2 NEW() +doSmth2() COPY +{ doSmth2() } COPY +cond NEW() +cond() COPY +try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } NEW(, , ) +{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } } COPY +===================== +== doTestCopy4 == +fun doTestCopy4(list: List?) : Int { + try { + doSmth() + } + finally { + if(list != null) { + } + } +} +--------------------- +doSmth NEW() +doSmth() COPY +{ doSmth() } COPY +list NEW() +!= NEW(, ) +null NEW() +list != null COPY +try { doSmth() } finally { if(list != null) { } } COPY +{ try { doSmth() } finally { if(list != null) { } } } COPY +===================== diff --git a/compiler/testData/cfg/controlStructures/For.values b/compiler/testData/cfg/controlStructures/For.values new file mode 100644 index 00000000000..296b717639f --- /dev/null +++ b/compiler/testData/cfg/controlStructures/For.values @@ -0,0 +1,20 @@ +== t1 == +fun t1() { + for (i in 1..2) { + doSmth(i) + } +} +--------------------- +1 NEW() +.. NEW(, ) +2 NEW() +1..2 COPY +doSmth NEW() +i NEW() +doSmth(i) COPY +{ doSmth(i) } COPY +===================== +== doSmth == +fun doSmth(i: Int) {} +--------------------- +===================== diff --git a/compiler/testData/cfg/controlStructures/If.values b/compiler/testData/cfg/controlStructures/If.values new file mode 100644 index 00000000000..32c89342ba6 --- /dev/null +++ b/compiler/testData/cfg/controlStructures/If.values @@ -0,0 +1,55 @@ +== t1 == +fun t1(b: Boolean) { + var u: String + if (b) { + u = "s" + } + doSmth(u) + + var r: String + if (b) { + r = "s" + } + else { + r = "t" + } + doSmth(r) +} +--------------------- +b NEW() +"s" NEW() +doSmth NEW() +u NEW() +doSmth(u) COPY +b NEW() +"s" NEW() +"t" NEW() +doSmth NEW() +r NEW() +doSmth(r) COPY +{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } COPY +===================== +== t2 == +fun t2(b: Boolean) { + val i = 3 + if (b) { + return; + } + doSmth(i) + if (i is Int) { + return; + } +} +--------------------- +3 NEW() +b NEW() +doSmth NEW() +i NEW() +doSmth(i) COPY +i NEW() +i is Int NEW() +===================== +== doSmth == +fun doSmth(s: String) {} +--------------------- +===================== diff --git a/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.values b/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.values new file mode 100644 index 00000000000..91e07f3a580 --- /dev/null +++ b/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.values @@ -0,0 +1,25 @@ +== main == +fun main() { + while(0 > 1) { + 2 + } +} +--------------------- +0 NEW() +> NEW(, ) +1 NEW() +0 > 1 COPY +2 NEW() +{ 2 } COPY +===================== +== dowhile == +fun dowhile() { + do {return} + while(0 > 1) +} +--------------------- +0 NEW() +> NEW(, ) +1 NEW() +0 > 1 COPY +===================== diff --git a/compiler/testData/cfg/controlStructures/returnsInWhen.values b/compiler/testData/cfg/controlStructures/returnsInWhen.values new file mode 100644 index 00000000000..6fb7648cce6 --- /dev/null +++ b/compiler/testData/cfg/controlStructures/returnsInWhen.values @@ -0,0 +1,10 @@ +== illegalWhenBlock == +fun illegalWhenBlock(a: Any): Any { + when(a) { + is Int -> return a + } +} +--------------------- +a NEW() +a NEW() +===================== diff --git a/compiler/testData/cfg/conventions/equals.values b/compiler/testData/cfg/conventions/equals.values new file mode 100644 index 00000000000..ecaef0eeb99 --- /dev/null +++ b/compiler/testData/cfg/conventions/equals.values @@ -0,0 +1,11 @@ +== foo == +fun foo(a: Int, b: Int) { + if (a == b) { + } +} +--------------------- +a NEW() +== NEW(, ) +b NEW() +a == b COPY +===================== diff --git a/compiler/testData/cfg/conventions/incrementAtTheEnd.values b/compiler/testData/cfg/conventions/incrementAtTheEnd.values new file mode 100644 index 00000000000..870bd86bae5 --- /dev/null +++ b/compiler/testData/cfg/conventions/incrementAtTheEnd.values @@ -0,0 +1,10 @@ +== foo == +fun foo() { + var i = 1 + i++ +} +--------------------- +1 NEW() +i NEW() +++ NEW() +===================== diff --git a/compiler/testData/cfg/conventions/invoke.values b/compiler/testData/cfg/conventions/invoke.values new file mode 100644 index 00000000000..14de48d8f70 --- /dev/null +++ b/compiler/testData/cfg/conventions/invoke.values @@ -0,0 +1,9 @@ +== foo == +fun foo(f: () -> Unit) { + f() +} +--------------------- +f NEW() +f() COPY +{ f() } COPY +===================== diff --git a/compiler/testData/cfg/conventions/notEqual.values b/compiler/testData/cfg/conventions/notEqual.values new file mode 100644 index 00000000000..c57f4cafadf --- /dev/null +++ b/compiler/testData/cfg/conventions/notEqual.values @@ -0,0 +1,10 @@ +== neq == +fun neq(a: Int, b: Int) { + if (a != b) {} +} +--------------------- +a NEW() +!= NEW(, ) +b NEW() +a != b COPY +===================== diff --git a/compiler/testData/cfg/deadCode/DeadCode.values b/compiler/testData/cfg/deadCode/DeadCode.values new file mode 100644 index 00000000000..20de98dc3e3 --- /dev/null +++ b/compiler/testData/cfg/deadCode/DeadCode.values @@ -0,0 +1,12 @@ +== test == +fun test() { + throw Exception() + test() +} +--------------------- +Exception NEW() +Exception() COPY +test NEW() +test() COPY +{ throw Exception() test() } COPY +===================== diff --git a/compiler/testData/cfg/deadCode/returnInElvis.values b/compiler/testData/cfg/deadCode/returnInElvis.values new file mode 100644 index 00000000000..a2105a61f56 --- /dev/null +++ b/compiler/testData/cfg/deadCode/returnInElvis.values @@ -0,0 +1,9 @@ +== foo == +fun foo() { + return ?: null +} +--------------------- +null NEW() +return ?: null COPY +{ return ?: null } COPY +===================== diff --git a/compiler/testData/cfg/deadCode/stringTemplate.values b/compiler/testData/cfg/deadCode/stringTemplate.values new file mode 100644 index 00000000000..c563baf9aa5 --- /dev/null +++ b/compiler/testData/cfg/deadCode/stringTemplate.values @@ -0,0 +1,11 @@ +== test == +fun test() { + "${throw Exception()} ${1}" +} +--------------------- +Exception NEW() +Exception() COPY +1 NEW() +"${throw Exception()} ${1}" NEW() +{ "${throw Exception()} ${1}" } COPY +===================== diff --git a/compiler/testData/cfg/declarations/classesAndObjects/AnonymousInitializers.values b/compiler/testData/cfg/declarations/classesAndObjects/AnonymousInitializers.values new file mode 100644 index 00000000000..6249bfd5c22 --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/AnonymousInitializers.values @@ -0,0 +1,21 @@ +== AnonymousInitializers == +class AnonymousInitializers() { + val k = 34 + + val i: Int + { + $i = 12 + } + + val j: Int + get() = 20 + + { + $i = 13 + } +} +--------------------- +34 NEW() +12 NEW() +13 NEW() +===================== diff --git a/compiler/testData/cfg/declarations/functionLiterals/unusedFunctionLiteral.values b/compiler/testData/cfg/declarations/functionLiterals/unusedFunctionLiteral.values new file mode 100644 index 00000000000..e5a74bb024f --- /dev/null +++ b/compiler/testData/cfg/declarations/functionLiterals/unusedFunctionLiteral.values @@ -0,0 +1,12 @@ +== foo == +fun foo() { + {} +} +--------------------- +{} NEW() +{ {} } COPY +===================== +== anonymous_0 == +{} +--------------------- +===================== diff --git a/compiler/testData/cfg/declarations/functions/FailFunction.values b/compiler/testData/cfg/declarations/functions/FailFunction.values new file mode 100644 index 00000000000..e02d5af311f --- /dev/null +++ b/compiler/testData/cfg/declarations/functions/FailFunction.values @@ -0,0 +1,9 @@ +== fail == +fun fail() : Nothing { + throw java.lang.RuntimeException() +} +--------------------- +RuntimeException NEW() +RuntimeException() COPY +java.lang.RuntimeException() COPY +===================== diff --git a/compiler/testData/cfg/declarations/functions/typeParameter.values b/compiler/testData/cfg/declarations/functions/typeParameter.values new file mode 100644 index 00000000000..4ee00400258 --- /dev/null +++ b/compiler/testData/cfg/declarations/functions/typeParameter.values @@ -0,0 +1,8 @@ +== foo == +fun foo() { + T +} +--------------------- +T NEW() +{ T } COPY +===================== diff --git a/compiler/testData/cfg/declarations/local/LocalDeclarations.values b/compiler/testData/cfg/declarations/local/LocalDeclarations.values new file mode 100644 index 00000000000..fbd92f5b92b --- /dev/null +++ b/compiler/testData/cfg/declarations/local/LocalDeclarations.values @@ -0,0 +1,137 @@ +== C == +class C() { + val a: Int = 1 + + class object { + val x : Int + + { + $x = 1 + } + + + fun foo() { + val b : Int = 1 + doSmth(b) + } + } +} +--------------------- +1 NEW() +===================== +== doSmth == +fun doSmth(i: Int) {} +--------------------- +===================== +== test1 == +fun test1() { + val a = object { + val x : Int + { + $x = 1 + } + } +} +--------------------- +1 NEW() +object { val x : Int { $x = 1 } } NEW() +===================== +== O == +object O { + val x : Int + { + $x = 1 + } +} +--------------------- +1 NEW() +===================== +== test2 == +fun test2() { + val b = 1 + val a = object { + val x = b + } +} +--------------------- +1 NEW() +b NEW() +object { val x = b } NEW() +===================== +== test3 == +fun test3() { + val a = object { + val y : Int + fun inner_bar() { + y = 10 + } + } +} +--------------------- +object { val y : Int fun inner_bar() { y = 10 } } NEW() +===================== +== inner_bar == +fun inner_bar() { + y = 10 + } +--------------------- +10 NEW() +===================== +== test4 == +fun test4() { + val a = object { + val x : Int + val y : Int + { + $x = 1 + } + fun ggg() { + y = 10 + } + } +} +--------------------- +1 NEW() +object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } } NEW() +===================== +== ggg == +fun ggg() { + y = 10 + } +--------------------- +10 NEW() +===================== +== test5 == +fun test5() { + val a = object { + var x = 1 + { + $x = 2 + } + fun foo() { + x = 3 + } + fun bar() { + x = 4 + } + } +} +--------------------- +1 NEW() +2 NEW() +object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } } NEW() +===================== +== foo == +fun foo() { + x = 3 + } +--------------------- +3 NEW() +===================== +== bar == +fun bar() { + x = 4 + } +--------------------- +4 NEW() +===================== diff --git a/compiler/testData/cfg/declarations/local/ObjectExpression.values b/compiler/testData/cfg/declarations/local/ObjectExpression.values new file mode 100644 index 00000000000..25285525c34 --- /dev/null +++ b/compiler/testData/cfg/declarations/local/ObjectExpression.values @@ -0,0 +1,34 @@ +== A == +trait A { + fun foo() : Int +} +--------------------- +===================== +== foo == +fun foo() : Int +--------------------- +===================== +== B == +class B : A { + override fun foo() = 10 +} +--------------------- +===================== +== foo == +override fun foo() = 10 +--------------------- +10 NEW() +===================== +== foo == +fun foo(b: B) : Int { + val o = object : A by b {} + return o.foo() +} +--------------------- +b NEW() +object : A by b {} NEW() +o NEW() +foo NEW() +foo() COPY +o.foo() COPY +===================== diff --git a/compiler/testData/cfg/declarations/local/localClass.values b/compiler/testData/cfg/declarations/local/localClass.values new file mode 100644 index 00000000000..901eba15d72 --- /dev/null +++ b/compiler/testData/cfg/declarations/local/localClass.values @@ -0,0 +1,32 @@ +== f == +fun f() { + class LocalClass() { + fun f() { + val x = "" + + fun loc() { + val x3 = "" + } + } + } +} +--------------------- +===================== +== f == +fun f() { + val x = "" + + fun loc() { + val x3 = "" + } + } +--------------------- +"" NEW() +===================== +== loc == +fun loc() { + val x3 = "" + } +--------------------- +"" NEW() +===================== diff --git a/compiler/testData/cfg/declarations/local/localProperty.values b/compiler/testData/cfg/declarations/local/localProperty.values new file mode 100644 index 00000000000..3f3f9bf7ac5 --- /dev/null +++ b/compiler/testData/cfg/declarations/local/localProperty.values @@ -0,0 +1,20 @@ +== foo == +fun foo() { + class B { + val a: Int + get() { + val b: Int + return b + } + } +} +--------------------- +===================== +== get_a == +get() { + val b: Int + return b + } +--------------------- +b NEW() +===================== diff --git a/compiler/testData/cfg/declarations/multiDeclaration/MultiDecl.values b/compiler/testData/cfg/declarations/multiDeclaration/MultiDecl.values new file mode 100644 index 00000000000..0cf5a4b0acd --- /dev/null +++ b/compiler/testData/cfg/declarations/multiDeclaration/MultiDecl.values @@ -0,0 +1,28 @@ +== C == +class C { + fun component1() = 1 + fun component2() = 2 +} +--------------------- +===================== +== component1 == +fun component1() = 1 +--------------------- +1 NEW() +===================== +== component2 == +fun component2() = 2 +--------------------- +2 NEW() +===================== +== test == +fun test(c: C) { + val (a, b) = c + val d = 1 +} +--------------------- +a NEW() +b NEW() +c NEW() +1 NEW() +===================== diff --git a/compiler/testData/cfg/declarations/multiDeclaration/multiDeclarationWithError.values b/compiler/testData/cfg/declarations/multiDeclaration/multiDeclarationWithError.values new file mode 100644 index 00000000000..71f56d9b567 --- /dev/null +++ b/compiler/testData/cfg/declarations/multiDeclaration/multiDeclarationWithError.values @@ -0,0 +1,10 @@ +== foo == +fun foo(x: Int) { + val (a, b) = x + a +} +--------------------- +x NEW() +a NEW() +{ val (a, b) = x a } COPY +===================== diff --git a/compiler/testData/cfg/declarations/properties/DelegatedProperty.values b/compiler/testData/cfg/declarations/properties/DelegatedProperty.values new file mode 100644 index 00000000000..e8db517d485 --- /dev/null +++ b/compiler/testData/cfg/declarations/properties/DelegatedProperty.values @@ -0,0 +1,22 @@ +== Delegate == +class Delegate { + fun get(_this: Any, p: PropertyMetadata): Int = 0 +} +--------------------- +===================== +== get == +fun get(_this: Any, p: PropertyMetadata): Int = 0 +--------------------- +0 NEW() +===================== +== a == +val a = Delegate() +--------------------- +Delegate NEW() +Delegate() COPY +===================== +== b == +val b by a +--------------------- +a NEW() +===================== diff --git a/compiler/testData/cfg/declarations/properties/backingFieldAccess.values b/compiler/testData/cfg/declarations/properties/backingFieldAccess.values new file mode 100644 index 00000000000..88d1ae6dd4e --- /dev/null +++ b/compiler/testData/cfg/declarations/properties/backingFieldAccess.values @@ -0,0 +1,13 @@ +== C == +class C { + val a: Int + get() = 1 + + { + $a + } +} +--------------------- +$a NEW() +{ $a } COPY +===================== diff --git a/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.values b/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.values new file mode 100644 index 00000000000..4bb84a69d5b --- /dev/null +++ b/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.values @@ -0,0 +1,17 @@ +== Bar == +abstract class Bar { + abstract var bar : String + fun foo() = "foo" + this.$bar +} +--------------------- +===================== +== foo == +fun foo() = "foo" + this.$bar +--------------------- +"foo" NEW() ++ NEW(, ) +this NEW() +$bar NEW() +this.$bar COPY +"foo" + this.$bar COPY +===================== diff --git a/compiler/testData/cfg/expressions/Assignments.values b/compiler/testData/cfg/expressions/Assignments.values new file mode 100644 index 00000000000..49eb7dc3652 --- /dev/null +++ b/compiler/testData/cfg/expressions/Assignments.values @@ -0,0 +1,47 @@ +== Test == +class Test { + var x : Int; +} +--------------------- +===================== +== assignments == +fun assignments() : Unit { + var x = 1 + x = 2 + x += 2 + + x = if (true) 1 else 2 + + val y = true && false + val z = false && true + + val t = Test(); + t.x = 1 + t.x += 1 +} +--------------------- +1 NEW() +2 NEW() +x NEW() ++= NEW(, ) +2 NEW() +true NEW() +1 NEW() +2 NEW() +if (true) 1 else 2 NEW(, ) +true NEW() +false NEW() +true && false NEW(, ) +false NEW() +true NEW() +false && true NEW(, ) +Test NEW() +Test() COPY +t NEW() +1 NEW() +t NEW() +x NEW() +t.x COPY ++= NEW(, ) +1 NEW() +===================== diff --git a/compiler/testData/cfg/expressions/LazyBooleans.values b/compiler/testData/cfg/expressions/LazyBooleans.values new file mode 100644 index 00000000000..875bf5a3649 --- /dev/null +++ b/compiler/testData/cfg/expressions/LazyBooleans.values @@ -0,0 +1,48 @@ +== lazyBooleans == +fun lazyBooleans(a : Boolean, b : Boolean) : Unit { + if (a) { + 1 + } + else { + 2 + } + 3 + if (a && b) 5 else 6 + 7 + if (a || b) 8 else 9 + 10 + if (a) 11 + 12 + if (a) else 13 + 14 +} +--------------------- +a NEW() +1 NEW() +{ 1 } COPY +2 NEW() +{ 2 } COPY +if (a) { 1 } else { 2 } NEW(, ) +3 NEW() +a NEW() +b NEW() +5 NEW() +6 NEW() +if (a && b) 5 else 6 NEW(, ) +7 NEW() +a NEW() +b NEW() +8 NEW() +9 NEW() +if (a || b) 8 else 9 NEW(, ) +10 NEW() +a NEW() +11 NEW() +if (a) 11 COPY +12 NEW() +a NEW() +13 NEW() +if (a) else 13 COPY +14 NEW() +{ if (a) { 1 } else { 2 } 3 if (a && b) 5 else 6 7 if (a || b) 8 else 9 10 if (a) 11 12 if (a) else 13 14 } COPY +===================== diff --git a/compiler/testData/cfg/expressions/ReturnFromExpression.values b/compiler/testData/cfg/expressions/ReturnFromExpression.values new file mode 100644 index 00000000000..fefb44006b9 --- /dev/null +++ b/compiler/testData/cfg/expressions/ReturnFromExpression.values @@ -0,0 +1,10 @@ +== blockAndAndMismatch == +fun blockAndAndMismatch() : Boolean { + false || (return false) +} +--------------------- +false NEW() +false NEW() +false || (return false) NEW() +{ false || (return false) } COPY +===================== diff --git a/compiler/testData/cfg/expressions/assignmentToThis.values b/compiler/testData/cfg/expressions/assignmentToThis.values new file mode 100644 index 00000000000..45d0ff07d35 --- /dev/null +++ b/compiler/testData/cfg/expressions/assignmentToThis.values @@ -0,0 +1,7 @@ +== bar == +fun Int.bar(c: C) { + this = c +} +--------------------- +c NEW() +===================== diff --git a/compiler/testData/cfg/expressions/chainedQualifiedExpression.values b/compiler/testData/cfg/expressions/chainedQualifiedExpression.values new file mode 100644 index 00000000000..2eff8901890 --- /dev/null +++ b/compiler/testData/cfg/expressions/chainedQualifiedExpression.values @@ -0,0 +1,337 @@ +== JetToken == +class JetToken +--------------------- +===================== +== JetKeywordCompletionContributor == +public open class JetKeywordCompletionContributor() { + { + val inTopLevel = 1.0 + + BunchKeywordRegister() + .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + + .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) + .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) + .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) + .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) + + .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) + + .add(IMPORT_KEYWORD, inTopLevel) + .add(PACKAGE_KEYWORD, inTopLevel) + + .add(OVERRIDE_KEYWORD, inTopLevel) + + .add(IN_KEYWORD, inTopLevel, inTopLevel) + + .add(OUT_KEYWORD, inTopLevel) + + .add(OBJECT_KEYWORD, unresolvedCode) + + .registerAll() + } + + private inner class BunchKeywordRegister() { + fun add(keyword= JetToken(), vararg filters: Double): BunchKeywordRegister { + } + + fun registerAll() { + } + } +} +--------------------- +1.0 NEW() +BunchKeywordRegister NEW() +BunchKeywordRegister() COPY +add NEW(, , , , ) +ABSTRACT_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +FINAL_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +OPEN_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , , ) +INTERNAL_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , , ) +PRIVATE_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , , ) +PROTECTED_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , , ) +PUBLIC_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +CLASS_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +ENUM_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +FUN_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +GET_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +SET_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +TRAIT_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +VAL_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +VAR_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , , , ) +TYPE_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +inTopLevel NEW() +add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) COPY +add NEW(, , ) +IMPORT_KEYWORD NEW() +inTopLevel NEW() +add(IMPORT_KEYWORD, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) COPY +add NEW(, , ) +PACKAGE_KEYWORD NEW() +inTopLevel NEW() +add(PACKAGE_KEYWORD, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) COPY +add NEW(, , ) +OVERRIDE_KEYWORD NEW() +inTopLevel NEW() +add(OVERRIDE_KEYWORD, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) COPY +add NEW(, , , ) +IN_KEYWORD NEW() +inTopLevel NEW() +inTopLevel NEW() +add(IN_KEYWORD, inTopLevel, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) COPY +add NEW(, , ) +OUT_KEYWORD NEW() +inTopLevel NEW() +add(OUT_KEYWORD, inTopLevel) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) COPY +add NEW(, , ) +OBJECT_KEYWORD NEW() +unresolvedCode NEW() +add(OBJECT_KEYWORD, unresolvedCode) COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) COPY +registerAll NEW() +registerAll() COPY +BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) .registerAll() COPY +{ val inTopLevel = 1.0 BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) .registerAll() } COPY +===================== +== ABSTRACT_KEYWORD == +val ABSTRACT_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== FINAL_KEYWORD == +val FINAL_KEYWORD OPEN_KEYWORD = JetToken() +--------------------- +===================== +== OPEN_KEYWORD == +val OPEN_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== INTERNAL_KEYWORD == +val INTERNAL_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== PRIVATE_KEYWORD == +val PRIVATE_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== PROTECTED_KEYWORD == +val PROTECTED_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== PUBLIC_KEYWORD == +val PUBLIC_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== CLASS_KEYWORD == +val CLASS_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== ENUM_KEYWORD == +val ENUM_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== FUN_KEYWORD == +val FUN_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== GET_KEYWORD == +val GET_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== SET_KEYWORD == +val SET_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== TRAIT_KEYWORD == +val TRAIT_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== VAL_KEYWORD == +val VAL_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== VAR_KEYWORD == +val VAR_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== TYPE_KEYWORD == +val TYPE_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== IMPORT_KEYWORD == +val IMPORT_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== PACKAGE_KEYWORD == +val PACKAGE_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== OVERRIDE_KEYWORD == +val OVERRIDE_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== IN_KEYWORD == +val IN_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== OUT_KEYWORD == +val OUT_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== +== OBJECT_KEYWORD == +val OBJECT_KEYWORD = JetToken() +--------------------- +JetToken NEW() +JetToken() COPY +===================== diff --git a/compiler/testData/cfg/expressions/expressionAsFunction.values b/compiler/testData/cfg/expressions/expressionAsFunction.values new file mode 100644 index 00000000000..464cf2044af --- /dev/null +++ b/compiler/testData/cfg/expressions/expressionAsFunction.values @@ -0,0 +1,10 @@ +== invoke == +fun invoke(f: () -> Unit) { + (f)() +} +--------------------- +f NEW() +(f) NEW() +(f)() COPY +{ (f)() } COPY +===================== diff --git a/compiler/testData/cfg/expressions/nothingExpr.values b/compiler/testData/cfg/expressions/nothingExpr.values new file mode 100644 index 00000000000..a03a9daaf82 --- /dev/null +++ b/compiler/testData/cfg/expressions/nothingExpr.values @@ -0,0 +1,25 @@ +== doSomething == +fun Any?.doSomething() {} +--------------------- +===================== +== bar == +fun bar(): Nothing = throw Exception() +--------------------- +Exception NEW() +Exception() COPY +===================== +== foo == +fun foo() { + null!!.doSomething() + bar().doSomething +} +--------------------- +null NEW() +null!! NEW() +doSomething NEW() +doSomething() COPY +null!!.doSomething() COPY +doSomething NEW() +bar().doSomething COPY +{ null!!.doSomething() bar().doSomething } COPY +===================== diff --git a/compiler/testData/cfg/expressions/propertySafeCall.values b/compiler/testData/cfg/expressions/propertySafeCall.values new file mode 100644 index 00000000000..80da9017c57 --- /dev/null +++ b/compiler/testData/cfg/expressions/propertySafeCall.values @@ -0,0 +1,10 @@ +== test == +fun test(s: String?) { + s?.length +} +--------------------- +s NEW() +length NEW() +s?.length COPY +{ s?.length } COPY +===================== diff --git a/compiler/testData/cfg/expressions/qualifiedExpressionWithoutSelector.values b/compiler/testData/cfg/expressions/qualifiedExpressionWithoutSelector.values new file mode 100644 index 00000000000..8ac8e57cef1 --- /dev/null +++ b/compiler/testData/cfg/expressions/qualifiedExpressionWithoutSelector.values @@ -0,0 +1,9 @@ +== foo == +fun foo(s: String) { + s. +} +--------------------- +s NEW() +s. NEW() +{ s. } COPY +===================== diff --git a/compiler/testData/cfg/expressions/thisExpression.values b/compiler/testData/cfg/expressions/thisExpression.values new file mode 100644 index 00000000000..843b4eea493 --- /dev/null +++ b/compiler/testData/cfg/expressions/thisExpression.values @@ -0,0 +1,9 @@ +== foo == +fun Function0.foo() { + this() +} +--------------------- +this NEW() +this() COPY +{ this() } COPY +===================== diff --git a/compiler/testData/cfg/expressions/unresolvedCall.values b/compiler/testData/cfg/expressions/unresolvedCall.values new file mode 100644 index 00000000000..f77af8f2f14 --- /dev/null +++ b/compiler/testData/cfg/expressions/unresolvedCall.values @@ -0,0 +1,11 @@ +== test == +fun test(a: Any) { + a.foo() +} +--------------------- +a NEW() +foo NEW() +foo() COPY +a.foo() COPY +{ a.foo() } COPY +===================== diff --git a/compiler/testData/cfg/expressions/unresolvedProperty.values b/compiler/testData/cfg/expressions/unresolvedProperty.values new file mode 100644 index 00000000000..242d96f7738 --- /dev/null +++ b/compiler/testData/cfg/expressions/unresolvedProperty.values @@ -0,0 +1,10 @@ +== test == +fun test(a: Any) { + a.foo +} +--------------------- +a NEW() +foo NEW() +a.foo COPY +{ a.foo } COPY +===================== diff --git a/compiler/testData/cfg/expressions/unusedExpressionSimpleName.values b/compiler/testData/cfg/expressions/unusedExpressionSimpleName.values new file mode 100644 index 00000000000..21c1d285846 --- /dev/null +++ b/compiler/testData/cfg/expressions/unusedExpressionSimpleName.values @@ -0,0 +1,8 @@ +== main == +fun main(arg : Array) { + a +} +--------------------- +a NEW() +{ a } COPY +===================== diff --git a/compiler/testData/cfg/tailCalls/finally.values b/compiler/testData/cfg/tailCalls/finally.values new file mode 100644 index 00000000000..5caffa25f45 --- /dev/null +++ b/compiler/testData/cfg/tailCalls/finally.values @@ -0,0 +1,13 @@ +== test == +tailRecursive fun test() : Int { + try { + // do nothing + } finally { + test() + } +} +--------------------- +test NEW() +test() COPY +{ test() } COPY +===================== diff --git a/compiler/testData/cfg/tailCalls/finallyWithReturn.values b/compiler/testData/cfg/tailCalls/finallyWithReturn.values new file mode 100644 index 00000000000..fc2e3eb7d23 --- /dev/null +++ b/compiler/testData/cfg/tailCalls/finallyWithReturn.values @@ -0,0 +1,12 @@ +== test == +tailRecursive fun test() : Int { + try { + // do nothing + } finally { + return test() + } +} +--------------------- +test NEW() +test() COPY +===================== diff --git a/compiler/testData/cfg/tailCalls/sum.values b/compiler/testData/cfg/tailCalls/sum.values new file mode 100644 index 00000000000..c3050cd2100 --- /dev/null +++ b/compiler/testData/cfg/tailCalls/sum.values @@ -0,0 +1,25 @@ +== sum == +tailRecursive fun sum(x: Long, sum: Long): Long { + if (x == 0.toLong()) return sum + return sum(x - 1, sum + x) +} +--------------------- +x NEW() +== NEW(, ) +0 NEW() +toLong NEW() +toLong() COPY +0.toLong() COPY +x == 0.toLong() COPY +sum NEW() +sum NEW(, ) +x NEW() +- NEW(, ) +1 NEW() +x - 1 COPY +sum NEW() ++ NEW(, ) +x NEW() +sum + x COPY +sum(x - 1, sum + x) COPY +===================== diff --git a/compiler/testData/cfg/tailCalls/try.values b/compiler/testData/cfg/tailCalls/try.values new file mode 100644 index 00000000000..81f59ae06ac --- /dev/null +++ b/compiler/testData/cfg/tailCalls/try.values @@ -0,0 +1,12 @@ +== foo == +tailRecursive fun foo() { + try { + return foo() + } + catch (e: Throwable) { + } +} +--------------------- +foo NEW() +foo() COPY +===================== diff --git a/compiler/testData/cfg/tailCalls/tryCatchFinally.values b/compiler/testData/cfg/tailCalls/tryCatchFinally.values new file mode 100644 index 00000000000..d24e781370f --- /dev/null +++ b/compiler/testData/cfg/tailCalls/tryCatchFinally.values @@ -0,0 +1,23 @@ +== test == +fun test() : Unit { + try { + test() + } catch (any : Exception) { + test() + } finally { + test() + } +} +--------------------- +test NEW() +test() COPY +{ test() } COPY +test NEW() +test() COPY +{ test() } COPY +test NEW() +test() COPY +{ test() } COPY +try { test() } catch (any : Exception) { test() } finally { test() } NEW(, ) +{ try { test() } catch (any : Exception) { test() } finally { test() } } COPY +===================== diff --git a/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudoValueTest.kt b/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudoValueTest.kt new file mode 100644 index 00000000000..57ee5ef05ff --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudoValueTest.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.cfg + +import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue +import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl +import org.jetbrains.jet.lang.psi.JetElement +import org.jetbrains.jet.lang.psi.JetTreeVisitorVoid +import org.jetbrains.jet.lang.resolve.BindingContext +import java.util.* + +public abstract class AbstractPseudoValueTest : AbstractPseudocodeTest() { + override fun dumpInstructions(pseudocode: PseudocodeImpl, out: StringBuilder, bindingContext: BindingContext) { + fun getElementToValueMap(pseudocode: PseudocodeImpl): Map { + val elementToValues = LinkedHashMap() + pseudocode.getCorrespondingElement().accept(object : JetTreeVisitorVoid() { + override fun visitJetElement(element: JetElement) { + super.visitJetElement(element) + + val value = pseudocode.getElementValue(element) + if (value != null) { + elementToValues.put(element, value) + } + } + }) + return elementToValues + } + + fun maxLength(strings: Iterable): Int = strings.map { it.length }.max() ?: 0 + + fun elementText(element: JetElement): String = element.getText()!!.replaceAll("\\s+", " ") + + fun valueDescription(element: JetElement, value: PseudoValue): String { + return if (value.element != element) "COPY" else "NEW${value.createdAt.getInputValues().makeString(", ", "(", ")")}" + } + + val elementToValues = getElementToValueMap(pseudocode) + if (elementToValues.isEmpty()) return + + val elementColumnWidth = elementToValues.keySet().map { elementText(it).length() }.max()!! + val valueColumnWidth = elementToValues.values().map { it.debugName.length() }.max()!! + val valueDescColumnWidth = elementToValues.entrySet().map { valueDescription(it.key, it.value).length }.max()!! + + for ((element, value) in elementToValues.entrySet()) { + out + .append("%1$-${elementColumnWidth}s".format(elementText(element))) + .append(" ") + .append("%1$-${valueColumnWidth}s".format(value.debugName)) + .append(" ") + .append("%1$-${valueDescColumnWidth}s".format(valueDescription(element, value))) + .append("\n") + } + } + + override fun getDataFileExtension(): String? = "values" +} diff --git a/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudocodeTest.java b/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudocodeTest.java index 3214edce1e4..8f2f6bed20c 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudocodeTest.java +++ b/compiler/tests/org/jetbrains/jet/cfg/AbstractPseudocodeTest.java @@ -119,10 +119,14 @@ public abstract class AbstractPseudocodeTest extends KotlinTestWithEnvironment { checkPseudocode((PseudocodeImpl) pseudocode); } - File expectedInstructionsFile = JetTestUtils.replaceExtension(file, "instructions"); + File expectedInstructionsFile = JetTestUtils.replaceExtension(file, getDataFileExtension()); JetTestUtils.assertEqualsToFile(expectedInstructionsFile, instructionDump.toString()); } + protected String getDataFileExtension() { + return "instructions"; + } + protected void checkPseudocode(PseudocodeImpl pseudocode) { } diff --git a/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java new file mode 100644 index 00000000000..cbe2296d004 --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java @@ -0,0 +1,607 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.cfg; + +import junit.framework.Assert; +import junit.framework.Test; +import junit.framework.TestSuite; + +import java.io.File; +import java.util.regex.Pattern; +import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.test.InnerTestClasses; +import org.jetbrains.jet.test.TestMetadata; + +import org.jetbrains.jet.cfg.AbstractPseudoValueTest; + +/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@InnerTestClasses({PseudoValueTestGenerated.Cfg.class, PseudoValueTestGenerated.Cfg_variables.class}) +public class PseudoValueTestGenerated extends AbstractPseudoValueTest { + @TestMetadata("compiler/testData/cfg") + @InnerTestClasses({Cfg.Arrays.class, Cfg.Basic.class, Cfg.Bugs.class, Cfg.ControlStructures.class, Cfg.Conventions.class, Cfg.DeadCode.class, Cfg.Declarations.class, Cfg.Expressions.class, Cfg.TailCalls.class}) + public static class Cfg extends AbstractPseudoValueTest { + public void testAllFilesPresentInCfg() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("compiler/testData/cfg/arrays") + public static class Arrays extends AbstractPseudoValueTest { + public void testAllFilesPresentInArrays() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/arrays"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("ArrayAccess.kt") + public void testArrayAccess() throws Exception { + doTest("compiler/testData/cfg/arrays/ArrayAccess.kt"); + } + + @TestMetadata("arrayAccessExpression.kt") + public void testArrayAccessExpression() throws Exception { + doTest("compiler/testData/cfg/arrays/arrayAccessExpression.kt"); + } + + @TestMetadata("arrayInc.kt") + public void testArrayInc() throws Exception { + doTest("compiler/testData/cfg/arrays/arrayInc.kt"); + } + + @TestMetadata("ArrayOfFunctions.kt") + public void testArrayOfFunctions() throws Exception { + doTest("compiler/testData/cfg/arrays/ArrayOfFunctions.kt"); + } + + @TestMetadata("arraySet.kt") + public void testArraySet() throws Exception { + doTest("compiler/testData/cfg/arrays/arraySet.kt"); + } + + @TestMetadata("arraySetPlusAssign.kt") + public void testArraySetPlusAssign() throws Exception { + doTest("compiler/testData/cfg/arrays/arraySetPlusAssign.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/basic") + public static class Basic extends AbstractPseudoValueTest { + public void testAllFilesPresentInBasic() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/basic"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("Basic.kt") + public void testBasic() throws Exception { + doTest("compiler/testData/cfg/basic/Basic.kt"); + } + + @TestMetadata("EmptyFunction.kt") + public void testEmptyFunction() throws Exception { + doTest("compiler/testData/cfg/basic/EmptyFunction.kt"); + } + + @TestMetadata("ShortFunction.kt") + public void testShortFunction() throws Exception { + doTest("compiler/testData/cfg/basic/ShortFunction.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/bugs") + public static class Bugs extends AbstractPseudoValueTest { + public void testAllFilesPresentInBugs() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/bugs"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("jumpToOuterScope.kt") + public void testJumpToOuterScope() throws Exception { + doTest("compiler/testData/cfg/bugs/jumpToOuterScope.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/controlStructures") + public static class ControlStructures extends AbstractPseudoValueTest { + public void testAllFilesPresentInControlStructures() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/controlStructures"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("Finally.kt") + public void testFinally() throws Exception { + doTest("compiler/testData/cfg/controlStructures/Finally.kt"); + } + + @TestMetadata("FinallyTestCopy.kt") + public void testFinallyTestCopy() throws Exception { + doTest("compiler/testData/cfg/controlStructures/FinallyTestCopy.kt"); + } + + @TestMetadata("For.kt") + public void testFor() throws Exception { + doTest("compiler/testData/cfg/controlStructures/For.kt"); + } + + @TestMetadata("If.kt") + public void testIf() throws Exception { + doTest("compiler/testData/cfg/controlStructures/If.kt"); + } + + @TestMetadata("OnlyWhileInFunctionBody.kt") + public void testOnlyWhileInFunctionBody() throws Exception { + doTest("compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.kt"); + } + + @TestMetadata("returnsInWhen.kt") + public void testReturnsInWhen() throws Exception { + doTest("compiler/testData/cfg/controlStructures/returnsInWhen.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/conventions") + public static class Conventions extends AbstractPseudoValueTest { + public void testAllFilesPresentInConventions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/conventions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("equals.kt") + public void testEquals() throws Exception { + doTest("compiler/testData/cfg/conventions/equals.kt"); + } + + @TestMetadata("incrementAtTheEnd.kt") + public void testIncrementAtTheEnd() throws Exception { + doTest("compiler/testData/cfg/conventions/incrementAtTheEnd.kt"); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + doTest("compiler/testData/cfg/conventions/invoke.kt"); + } + + @TestMetadata("notEqual.kt") + public void testNotEqual() throws Exception { + doTest("compiler/testData/cfg/conventions/notEqual.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/deadCode") + public static class DeadCode extends AbstractPseudoValueTest { + public void testAllFilesPresentInDeadCode() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/deadCode"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("DeadCode.kt") + public void testDeadCode() throws Exception { + doTest("compiler/testData/cfg/deadCode/DeadCode.kt"); + } + + @TestMetadata("returnInElvis.kt") + public void testReturnInElvis() throws Exception { + doTest("compiler/testData/cfg/deadCode/returnInElvis.kt"); + } + + @TestMetadata("stringTemplate.kt") + public void testStringTemplate() throws Exception { + doTest("compiler/testData/cfg/deadCode/stringTemplate.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/declarations") + @InnerTestClasses({Declarations.ClassesAndObjects.class, Declarations.FunctionLiterals.class, Declarations.Functions.class, Declarations.Local.class, Declarations.MultiDeclaration.class, Declarations.Properties.class}) + public static class Declarations extends AbstractPseudoValueTest { + public void testAllFilesPresentInDeclarations() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("compiler/testData/cfg/declarations/classesAndObjects") + public static class ClassesAndObjects extends AbstractPseudoValueTest { + public void testAllFilesPresentInClassesAndObjects() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations/classesAndObjects"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("AnonymousInitializers.kt") + public void testAnonymousInitializers() throws Exception { + doTest("compiler/testData/cfg/declarations/classesAndObjects/AnonymousInitializers.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/declarations/functionLiterals") + public static class FunctionLiterals extends AbstractPseudoValueTest { + public void testAllFilesPresentInFunctionLiterals() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations/functionLiterals"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("unusedFunctionLiteral.kt") + public void testUnusedFunctionLiteral() throws Exception { + doTest("compiler/testData/cfg/declarations/functionLiterals/unusedFunctionLiteral.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/declarations/functions") + public static class Functions extends AbstractPseudoValueTest { + public void testAllFilesPresentInFunctions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations/functions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("FailFunction.kt") + public void testFailFunction() throws Exception { + doTest("compiler/testData/cfg/declarations/functions/FailFunction.kt"); + } + + @TestMetadata("typeParameter.kt") + public void testTypeParameter() throws Exception { + doTest("compiler/testData/cfg/declarations/functions/typeParameter.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/declarations/local") + public static class Local extends AbstractPseudoValueTest { + public void testAllFilesPresentInLocal() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations/local"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("localClass.kt") + public void testLocalClass() throws Exception { + doTest("compiler/testData/cfg/declarations/local/localClass.kt"); + } + + @TestMetadata("LocalDeclarations.kt") + public void testLocalDeclarations() throws Exception { + doTest("compiler/testData/cfg/declarations/local/LocalDeclarations.kt"); + } + + @TestMetadata("localProperty.kt") + public void testLocalProperty() throws Exception { + doTest("compiler/testData/cfg/declarations/local/localProperty.kt"); + } + + @TestMetadata("ObjectExpression.kt") + public void testObjectExpression() throws Exception { + doTest("compiler/testData/cfg/declarations/local/ObjectExpression.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/declarations/multiDeclaration") + public static class MultiDeclaration extends AbstractPseudoValueTest { + public void testAllFilesPresentInMultiDeclaration() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations/multiDeclaration"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("MultiDecl.kt") + public void testMultiDecl() throws Exception { + doTest("compiler/testData/cfg/declarations/multiDeclaration/MultiDecl.kt"); + } + + @TestMetadata("multiDeclarationWithError.kt") + public void testMultiDeclarationWithError() throws Exception { + doTest("compiler/testData/cfg/declarations/multiDeclaration/multiDeclarationWithError.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/declarations/properties") + public static class Properties extends AbstractPseudoValueTest { + public void testAllFilesPresentInProperties() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/declarations/properties"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("backingFieldAccess.kt") + public void testBackingFieldAccess() throws Exception { + doTest("compiler/testData/cfg/declarations/properties/backingFieldAccess.kt"); + } + + @TestMetadata("backingFieldQualifiedWithThis.kt") + public void testBackingFieldQualifiedWithThis() throws Exception { + doTest("compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.kt"); + } + + @TestMetadata("DelegatedProperty.kt") + public void testDelegatedProperty() throws Exception { + doTest("compiler/testData/cfg/declarations/properties/DelegatedProperty.kt"); + } + + } + + public static Test innerSuite() { + TestSuite suite = new TestSuite("Declarations"); + suite.addTestSuite(Declarations.class); + suite.addTestSuite(ClassesAndObjects.class); + suite.addTestSuite(FunctionLiterals.class); + suite.addTestSuite(Functions.class); + suite.addTestSuite(Local.class); + suite.addTestSuite(MultiDeclaration.class); + suite.addTestSuite(Properties.class); + return suite; + } + } + + @TestMetadata("compiler/testData/cfg/expressions") + public static class Expressions extends AbstractPseudoValueTest { + public void testAllFilesPresentInExpressions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/expressions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("assignmentToThis.kt") + public void testAssignmentToThis() throws Exception { + doTest("compiler/testData/cfg/expressions/assignmentToThis.kt"); + } + + @TestMetadata("Assignments.kt") + public void testAssignments() throws Exception { + doTest("compiler/testData/cfg/expressions/Assignments.kt"); + } + + @TestMetadata("chainedQualifiedExpression.kt") + public void testChainedQualifiedExpression() throws Exception { + doTest("compiler/testData/cfg/expressions/chainedQualifiedExpression.kt"); + } + + @TestMetadata("expressionAsFunction.kt") + public void testExpressionAsFunction() throws Exception { + doTest("compiler/testData/cfg/expressions/expressionAsFunction.kt"); + } + + @TestMetadata("LazyBooleans.kt") + public void testLazyBooleans() throws Exception { + doTest("compiler/testData/cfg/expressions/LazyBooleans.kt"); + } + + @TestMetadata("nothingExpr.kt") + public void testNothingExpr() throws Exception { + doTest("compiler/testData/cfg/expressions/nothingExpr.kt"); + } + + @TestMetadata("propertySafeCall.kt") + public void testPropertySafeCall() throws Exception { + doTest("compiler/testData/cfg/expressions/propertySafeCall.kt"); + } + + @TestMetadata("qualifiedExpressionWithoutSelector.kt") + public void testQualifiedExpressionWithoutSelector() throws Exception { + doTest("compiler/testData/cfg/expressions/qualifiedExpressionWithoutSelector.kt"); + } + + @TestMetadata("ReturnFromExpression.kt") + public void testReturnFromExpression() throws Exception { + doTest("compiler/testData/cfg/expressions/ReturnFromExpression.kt"); + } + + @TestMetadata("thisExpression.kt") + public void testThisExpression() throws Exception { + doTest("compiler/testData/cfg/expressions/thisExpression.kt"); + } + + @TestMetadata("unresolvedCall.kt") + public void testUnresolvedCall() throws Exception { + doTest("compiler/testData/cfg/expressions/unresolvedCall.kt"); + } + + @TestMetadata("unresolvedProperty.kt") + public void testUnresolvedProperty() throws Exception { + doTest("compiler/testData/cfg/expressions/unresolvedProperty.kt"); + } + + @TestMetadata("unusedExpressionSimpleName.kt") + public void testUnusedExpressionSimpleName() throws Exception { + doTest("compiler/testData/cfg/expressions/unusedExpressionSimpleName.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg/tailCalls") + public static class TailCalls extends AbstractPseudoValueTest { + public void testAllFilesPresentInTailCalls() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/tailCalls"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("finally.kt") + public void testFinally() throws Exception { + doTest("compiler/testData/cfg/tailCalls/finally.kt"); + } + + @TestMetadata("finallyWithReturn.kt") + public void testFinallyWithReturn() throws Exception { + doTest("compiler/testData/cfg/tailCalls/finallyWithReturn.kt"); + } + + @TestMetadata("sum.kt") + public void testSum() throws Exception { + doTest("compiler/testData/cfg/tailCalls/sum.kt"); + } + + @TestMetadata("try.kt") + public void testTry() throws Exception { + doTest("compiler/testData/cfg/tailCalls/try.kt"); + } + + @TestMetadata("tryCatchFinally.kt") + public void testTryCatchFinally() throws Exception { + doTest("compiler/testData/cfg/tailCalls/tryCatchFinally.kt"); + } + + } + + public static Test innerSuite() { + TestSuite suite = new TestSuite("Cfg"); + suite.addTestSuite(Cfg.class); + suite.addTestSuite(Arrays.class); + suite.addTestSuite(Basic.class); + suite.addTestSuite(Bugs.class); + suite.addTestSuite(ControlStructures.class); + suite.addTestSuite(Conventions.class); + suite.addTestSuite(DeadCode.class); + suite.addTest(Declarations.innerSuite()); + suite.addTestSuite(Expressions.class); + suite.addTestSuite(TailCalls.class); + return suite; + } + } + + @TestMetadata("compiler/testData/cfg-variables") + @InnerTestClasses({Cfg_variables.Basic.class, Cfg_variables.Bugs.class, Cfg_variables.LexicalScopes.class}) + public static class Cfg_variables extends AbstractPseudoValueTest { + public void testAllFilesPresentInCfg_variables() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg-variables"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("compiler/testData/cfg-variables/basic") + public static class Basic extends AbstractPseudoValueTest { + public void testAllFilesPresentInBasic() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg-variables/basic"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("IfWithUninitialized.kt") + public void testIfWithUninitialized() throws Exception { + doTest("compiler/testData/cfg-variables/basic/IfWithUninitialized.kt"); + } + + @TestMetadata("InitializedNotDeclared.kt") + public void testInitializedNotDeclared() throws Exception { + doTest("compiler/testData/cfg-variables/basic/InitializedNotDeclared.kt"); + } + + @TestMetadata("UsageInFunctionLiteral.kt") + public void testUsageInFunctionLiteral() throws Exception { + doTest("compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.kt"); + } + + @TestMetadata("VariablesInitialization.kt") + public void testVariablesInitialization() throws Exception { + doTest("compiler/testData/cfg-variables/basic/VariablesInitialization.kt"); + } + + @TestMetadata("VariablesUsage.kt") + public void testVariablesUsage() throws Exception { + doTest("compiler/testData/cfg-variables/basic/VariablesUsage.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg-variables/bugs") + public static class Bugs extends AbstractPseudoValueTest { + public void testAllFilesPresentInBugs() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg-variables/bugs"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("referenceToPropertyInitializer.kt") + public void testReferenceToPropertyInitializer() throws Exception { + doTest("compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.kt"); + } + + @TestMetadata("varInitializationInIf.kt") + public void testVarInitializationInIf() throws Exception { + doTest("compiler/testData/cfg-variables/bugs/varInitializationInIf.kt"); + } + + @TestMetadata("varInitializationInIfInCycle.kt") + public void testVarInitializationInIfInCycle() throws Exception { + doTest("compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.kt"); + } + + } + + @TestMetadata("compiler/testData/cfg-variables/lexicalScopes") + public static class LexicalScopes extends AbstractPseudoValueTest { + public void testAllFilesPresentInLexicalScopes() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg-variables/lexicalScopes"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("doWhileScope.kt") + public void testDoWhileScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/doWhileScope.kt"); + } + + @TestMetadata("forScope.kt") + public void testForScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/forScope.kt"); + } + + @TestMetadata("functionLiteralScope.kt") + public void testFunctionLiteralScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.kt"); + } + + @TestMetadata("ifScope.kt") + public void testIfScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/ifScope.kt"); + } + + @TestMetadata("localClass.kt") + public void testLocalClass() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/localClass.kt"); + } + + @TestMetadata("localFunctionScope.kt") + public void testLocalFunctionScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.kt"); + } + + @TestMetadata("localFunctionScopeWithoutBody.kt") + public void testLocalFunctionScopeWithoutBody() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.kt"); + } + + @TestMetadata("localObject.kt") + public void testLocalObject() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/localObject.kt"); + } + + @TestMetadata("objectLiteralScope.kt") + public void testObjectLiteralScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.kt"); + } + + @TestMetadata("propertyAccessorScope.kt") + public void testPropertyAccessorScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.kt"); + } + + @TestMetadata("tryScope.kt") + public void testTryScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/tryScope.kt"); + } + + @TestMetadata("whileScope.kt") + public void testWhileScope() throws Exception { + doTest("compiler/testData/cfg-variables/lexicalScopes/whileScope.kt"); + } + + } + + public static Test innerSuite() { + TestSuite suite = new TestSuite("Cfg_variables"); + suite.addTestSuite(Cfg_variables.class); + suite.addTestSuite(Basic.class); + suite.addTestSuite(Bugs.class); + suite.addTestSuite(LexicalScopes.class); + return suite; + } + } + + public static Test suite() { + TestSuite suite = new TestSuite("PseudoValueTestGenerated"); + suite.addTest(Cfg.innerSuite()); + suite.addTest(Cfg_variables.innerSuite()); + return suite; + } +} diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index b3eaa649ce1..61b03ab9152 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -112,6 +112,7 @@ import org.jetbrains.jet.plugin.debugger.evaluate.AbstractCodeFragmentCompletion import org.jetbrains.jet.plugin.debugger.evaluate.AbstractCodeFragmentHighlightingTest import org.jetbrains.jet.plugin.stubs.AbstractLazyResolveByStubTest import org.jetbrains.jet.plugin.stubs.AbstractMultiFileHighlightingTest +import org.jetbrains.jet.cfg.AbstractPseudoValueTest import org.jetbrains.jet.plugin.structureView.AbstractKotlinFileStructureTest fun main(args: Array) { @@ -247,6 +248,11 @@ fun main(args: Array) { model("cfg-variables") } + testClass(javaClass()) { + model("cfg") + model("cfg-variables") + } + testClass(javaClass()) { model("resolveAnnotations/parameters") }