Implement codegen for bound class reference expressions

- Inline the usage of ExpressionCodegen#generateClassLiteralReference into
  ClosureCodegen, simplify
- Support DoubleColonLHS.Expression in generateClassLiteralReference
- Substantially simplify KClass.java intrinsic by reusing
  generateClassLiteralReference

 #KT-13075 Fixed
 #KT-12995 In Progress
This commit is contained in:
Alexander Udalov
2016-07-14 17:09:33 +03:00
parent 28dc5d788c
commit 495ed13fce
8 changed files with 124 additions and 83 deletions
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun box(): String {
var x = 42
val k = (x++)::class.java
if (k != Int::class.java) return "Fail 1: $k"
if (x != 43) return "Fail 2: $x (side effect should have taken place)"
return "OK"
}
@@ -0,0 +1,17 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun box(): String {
assertEquals(true::class, Boolean::class)
assertEquals(42.toByte()::class, Byte::class)
assertEquals('z'::class, Char::class)
assertEquals(3.14::class, Double::class)
assertEquals(2.72f::class, Float::class)
// TODO: KT-13110
// assertEquals(42::class, Int::class)
assertEquals(42L::class, Long::class)
assertEquals(42.toShort()::class, Short::class)
return "OK"
}
@@ -0,0 +1,14 @@
fun box(): String {
var x = 42
val k1 = (x++)::class
if (k1 != Int::class) return "Fail 1: $k1"
if (x != 43) return "Fail 2: $x"
val k2 = { x *= 2; x }()::class
// Note that k2 is the class of the wrapper type java.lang.Integer
if (k2 != Integer::class) return "Fail 3: $k2"
if (x != 86) return "Fail 4: $x"
return "OK"
}
@@ -0,0 +1,5 @@
fun box(): String {
val x: CharSequence = ""
val klass = x::class
return if (klass == String::class) "OK" else "Fail: $klass"
}