Rewrote enum lowering to support usage from other modules.

- Split up enum lowering into two stages: descriptors creation and IR creation.
- Added link stage test.
- Enum.valueOf() uses binary search instead of linear.
This commit is contained in:
Igor Chevdar
2017-03-03 13:47:05 +03:00
parent bf65a78a93
commit 0ff306ad3a
10 changed files with 280 additions and 141 deletions
@@ -27,15 +27,26 @@ fun ThrowNoWhenBranchMatchedException(): Nothing {
@ExportForCppRuntime
internal fun TheEmptyString() = ""
fun <T: Enum<T>> valueOfForEnum(name: String, arr: Array<T>) : T
fun <T: Enum<T>> valueOfForEnum(name: String, values: Array<T>) : T
{
for (x in arr)
if (x.name == name)
return x
var left = 0
var right = values.size - 1
while (left <= right) {
val middle = (left + right) / 2
val x = values[middle].name.compareTo(name)
when {
x < 0 -> left = middle + 1
x > 0 -> right = middle - 1
else -> return values[middle]
}
}
throw Exception("Invalid enum name: $name")
}
fun <T: Enum<T>> valuesForEnum(values: Array<T>): Array<T>
{
return values.clone() as Array<T>
val result = Array<T?>(values.size, { null })
for (value in values)
result[value.ordinal] = value
return result as Array<T>
}