Add enumeration support. (#128)

* Add enumeration support.

* Enum classes lowering.

* merge fix

* merge fix

* used arrayOf from irModule

* changed lowering quant from body to file

* refactoring

* review fixes

* lowering for GET_OBJECT in enums

* enabled tests

* added tests

* moved tests to separate dir

* renamed test files

* moved phase up

* review fixes

* reformat
This commit is contained in:
Nikolay Igotti
2017-01-25 12:39:36 +03:00
committed by Igor Chevdar
parent 66293cb89f
commit c6a4ec2ff4
20 changed files with 774 additions and 26 deletions
+35
View File
@@ -296,6 +296,41 @@ task empty_substring(type: RunKonanTest) {
source = "runtime/basic/empty_substring.kt"
}
task enum0(type: RunKonanTest) {
goldValue = "VALUE\n"
source = "codegen/enum/test0.kt"
}
task enum1(type: RunKonanTest) {
goldValue = "z12\n"
source = "codegen/enum/test1.kt"
}
task enum_valueOf(type: RunKonanTest) {
goldValue = "E1\n"
source = "codegen/enum/valueOf.kt"
}
task enum_values(type: RunKonanTest) {
goldValue = "E2\n"
source = "codegen/enum/values.kt"
}
task enum_vCallNoEntryClass(type: RunKonanTest) {
goldValue = "('z3', 3)\n"
source = "codegen/enum/vCallNoEntryClass.kt"
}
task enum_vCallWithEntryClass(type: RunKonanTest) {
goldValue = "z1z2\n"
source = "codegen/enum/vCallWithEntryClass.kt"
}
task enum_companionObject(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/enum/companionObject.kt"
}
task array0(type: RunKonanTest) {
goldValue = "5\n6\n7\n8\n9\n10\n11\n12\n13\n"
source = "runtime/collections/array0.kt"
@@ -0,0 +1,24 @@
enum class Game {
ROCK,
PAPER,
SCISSORS;
companion object {
fun foo() = ROCK
val bar = PAPER
val values2 = values()
val scissors = valueOf("SCISSORS")
}
}
fun box(): String {
if (Game.foo() != Game.ROCK) return "Fail 1"
if (Game.bar != Game.PAPER) return "Fail 2: ${Game.bar}"
if (Game.values().size != 3) return "Fail 3"
if (Game.valueOf("SCISSORS") != Game.SCISSORS) return "Fail 4"
if (Game.values2.size != 3) return "Fail 5"
if (Game.scissors != Game.SCISSORS) return "Fail 6"
return "OK"
}
fun main(args: Array<String>) = println(box())
@@ -0,0 +1,9 @@
val TOP_LEVEL = 5
enum class MyEnum(value: Int) {
VALUE(TOP_LEVEL)
}
fun main(args: Array<String>) {
println(MyEnum.VALUE.toString())
}
@@ -0,0 +1,8 @@
enum class Zzz(val zzz: String, val x: Int) {
Z1("z1", 1),
Z2("z2", 2)
}
fun main(args: Array<String>) {
println(Zzz.Z1.zzz + Zzz.Z2.x)
}
@@ -0,0 +1,13 @@
enum class Zzz(val zzz: String, val x: Int) {
Z1("z1", 1),
Z2("z2", 2),
Z3("z3", 3);
override fun toString(): String{
return "('$zzz', $x)"
}
}
fun main(args: Array<String>) {
println(Zzz.Z3.toString())
}
@@ -0,0 +1,15 @@
enum class Zzz {
Z1 {
override fun f() = "z1"
},
Z2 {
override fun f() = "z2"
};
open fun f() = ""
}
fun main(args: Array<String>) {
println(Zzz.Z1.f() + Zzz.Z2.f())
}
@@ -0,0 +1,8 @@
enum class E {
E1,
E2
}
fun main(args: Array<String>) {
println(E.valueOf("E1").toString())
}
@@ -0,0 +1,8 @@
enum class E {
E1,
E2
}
fun main(args: Array<String>) {
println(E.values()[1].toString())
}
@@ -1,5 +1,5 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// IGNORE_BACKEND: JS
package test
@@ -1,5 +1,5 @@
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// IGNORE_BACKEND: JS
enum class IssueState {