Update box tests to 1.2.0-rc-39
This commit is contained in:
committed by
Pavel Punegov
parent
0121b6a185
commit
ffa1ffa659
@@ -33,7 +33,7 @@ repositories {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
cli_bc project(path: ':backend.native', configuration: 'cli_bc')
|
cli_bc project(path: ':backend.native', configuration: 'cli_bc')
|
||||||
update_tests (group: 'org', name: 'bt345', version: testDataVersion) {
|
update_tests (group: 'org', name: 'Kotlin_120_Compiler', version: testDataVersion) {
|
||||||
artifact {
|
artifact {
|
||||||
name = 'internal/kotlin-test-data'
|
name = 'internal/kotlin-test-data'
|
||||||
type = 'zip'
|
type = 'zip'
|
||||||
|
|||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
var result = "fail"
|
||||||
|
|
||||||
|
open class Base(val o: String, val k: String)
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val obj1 = object : Base(k = { result = "O"; "K"}() , o = {result += "K"; "O"}()) {}
|
||||||
|
|
||||||
|
if (result != "OK") return "fail $result"
|
||||||
|
return obj1.o + obj1.k
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
var result = "fail"
|
||||||
|
|
||||||
|
open class Base(val o: String, val k: String)
|
||||||
|
class Derived : Base(k = { result = "O"; "K"}() , o = {result += "K"; "O"}()) {}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val derived = Derived()
|
||||||
|
|
||||||
|
if (result != "OK") return "fail $result"
|
||||||
|
return derived.o + derived.k
|
||||||
|
}
|
||||||
Vendored
+54
@@ -0,0 +1,54 @@
|
|||||||
|
// NO_CHECK_LAMBDA_INLINING
|
||||||
|
// FILE: 1.kt
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// TARGET_BACKEND: NATIVE
|
||||||
|
package test
|
||||||
|
|
||||||
|
open class A(val value: String)
|
||||||
|
|
||||||
|
var invokeOrder = ""
|
||||||
|
|
||||||
|
inline fun inlineFun(
|
||||||
|
vararg constraints: A,
|
||||||
|
receiver: String = { invokeOrder += " default receiver"; "DEFAULT" }(),
|
||||||
|
init: String
|
||||||
|
): String {
|
||||||
|
return constraints.map { it.value }.joinToString() + ", " + receiver + ", " + init
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
|
||||||
|
var result = ""
|
||||||
|
fun box(): String {
|
||||||
|
|
||||||
|
result = ""
|
||||||
|
invokeOrder = ""
|
||||||
|
result = inlineFun(constraints = { invokeOrder += "constraints";A("C") }(),
|
||||||
|
receiver = { invokeOrder += " receiver"; "R" }(),
|
||||||
|
init = { invokeOrder += " init"; "I" }())
|
||||||
|
if (result != "C, R, I") return "fail 1: $result"
|
||||||
|
|
||||||
|
if (invokeOrder != "constraints receiver init") return "fail 2: $invokeOrder"
|
||||||
|
|
||||||
|
result = ""
|
||||||
|
invokeOrder = ""
|
||||||
|
result = inlineFun(init = { invokeOrder += "init"; "I" }(),
|
||||||
|
constraints = { invokeOrder += "constraints";A("C") }(),
|
||||||
|
receiver = { invokeOrder += " receiver"; "R" }()
|
||||||
|
)
|
||||||
|
if (result != "C, R, I") return "fail 3: $result"
|
||||||
|
//Change test after KT-17691 FIX
|
||||||
|
if (invokeOrder != "init receiverconstraints") return "fail 4: $invokeOrder"
|
||||||
|
|
||||||
|
result = ""
|
||||||
|
invokeOrder = ""
|
||||||
|
result = inlineFun(init = { invokeOrder += "init"; "I" }(),
|
||||||
|
constraints = { invokeOrder += " constraints";A("C") }())
|
||||||
|
if (result != "C, DEFAULT, I") return "fail 5: $result"
|
||||||
|
if (invokeOrder != "init constraints default receiver") return "fail 6: $invokeOrder"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
+1
@@ -45,6 +45,7 @@ fun testFloatArray() {
|
|||||||
}
|
}
|
||||||
throw AssertionError()
|
throw AssertionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testDoubleArray() {
|
fun testDoubleArray() {
|
||||||
DoubleArray(5) { i ->
|
DoubleArray(5) { i ->
|
||||||
if (i == 3) return
|
if (i == 3) return
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.*
|
||||||
import kotlin.test.assertFalse
|
|
||||||
import kotlin.test.assertEquals
|
|
||||||
import kotlin.test.assertFails
|
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
assertTrue(eqBoolean(booleanArrayOf(false), BooleanArray(1)))
|
assertTrue(eqBoolean(booleanArrayOf(false), BooleanArray(1)))
|
||||||
|
|||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
inline fun ltx(a: Comparable<Any>, b: Any) = a < b
|
||||||
|
inline fun lex(a: Comparable<Any>, b: Any) = a <= b
|
||||||
|
inline fun gex(a: Comparable<Any>, b: Any) = a >= b
|
||||||
|
inline fun gtx(a: Comparable<Any>, b: Any) = a > b
|
||||||
|
|
||||||
|
inline fun lt(a: Any, b: Any) = ltx(a as Comparable<Any>, b)
|
||||||
|
inline fun le(a: Any, b: Any) = lex(a as Comparable<Any>, b)
|
||||||
|
inline fun ge(a: Any, b: Any) = gex(a as Comparable<Any>, b)
|
||||||
|
inline fun gt(a: Any, b: Any) = gtx(a as Comparable<Any>, b)
|
||||||
|
|
||||||
|
val ONE = 1
|
||||||
|
val ONEL = 1L
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return when {
|
||||||
|
!lt(ONE, 42) -> "Fail 1 LT"
|
||||||
|
lt(42, ONE) -> "Fail 2 LT"
|
||||||
|
|
||||||
|
!le(ONE, 42) -> "Fail 1 LE"
|
||||||
|
le(42, ONE) -> "Fail 2 LE"
|
||||||
|
!le(1, ONE) -> "Fail 3 LE"
|
||||||
|
|
||||||
|
!ge(42, ONE) -> "Fail 1 GE"
|
||||||
|
ge(ONE, 42) -> "Fail 2 GE"
|
||||||
|
!ge(1, ONE) -> "Fail 3 GE"
|
||||||
|
|
||||||
|
gt(ONE, 42) -> "Fail 1 GT"
|
||||||
|
!gt(42, ONE) -> "Fail 2 GT"
|
||||||
|
|
||||||
|
!lt(ONEL, 42L) -> "Fail 1 LT L"
|
||||||
|
lt(42L, ONEL) -> "Fail 2 LT L"
|
||||||
|
|
||||||
|
!le(ONEL, 42L) -> "Fail 1 LE L"
|
||||||
|
le(42L, ONEL) -> "Fail 2 LE L"
|
||||||
|
!le(ONEL, 1L) -> "Fail 3 LE L"
|
||||||
|
|
||||||
|
!ge(42L, ONEL) -> "Fail 1 GE L"
|
||||||
|
ge(ONEL, 42L) -> "Fail 2 GE L"
|
||||||
|
!ge(ONEL, 1L) -> "Fail 3 GE L"
|
||||||
|
|
||||||
|
gt(ONEL, 42L) -> "Fail 1 GT L"
|
||||||
|
!gt(42L, ONEL) -> "Fail 2 GT L"
|
||||||
|
|
||||||
|
else -> "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
inline fun eq(a: Any, b: Any) = a == b
|
||||||
|
inline fun ne(a: Any, b: Any) = a != b
|
||||||
|
|
||||||
|
val ONE = 1
|
||||||
|
val ONEL = 1L
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return when {
|
||||||
|
eq(ONE, 2) -> "Fail 1"
|
||||||
|
!eq(ONE, 1) -> "Fail 2"
|
||||||
|
!ne(ONE, 2) -> "Fail 3"
|
||||||
|
ne(ONE, 1) -> "Fail 4"
|
||||||
|
|
||||||
|
eq(ONEL, 42L) -> "Fail 1L"
|
||||||
|
!eq(ONEL, 1L) -> "Fail 2L"
|
||||||
|
!ne(ONEL, 42L) -> "Fail 3L"
|
||||||
|
ne(ONEL, 1L) -> "Fail 4L"
|
||||||
|
|
||||||
|
else -> "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|
||||||
|
inline fun ltx(a: Comparable<Any>, b: Any) = a < b
|
||||||
|
inline fun lex(a: Comparable<Any>, b: Any) = a <= b
|
||||||
|
inline fun gex(a: Comparable<Any>, b: Any) = a >= b
|
||||||
|
inline fun gtx(a: Comparable<Any>, b: Any) = a > b
|
||||||
|
|
||||||
|
inline fun lt(a: Any, b: Any) = ltx(a as Comparable<Any>, b)
|
||||||
|
inline fun le(a: Any, b: Any) = lex(a as Comparable<Any>, b)
|
||||||
|
inline fun ge(a: Any, b: Any) = gex(a as Comparable<Any>, b)
|
||||||
|
inline fun gt(a: Any, b: Any) = gtx(a as Comparable<Any>, b)
|
||||||
|
|
||||||
|
val PLUS0F = 0.0F
|
||||||
|
val MINUS0F = -0.0F
|
||||||
|
val PLUS0D = 0.0
|
||||||
|
val MINUS0D = -0.0
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return when {
|
||||||
|
!lt(1.0F, 42.0F) -> "Fail 1 LT F"
|
||||||
|
lt(42.0F, 1.0F) -> "Fail 2 LT F"
|
||||||
|
|
||||||
|
!le(1.0F, 42.0F) -> "Fail 1 LE F"
|
||||||
|
le(42.0F, 1.0F) -> "Fail 2 LE F"
|
||||||
|
!le(1.0F, 1.0F) -> "Fail 3 LE F"
|
||||||
|
|
||||||
|
!ge(42.0F, 1.0F) -> "Fail 1 GE F"
|
||||||
|
ge(1.0F, 42.0F) -> "Fail 2 GE F"
|
||||||
|
!ge(1.0F, 1.0F) -> "Fail 3 GE F"
|
||||||
|
|
||||||
|
gt(1.0F, 42.0F) -> "Fail 1 GT F"
|
||||||
|
!gt(42.0F, 1.0F) -> "Fail 2 GT F"
|
||||||
|
|
||||||
|
!lt(1.0, 42.0) -> "Fail 1 LT D"
|
||||||
|
lt(42.0, 1.0) -> "Fail 2 LT D"
|
||||||
|
|
||||||
|
!le(1.0, 42.0) -> "Fail 1 LE D"
|
||||||
|
le(42.0, 1.0) -> "Fail 2 LE D"
|
||||||
|
!le(1.0, 1.0) -> "Fail 3 LE D"
|
||||||
|
|
||||||
|
!ge(42.0, 1.0) -> "Fail 1 GE D"
|
||||||
|
ge(1.0, 42.0) -> "Fail 2 GE D"
|
||||||
|
!ge(1.0, 1.0) -> "Fail 3 GE D"
|
||||||
|
|
||||||
|
gt(1.0, 42.0) -> "Fail 1 GT D"
|
||||||
|
!gt(42.0, 1.0) -> "Fail 2 GT D"
|
||||||
|
|
||||||
|
!lt(MINUS0F, PLUS0F) -> "Fail 1 LT +-0 F"
|
||||||
|
lt(PLUS0F, MINUS0F) -> "Fail 2 LT +-0 F"
|
||||||
|
|
||||||
|
!le(MINUS0F, PLUS0F) -> "Fail 1 LE +-0 F"
|
||||||
|
le(PLUS0F, MINUS0F) -> "Fail 2 LE +-0 F"
|
||||||
|
!le(MINUS0F, MINUS0F) -> "Fail 3 LE +-0 F"
|
||||||
|
!le(PLUS0F, PLUS0F) -> "Fail 3 LE +-0 F"
|
||||||
|
|
||||||
|
ge(MINUS0F, PLUS0F) -> "Fail 1 GE +-0 F"
|
||||||
|
!ge(PLUS0F, MINUS0F) -> "Fail 2 GE +-0 F"
|
||||||
|
!ge(MINUS0F, MINUS0F) -> "Fail 3 GE +-0 F"
|
||||||
|
!ge(PLUS0F, PLUS0F) -> "Fail 3 GE +-0 F"
|
||||||
|
|
||||||
|
gt(MINUS0F, PLUS0F) -> "Fail 1 GT +-0 F"
|
||||||
|
!gt(PLUS0F, MINUS0F) -> "Fail 2 GT +-0 F"
|
||||||
|
|
||||||
|
!lt(MINUS0D, PLUS0D) -> "Fail 1 LT +-0 D"
|
||||||
|
lt(PLUS0D, MINUS0D) -> "Fail 2 LT +-0 D"
|
||||||
|
|
||||||
|
!le(MINUS0D, PLUS0D) -> "Fail 1 LE +-0 D"
|
||||||
|
le(PLUS0D, MINUS0D) -> "Fail 2 LE +-0 D"
|
||||||
|
!le(MINUS0D, MINUS0D) -> "Fail 3 LE +-0 D"
|
||||||
|
!le(PLUS0D, PLUS0D) -> "Fail 3 LE +-0 D"
|
||||||
|
|
||||||
|
ge(MINUS0D, PLUS0D) -> "Fail 1 GE +-0 D"
|
||||||
|
!ge(PLUS0D, MINUS0D) -> "Fail 2 GE +-0 D"
|
||||||
|
!ge(MINUS0D, MINUS0D) -> "Fail 3 GE +-0 D"
|
||||||
|
!ge(PLUS0D, PLUS0D) -> "Fail 3 GE +-0 D"
|
||||||
|
|
||||||
|
gt(MINUS0D, PLUS0D) -> "Fail 1 GT +-0 D"
|
||||||
|
!gt(PLUS0D, MINUS0D) -> "Fail 2 GT +-0 D"
|
||||||
|
|
||||||
|
else -> "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun box(): String {
|
||||||
|
val a: Any = 1
|
||||||
|
val b: Any = 42
|
||||||
|
val test = (a as Comparable<Any>).compareTo(b)
|
||||||
|
if (test != -1) return "Fail: $test"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
|
fun test(a: Any) = when (a::class) {
|
||||||
|
String::class -> "String"
|
||||||
|
Int::class -> "Int"
|
||||||
|
Boolean::class -> "Boolean"
|
||||||
|
else -> "Else"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val s = ""
|
||||||
|
val i = 0
|
||||||
|
val b = false
|
||||||
|
|
||||||
|
if (test(s) != "String") return "Fail 1"
|
||||||
|
if (test(i) != "Int") return "Fail 2"
|
||||||
|
if (test(b) != "Boolean") return "Fail 3"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
42.doSwitchInt()
|
||||||
|
"".doSwitchString()
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified E> E.doSwitchInt(): String = when (E::class) {
|
||||||
|
Int::class -> "success!"
|
||||||
|
else -> throw AssertionError()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified E> E.doSwitchString(): String = when(E::class) {
|
||||||
|
String::class -> "success!"
|
||||||
|
else -> throw AssertionError()
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
fun foo(p: Int?): Boolean {
|
||||||
|
return M<Int>(p)?.nulled() == 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo2(p: Int?): Boolean {
|
||||||
|
return 1 == M<Int>(p)?.nulled()
|
||||||
|
}
|
||||||
|
|
||||||
|
class M<T: Any>(val z: T?) {
|
||||||
|
fun nulled(): T? = z
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if (foo(null)) return "fail 1"
|
||||||
|
if (!foo(1)) return "fail 2"
|
||||||
|
|
||||||
|
if (foo2(null)) return "fail 1"
|
||||||
|
if (!foo2(1)) return "fail 2"
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
//WITH_RUNTIME
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val map: Map<String, Boolean>? = mapOf()
|
||||||
|
return if (map?.get("") == true) "fail" else "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|
||||||
|
// FILE: M.java
|
||||||
|
|
||||||
|
public class M {
|
||||||
|
private final Integer value;
|
||||||
|
|
||||||
|
public M(Integer value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer nulled() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// FILE: Kotlin.kt
|
||||||
|
fun foo(p: Int?): Boolean {
|
||||||
|
return M(p)?.nulled() == 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo2(p: Int?): Boolean {
|
||||||
|
return 1 == M(p)?.nulled()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if (foo(null)) return "fail 1"
|
||||||
|
if (!foo(1)) return "fail 2"
|
||||||
|
|
||||||
|
if (foo2(null)) return "fail 1"
|
||||||
|
if (!foo2(1)) return "fail 2"
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
fun foo(p: Int?): Boolean {
|
||||||
|
return M<Int>(p)?.chain()?.nulled() == 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo2(p: Int?): Boolean {
|
||||||
|
return 1 == M<Int>(p)?.chain()?.nulled()
|
||||||
|
}
|
||||||
|
|
||||||
|
class M<T: Any>(val z: T?) {
|
||||||
|
fun nulled(): T? = z
|
||||||
|
|
||||||
|
fun chain(): M<T>? = this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if (foo(null)) return "fail 1"
|
||||||
|
if (!foo(1)) return "fail 2"
|
||||||
|
|
||||||
|
if (foo2(null)) return "fail 1"
|
||||||
|
if (!foo2(1)) return "fail 2"
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val intList = listOf(1, 2, 3)
|
||||||
|
val longList = listOf(1L, 2L, 3L)
|
||||||
|
|
||||||
|
val intListMin = intList.minBy { it }
|
||||||
|
if (intListMin != 1) return "Fail intListMin=$intListMin"
|
||||||
|
|
||||||
|
val intListMax = intList.maxBy { it }
|
||||||
|
if (intListMax != 3) return "Fail intListMax=$intListMax"
|
||||||
|
|
||||||
|
val longListMin = longList.minBy { it }
|
||||||
|
if (longListMin != 1L) return "Fail longListMin=$longListMin"
|
||||||
|
|
||||||
|
val longListMax = longList.maxBy { it }
|
||||||
|
if (longListMax != 3L) return "Fail longListMax=$longListMax"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
class A {
|
||||||
|
fun memberFunction() { result += "A.mf," }
|
||||||
|
fun aMemberFunction() { result += "A.amf," }
|
||||||
|
val memberProperty: Int get() = 42.also { result += "A.mp," }
|
||||||
|
val aMemberProperty: Int get() = 42.also { result += "A.amp," }
|
||||||
|
|
||||||
|
fun test(): String {
|
||||||
|
(::memberFunction)()
|
||||||
|
(::aExtensionFunction)()
|
||||||
|
|
||||||
|
(::memberProperty)()
|
||||||
|
(::aExtensionProperty)()
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class B {
|
||||||
|
fun memberFunction() { result += "B.mf," }
|
||||||
|
val memberProperty: Int get() = 42.also { result += "B.mp," }
|
||||||
|
|
||||||
|
fun test(): String {
|
||||||
|
(::aMemberFunction)()
|
||||||
|
(::aExtensionFunction)()
|
||||||
|
|
||||||
|
(::aMemberProperty)()
|
||||||
|
(::aExtensionProperty)()
|
||||||
|
|
||||||
|
(::memberFunction)()
|
||||||
|
(::memberProperty)()
|
||||||
|
|
||||||
|
(::bExtensionFunction)()
|
||||||
|
(::bExtensionProperty)()
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun A.aExtensionFunction() { result += "A.ef," }
|
||||||
|
val A.aExtensionProperty: Int get() = 42.also { result += "A.ep," }
|
||||||
|
fun A.B.bExtensionFunction() { result += "B.ef," }
|
||||||
|
val A.B.bExtensionProperty: Int get() = 42.also { result += "B.ep," }
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val a = A().test()
|
||||||
|
if (a != "A.mf,A.ef,A.mp,A.ep,") return "Fail $a"
|
||||||
|
|
||||||
|
result = ""
|
||||||
|
val b = A().B().test()
|
||||||
|
if (b != "A.amf,A.ef,A.amp,A.ep,B.mf,B.mp,B.ef,B.ep,") return "Fail $b"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+2
-1
@@ -3,7 +3,8 @@
|
|||||||
|
|
||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
|
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.KMutableProperty1
|
||||||
|
import kotlin.reflect.full.*
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
var prop = 42
|
var prop = 42
|
||||||
|
|||||||
Vendored
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
|
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.full.*
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
fun foo() {}
|
fun foo() {}
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
fun foo(): Unit {}
|
||||||
|
assert(Unit.javaClass.equals(foo().javaClass))
|
||||||
|
assert(Unit.javaClass.equals(foo()::class.java))
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
abstract class A {
|
||||||
|
inner class InnerInA {
|
||||||
|
fun returnOk() = "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : A()
|
||||||
|
|
||||||
|
fun foo(a: A): String {
|
||||||
|
if (a is B) {
|
||||||
|
val v = a::InnerInA
|
||||||
|
return v().returnOk()
|
||||||
|
}
|
||||||
|
|
||||||
|
return "error"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return foo(B())
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
fun box(): String {
|
||||||
|
val n: Any? = null
|
||||||
|
|
||||||
|
val intV: Any? = 23
|
||||||
|
val floatV: Any? = 23.4F
|
||||||
|
val doubleV: Any? = 23.45
|
||||||
|
val longV: Any? = 234L
|
||||||
|
val stringV: Any? = "foo"
|
||||||
|
val booleanV: Any? = true
|
||||||
|
val functionV: Any? = { x: Int -> x + 1 }
|
||||||
|
|
||||||
|
if (n !is Int?) return "fail: null !is Int?"
|
||||||
|
if (n !is Float?) return "fail: null !is Float?"
|
||||||
|
if (n !is Double?) return "fail: null !is Double?"
|
||||||
|
if (n !is String?) return "fail: null !is String?"
|
||||||
|
if (n !is Boolean?) return "fail: null !is Boolean?"
|
||||||
|
if (n !is Function1<*, *>?) return "fail: null !is Function?"
|
||||||
|
|
||||||
|
if (n is Int) return "fail: null is Int"
|
||||||
|
if (n is Float) return "fail: null is Float"
|
||||||
|
if (n is Double) return "fail: null is Double"
|
||||||
|
if (n is String) return "fail: null is String"
|
||||||
|
if (n is Boolean) return "fail: null is Boolean"
|
||||||
|
if (n is Function1<*, *>) return "fail: null is Function"
|
||||||
|
|
||||||
|
if (intV !is Int?) return "fail: 23 !is Int?"
|
||||||
|
if (intV is String?) return "fail: 23 is String?"
|
||||||
|
|
||||||
|
if (floatV !is Float?) return "fail: 23.4F !is Float?"
|
||||||
|
if (floatV is String?) return "fail: 23.4F is String?"
|
||||||
|
|
||||||
|
if (doubleV !is Double?) return "fail: 23.45 !is Double?"
|
||||||
|
if (doubleV is String?) return "fail: 23.45 is String?"
|
||||||
|
|
||||||
|
if (longV !is Long?) return "fail: 234L !is Long?"
|
||||||
|
if (longV is String?) return "fail: 234L is String?"
|
||||||
|
|
||||||
|
if (stringV !is String?) return "fail: 'foo' !is String?"
|
||||||
|
if (stringV is Double?) return "fail: 'foo' is Double?"
|
||||||
|
|
||||||
|
if (booleanV !is Boolean?) return "fail: true !is Boolean?"
|
||||||
|
if (booleanV is Double?) return "fail: true is Double?"
|
||||||
|
|
||||||
|
if (functionV !is Function1<*, *>?) return "fail: <function> !is Function?"
|
||||||
|
if (functionV is String?) return "fail: <function> is String?"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -1,6 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JS
|
|
||||||
// JS backend does not support Unit well. See KT-13932
|
|
||||||
|
|
||||||
val foo: () -> Unit = {}
|
val foo: () -> Unit = {}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
|
||||||
// IGNORE_BACKEND: JS
|
|
||||||
|
|
||||||
fun println(s: String) {
|
fun println(s: String) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
|
||||||
// IGNORE_BACKEND: JS
|
|
||||||
|
|
||||||
fun println(s: String) {
|
fun println(s: String) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
class A
|
||||||
|
|
||||||
|
class B
|
||||||
|
|
||||||
|
class C
|
||||||
|
|
||||||
|
fun foo(parameters: Any?): Any? {
|
||||||
|
var payload: Any? = null
|
||||||
|
|
||||||
|
if (parameters != null) {
|
||||||
|
if (parameters is A || parameters is B) {
|
||||||
|
payload = parameters
|
||||||
|
} else {
|
||||||
|
payload = "O"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (payload is String) {
|
||||||
|
payload += "K"
|
||||||
|
}
|
||||||
|
|
||||||
|
return payload
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String =
|
||||||
|
"${foo(C())}"
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
enum class ResultType constructor(val reason: String) {
|
||||||
|
SOMETHING("123"),
|
||||||
|
OK("OK"),
|
||||||
|
UNKNOWN("FAIL");
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun getByVal(reason: String): ResultType {
|
||||||
|
return ResultType.values().firstOrDefault({ it.reason == reason }, UNKNOWN)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> Array<out T>.firstOrDefault(predicate: (T) -> Boolean, default: T): T {
|
||||||
|
return firstOrNull(predicate) ?: default
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String = ResultType.getByVal("OK").reason
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class Host {
|
||||||
|
val ok = "OK"
|
||||||
|
|
||||||
|
fun foo() = run { bar(ok) }
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val ok = 0
|
||||||
|
|
||||||
|
fun bar(s: String) = s.substring(ok)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Host().foo()
|
||||||
@@ -1,7 +1,3 @@
|
|||||||
// TODO: Enable for JS when it supports Java class library.
|
|
||||||
// IGNORE_BACKEND: JS
|
|
||||||
// fails on JS with TypeError: imported$plus is not a function, it is undefined.
|
|
||||||
|
|
||||||
operator fun <K, V> MutableMap<K, V>.set(key : K, value : V) = put(key, value)
|
operator fun <K, V> MutableMap<K, V>.set(key : K, value : V) = put(key, value)
|
||||||
|
|
||||||
fun box() : String {
|
fun box() : String {
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// IGNORE_BACKEND: JS
|
||||||
|
|
||||||
|
class `A!u00A0`() {
|
||||||
|
val ok = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return `A!u00A0`().ok
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||||
// IGNORE_BACKEND: JS, NATIVE
|
// IGNORE_BACKEND: NATIVE
|
||||||
|
|
||||||
object A {
|
object A {
|
||||||
const val a: String = "$"
|
const val a: String = "$"
|
||||||
@@ -7,7 +7,7 @@ object A {
|
|||||||
const val c = 10000
|
const val c = 10000
|
||||||
|
|
||||||
val bNonConst = "1234$a"
|
val bNonConst = "1234$a"
|
||||||
val bNullable: String = "1234$a"
|
val bNullable: String? = "1234$a"
|
||||||
}
|
}
|
||||||
|
|
||||||
object B {
|
object B {
|
||||||
@@ -16,7 +16,7 @@ object B {
|
|||||||
const val c = 10000
|
const val c = 10000
|
||||||
|
|
||||||
val bNonConst = "1234$a"
|
val bNonConst = "1234$a"
|
||||||
val bNullable: String = "1234$a"
|
val bNullable: String? = "1234$a"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
@@ -26,8 +26,8 @@ fun box(): String {
|
|||||||
|
|
||||||
if (A.c !== B.c) return "Fail 3: A.c !== B.c"
|
if (A.c !== B.c) return "Fail 3: A.c !== B.c"
|
||||||
|
|
||||||
if (A.bNonConst === B.bNonConst) return "Fail 5: A.bNonConst == B.bNonConst"
|
if (A.bNonConst !== B.bNonConst) return "Fail 4: A.bNonConst !== B.bNonConst"
|
||||||
if (A.bNullable === B.bNullable) return "Fail 6: A.bNullable == B.bNullable"
|
if (A.bNullable !== B.bNullable) return "Fail 5: A.bNullable !== B.bNullable"
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||||
|
// IGNORE_BACKEND: JS
|
||||||
|
// LANGUAGE_VERSION: 1.0
|
||||||
|
|
||||||
|
object A {
|
||||||
|
const val a: String = "$"
|
||||||
|
const val b = "1234$a"
|
||||||
|
const val c = 10000
|
||||||
|
|
||||||
|
val bNonConst = "1234$a"
|
||||||
|
val bNullable: String? = "1234$a"
|
||||||
|
}
|
||||||
|
|
||||||
|
object B {
|
||||||
|
const val a: String = "$"
|
||||||
|
const val b = "1234$a"
|
||||||
|
const val c = 10000
|
||||||
|
|
||||||
|
val bNonConst = "1234$a"
|
||||||
|
val bNullable: String? = "1234$a"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if (A.a !== B.a) return "Fail 1: A.a !== B.a"
|
||||||
|
|
||||||
|
if (A.b !== B.b) return "Fail 2: A.b !== B.b"
|
||||||
|
|
||||||
|
if (A.c !== B.c) return "Fail 3: A.c !== B.c"
|
||||||
|
|
||||||
|
if (A.bNonConst === B.bNonConst) return "Fail 4: A.bNonConst === B.bNonConst"
|
||||||
|
if (A.bNullable === B.bNullable) return "Fail 5: A.bNullable === B.bNullable"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
var count = 0
|
||||||
|
while (true) {
|
||||||
|
Foo(
|
||||||
|
logged("i", if (count == 0) 1 else break),
|
||||||
|
logged("j", 2)
|
||||||
|
)
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ij<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+40
@@ -0,0 +1,40 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
var count = 0
|
||||||
|
while (true) {
|
||||||
|
count++
|
||||||
|
if (count > 1) break
|
||||||
|
Foo(
|
||||||
|
logged("i", if (count == 1) 1 else continue),
|
||||||
|
logged("j", 2)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ij<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
inline fun ok(): String {
|
||||||
|
return foo(1, 1.0, 1.0f, 1L, "O", C(if (bar()) return "zap" else "K"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val ok = ok()
|
||||||
|
if (ok != "OK") return "Fail: $ok"
|
||||||
|
|
||||||
|
val r = log.toString()
|
||||||
|
if (r != "<clinit>;bar;<init>;foo;") return "Fail: '$r'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: C.kt
|
||||||
|
class C(val str: String) {
|
||||||
|
init {
|
||||||
|
log.append("<init>;")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>;")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
fun foo(x: Int, a: Double, b: Float, y: Long, z: String, c: C) =
|
||||||
|
logged("foo;", z + c.str)
|
||||||
|
|
||||||
|
fun bar() = logged("bar;", false)
|
||||||
|
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Foo(
|
||||||
|
logged("i", 1.let { it }),
|
||||||
|
logged("j",
|
||||||
|
Foo(
|
||||||
|
logged("k", 2.let { it }),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ik<init>j<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Foo?) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// KOTLIN_CONFIGURATION_FLAGS: CONSTRUCTOR_CALL_NORMALIZATION_MODE=disable
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Foo(
|
||||||
|
logged("i", 1.let { it }),
|
||||||
|
logged("j",
|
||||||
|
Foo(
|
||||||
|
logged("k", 2.let { it }),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ik<init>j<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Foo?) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// KOTLIN_CONFIGURATION_FLAGS: CONSTRUCTOR_CALL_NORMALIZATION_MODE=enable
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Foo(
|
||||||
|
logged("i", 1.let { it }),
|
||||||
|
logged("j",
|
||||||
|
Foo(
|
||||||
|
logged("k", 2.let { it }),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "ik<clinit><init>j<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Foo?) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// KOTLIN_CONFIGURATION_FLAGS: CONSTRUCTOR_CALL_NORMALIZATION_MODE=preserve-class-initialization
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Foo(
|
||||||
|
logged("i", 1.let { it }),
|
||||||
|
logged("j",
|
||||||
|
Foo(
|
||||||
|
logged("k", 2.let { it }),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ik<init>j<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Foo?) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+43
@@ -0,0 +1,43 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Outer().Inner(
|
||||||
|
logged("i;", 1.let { it }),
|
||||||
|
logged("j;", 2.let { it })
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "Foo.<clinit>;i;j;Foo.<init>;Inner.<init>;") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
open class Foo {
|
||||||
|
init {
|
||||||
|
log.append("Foo.<init>;")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("Foo.<clinit>;")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
inner class Inner(val x: Int, val y: Int) : Foo() {
|
||||||
|
init {
|
||||||
|
log.append("Inner.<init>;")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
class Local(val i: Int, val j: Int) : Foo() {
|
||||||
|
init {
|
||||||
|
log.append("Local.<init>;")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Local(
|
||||||
|
logged("i;", 1.let { it }),
|
||||||
|
logged("j;", 2.let { it })
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "Foo.<clinit>;i;j;Foo.<init>;Local.<init>;") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
open class Foo {
|
||||||
|
init {
|
||||||
|
log.append("Foo.<init>;")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("Foo.<clinit>;")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
for (count in 0..3) {
|
||||||
|
val test = Foo(count, Foo(1, "x", 2), if (count > 0) break else 3)
|
||||||
|
if (count > 0) return "Fail: count = $count"
|
||||||
|
if (test.toString() != "Foo(0,Foo(1,x,2),3)") return "Fail: ${test.toString()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(val a: Int, val b: Any, val c: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString() = "Foo($a,$b,$c)"
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+43
@@ -0,0 +1,43 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
run L1@{
|
||||||
|
var count = 0
|
||||||
|
run {
|
||||||
|
while (true) {
|
||||||
|
Foo(
|
||||||
|
logged("i", if (count == 0) 1 else return@L1),
|
||||||
|
logged("j", 2)
|
||||||
|
)
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ij<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
for (count in 0..3) {
|
||||||
|
val test = Foo(count, Foo(1, "x", if (count > 0) break else 2), 3)
|
||||||
|
if (count > 0) return "Fail: count = $count"
|
||||||
|
if (test.toString() != "Foo(0,Foo(1,x,2),3)") return "Fail: ${test.toString()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(val a: Int, val b: Any, val c: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString() = "Foo($a,$b,$c)"
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+32
@@ -0,0 +1,32 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Foo(logged("i", 1), logged("j", 2))
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ij<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: test.kt
|
||||||
|
fun box(): String {
|
||||||
|
Foo(
|
||||||
|
logged("i", try { 1 } catch (e: Exception) { 42 }),
|
||||||
|
logged("j", 2)
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = log.toString()
|
||||||
|
if (result != "<clinit>ij<init>") return "Fail: '$result'"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: util.kt
|
||||||
|
val log = StringBuilder()
|
||||||
|
|
||||||
|
fun <T> logged(msg: String, value: T): T {
|
||||||
|
log.append(msg)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Foo.kt
|
||||||
|
class Foo(i: Int, j: Int) {
|
||||||
|
init {
|
||||||
|
log.append("<init>")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
log.append("<clinit>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
fun <T> test(a: T, b: T, operation: (x: T) -> T) {
|
||||||
|
operation(if (3 > 2) a else b)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
test(1, 1, { it })
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
fun box(): String {
|
||||||
|
val a = arrayListOf<String>()
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (a.size == 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i in 1..2) {
|
||||||
|
a.add(try { foo() } catch (e: Throwable) { "OK" })
|
||||||
|
}
|
||||||
|
|
||||||
|
return a[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(): String = throw RuntimeException()
|
||||||
+136
@@ -0,0 +1,136 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
interface AsyncGenerator<in T> {
|
||||||
|
suspend fun yield(value: T)
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AsyncSequence<out T> {
|
||||||
|
operator fun iterator(): AsyncIterator<T>
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AsyncIterator<out T> {
|
||||||
|
operator suspend fun hasNext(): Boolean
|
||||||
|
operator suspend fun next(): T
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> asyncGenerate(block: suspend AsyncGenerator<T>.() -> Unit): AsyncSequence<T> = object : AsyncSequence<T> {
|
||||||
|
override fun iterator(): AsyncIterator<T> {
|
||||||
|
val iterator = AsyncGeneratorIterator<T>()
|
||||||
|
iterator.nextStep = block.createCoroutine(receiver = iterator, completion = iterator)
|
||||||
|
return iterator
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AsyncGeneratorIterator<T>: AsyncIterator<T>, AsyncGenerator<T>, Continuation<Unit> {
|
||||||
|
var computedNext = false
|
||||||
|
var nextValue: T? = null
|
||||||
|
var nextStep: Continuation<Unit>? = null
|
||||||
|
|
||||||
|
// if (computesNext) computeContinuation is Continuation<T>
|
||||||
|
// if (!computesNext) computeContinuation is Continuation<Boolean>
|
||||||
|
var computesNext = false
|
||||||
|
var computeContinuation: Continuation<*>? = null
|
||||||
|
|
||||||
|
override val context = EmptyCoroutineContext
|
||||||
|
|
||||||
|
suspend fun computeHasNext(): Boolean = suspendCoroutineOrReturn { c ->
|
||||||
|
computesNext = false
|
||||||
|
computeContinuation = c
|
||||||
|
nextStep!!.resume(Unit)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun computeNext(): T = suspendCoroutineOrReturn { c ->
|
||||||
|
computesNext = true
|
||||||
|
computeContinuation = c
|
||||||
|
nextStep!!.resume(Unit)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
fun resumeIterator(exception: Throwable?) {
|
||||||
|
if (exception != null) {
|
||||||
|
done()
|
||||||
|
computeContinuation!!.resumeWithException(exception)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (computesNext) {
|
||||||
|
computedNext = false
|
||||||
|
(computeContinuation as Continuation<T>).resume(nextValue as T)
|
||||||
|
} else {
|
||||||
|
(computeContinuation as Continuation<Boolean>).resume(nextStep != null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun hasNext(): Boolean {
|
||||||
|
if (!computedNext) return computeHasNext()
|
||||||
|
return nextStep != null
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun next(): T {
|
||||||
|
if (!computedNext) return computeNext()
|
||||||
|
computedNext = false
|
||||||
|
return nextValue as T
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun done() {
|
||||||
|
computedNext = true
|
||||||
|
nextStep = null
|
||||||
|
}
|
||||||
|
|
||||||
|
// Completion continuation implementation
|
||||||
|
override fun resume(value: Unit) {
|
||||||
|
done()
|
||||||
|
resumeIterator(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun resumeWithException(exception: Throwable) {
|
||||||
|
done()
|
||||||
|
resumeIterator(exception)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generator implementation
|
||||||
|
override suspend fun yield(value: T): Unit = suspendCoroutineOrReturn { c ->
|
||||||
|
computedNext = true
|
||||||
|
nextValue = value
|
||||||
|
nextStep = c
|
||||||
|
resumeIterator(null)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cst(a: Any?): String? = a as String?
|
||||||
|
fun any(a: Any?): Any? = a
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val seq = asyncGenerate {
|
||||||
|
yield("O")
|
||||||
|
yield("K")
|
||||||
|
}
|
||||||
|
|
||||||
|
var res = ""
|
||||||
|
|
||||||
|
builder {
|
||||||
|
// type of `prev` should be j/l/Object everywhere (even in a expected type position)
|
||||||
|
var prev: Any? = null
|
||||||
|
for (i in seq) {
|
||||||
|
res += i
|
||||||
|
prev = any(res)
|
||||||
|
// merge of NULL_VALUE and j/l/Object should result in common j/l/Object value
|
||||||
|
// but it was NULL_VALUE and we do not spill null values, we just put
|
||||||
|
// ACONST_NULL after suspension point instead
|
||||||
|
}
|
||||||
|
|
||||||
|
res = cst(prev) ?: "fail 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
|
||||||
|
class Controller {
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
suspend fun <T> suspendWithResult(value: T): T = suspendCoroutineOrReturn { c ->
|
||||||
|
c.resume(value)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend Controller.() -> Unit): String {
|
||||||
|
val controller = Controller()
|
||||||
|
c.startCoroutine(controller, EmptyContinuation)
|
||||||
|
return controller.result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val value = builder {
|
||||||
|
for (x: Long in 20L..30L step 5L) {
|
||||||
|
listOf("#").forEach {
|
||||||
|
result += it + suspendWithResult(x).toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result += "."
|
||||||
|
}
|
||||||
|
if (value != "#20#25#30.") return "fail: suspend in for body: $value"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_REFLECT
|
||||||
|
// WITH_COROUTINES
|
||||||
|
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
class A<T : String> {
|
||||||
|
suspend fun foo() {}
|
||||||
|
|
||||||
|
suspend fun bar(): T {
|
||||||
|
foo()
|
||||||
|
return suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(x.toString() as T)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
builder {
|
||||||
|
result = A<String>().bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
return if (result == "(kotlin.coroutines.experimental.Continuation<T>) -> kotlin.Any?") "OK" else "Fail: $result"
|
||||||
|
}
|
||||||
Vendored
+40
@@ -0,0 +1,40 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// IGNORE_BACKEND: NATIVE
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
class A {
|
||||||
|
var result = mutableListOf("O", "K", null)
|
||||||
|
suspend fun foo(): String? = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(result.removeAt(0))
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
suspend fun append(ignore: String, x: String) {
|
||||||
|
result += x
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun bar() {
|
||||||
|
val a = A()
|
||||||
|
while (true) {
|
||||||
|
append("ignore", a.foo() ?: break)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
builder {
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun suspendThere(v: Any?): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v?.toString() ?: "<empty>")
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class A<T>(val arg: T) {
|
||||||
|
var result = ""
|
||||||
|
inline suspend fun foo() {
|
||||||
|
result = suspendThere(arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val a = A<String>("OK")
|
||||||
|
builder {
|
||||||
|
a.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.result
|
||||||
|
}
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// WITH_REFLECT
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun suspendThere(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun foo(x: suspend () -> String): String = x()
|
||||||
|
|
||||||
|
abstract class A {
|
||||||
|
inline suspend fun <reified T : Any> baz(): String {
|
||||||
|
return foo {
|
||||||
|
suspendThere(T::class.simpleName!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
class B : A() {
|
||||||
|
suspend fun bar(): String {
|
||||||
|
return baz<OK>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
class OK
|
||||||
|
fun box(): String {
|
||||||
|
var result = "fail"
|
||||||
|
builder {
|
||||||
|
result = B().bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun getLong(): Long = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(1234567890123L)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun suspendHere(r: LongRange): Long = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(r.start + r.endInclusive)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = 0L
|
||||||
|
|
||||||
|
builder {
|
||||||
|
result = suspendHere(1L..getLong())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != 1234567890124L) return "fail 1: $result"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun suspendHere(r: LongRange): Long = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(r.start + r.endInclusive)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = 0L
|
||||||
|
|
||||||
|
builder {
|
||||||
|
result = suspendHere(1L..1234567890123L)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != 1234567890124L) return "fail 1: $result"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
// IGNORE_BACKEND: NATIVE
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
// MODULE: lib(support)
|
||||||
|
// FILE: lib.kt
|
||||||
|
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
var continuation: () -> Unit = { }
|
||||||
|
var log = ""
|
||||||
|
var finished = false
|
||||||
|
|
||||||
|
suspend fun <T> foo(v: T): T = suspendCoroutineOrReturn { x ->
|
||||||
|
continuation = {
|
||||||
|
x.resume(v)
|
||||||
|
}
|
||||||
|
log += "foo($v);"
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
inline suspend fun bar(v: String) {
|
||||||
|
log += "before bar($v);"
|
||||||
|
foo("1:$v")
|
||||||
|
log += "inside bar($v);"
|
||||||
|
foo("2:$v")
|
||||||
|
log += "after bar($v);"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(handleResultContinuation {
|
||||||
|
continuation = { }
|
||||||
|
finished = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: main(lib)
|
||||||
|
// FILE: main.kt
|
||||||
|
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun baz() {
|
||||||
|
bar("A")
|
||||||
|
log += "between bar;"
|
||||||
|
bar("B")
|
||||||
|
}
|
||||||
|
|
||||||
|
val expectedString =
|
||||||
|
"before bar(A);foo(1:A);@;inside bar(A);foo(2:A);@;after bar(A);" +
|
||||||
|
"between bar;" +
|
||||||
|
"before bar(B);foo(1:B);@;inside bar(B);foo(2:B);@;after bar(B);"
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
builder {
|
||||||
|
baz()
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!finished) {
|
||||||
|
log += "@;"
|
||||||
|
continuation()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log != expectedString) return "fail: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+80
@@ -0,0 +1,80 @@
|
|||||||
|
// IGNORE_BACKEND: NATIVE
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
// MODULE: lib(support)
|
||||||
|
// FILE: lib.kt
|
||||||
|
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
var continuation: () -> Unit = { }
|
||||||
|
var log = ""
|
||||||
|
var finished = false
|
||||||
|
|
||||||
|
suspend fun <T> foo(v: T): T = suspendCoroutineOrReturn { x ->
|
||||||
|
continuation = {
|
||||||
|
x.resume(v)
|
||||||
|
}
|
||||||
|
log += "foo($v);"
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
suspend fun bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
class A(val v: String) : I {
|
||||||
|
override inline suspend fun bar() {
|
||||||
|
log += "before bar($v);"
|
||||||
|
foo("1:$v")
|
||||||
|
log += "inside bar($v);"
|
||||||
|
foo("2:$v")
|
||||||
|
log += "after bar($v);"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(handleResultContinuation {
|
||||||
|
continuation = { }
|
||||||
|
finished = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: main(lib)
|
||||||
|
// FILE: main.kt
|
||||||
|
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun baz() {
|
||||||
|
val a = A("A")
|
||||||
|
a.bar()
|
||||||
|
|
||||||
|
log += "between bar;"
|
||||||
|
|
||||||
|
val b: I = A("B")
|
||||||
|
b.bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
val expectedString =
|
||||||
|
"before bar(A);foo(1:A);@;inside bar(A);foo(2:A);@;after bar(A);" +
|
||||||
|
"between bar;" +
|
||||||
|
"before bar(B);foo(1:B);@;inside bar(B);foo(2:B);@;after bar(B);"
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
builder {
|
||||||
|
baz()
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!finished) {
|
||||||
|
log += "@;"
|
||||||
|
continuation()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log != expectedString) return "fail: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+77
@@ -0,0 +1,77 @@
|
|||||||
|
// IGNORE_BACKEND: NATIVE
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
// MODULE: lib(support)
|
||||||
|
// FILE: lib.kt
|
||||||
|
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
var continuation: () -> Unit = { }
|
||||||
|
var log = ""
|
||||||
|
var finished = false
|
||||||
|
|
||||||
|
class C {
|
||||||
|
var v: String = ""
|
||||||
|
|
||||||
|
inline suspend fun bar() {
|
||||||
|
log += "before bar($v);"
|
||||||
|
foo("1:$v")
|
||||||
|
log += "inside bar($v);"
|
||||||
|
foo("2:$v")
|
||||||
|
log += "after bar($v);"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun <T> foo(v: T): T = suspendCoroutineOrReturn { x ->
|
||||||
|
continuation = {
|
||||||
|
x.resume(v)
|
||||||
|
}
|
||||||
|
log += "foo($v);"
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun C.builder(c: suspend C.() -> Unit) {
|
||||||
|
c.startCoroutine(this, handleResultContinuation {
|
||||||
|
continuation = { }
|
||||||
|
finished = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: main(lib)
|
||||||
|
// FILE: main.kt
|
||||||
|
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun C.baz() {
|
||||||
|
v = "A"
|
||||||
|
bar()
|
||||||
|
log += "between bar;"
|
||||||
|
v = "B"
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
val expectedString =
|
||||||
|
"before bar(A);foo(1:A);@;inside bar(A);foo(2:A);@;after bar(A);" +
|
||||||
|
"between bar;" +
|
||||||
|
"before bar(B);foo(1:B);@;inside bar(B);foo(2:B);@;after bar(B);"
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var c = C()
|
||||||
|
|
||||||
|
c.builder {
|
||||||
|
baz()
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!finished) {
|
||||||
|
log += "@;"
|
||||||
|
continuation()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log != expectedString) return "fail: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+60
@@ -0,0 +1,60 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// FILE: main.kt
|
||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
open class A(val v: String) {
|
||||||
|
suspend fun suspendThere(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
open suspend fun suspendHere(): String = suspendThere("O") + suspendThere(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
class B(v: String) : A(v) {
|
||||||
|
override suspend fun suspendHere(): String = super.suspendHere() + suspendThere("56")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend A.() -> Unit) {
|
||||||
|
c.startCoroutine(B("K"), EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = JavaClass.foo()
|
||||||
|
|
||||||
|
if (result != "OK56") return "fail 1: $result"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: JavaClass.java
|
||||||
|
import kotlin.coroutines.experimental.*;
|
||||||
|
public class JavaClass {
|
||||||
|
public static String foo() {
|
||||||
|
final String[] res = new String[1];
|
||||||
|
|
||||||
|
new B("K").suspendHere(new Continuation<String>() {
|
||||||
|
@Override
|
||||||
|
public CoroutineContext getContext() {
|
||||||
|
return EmptyCoroutineContext.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resume(String s) {
|
||||||
|
res[0] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resumeWithException(Throwable throwable) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return res[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+34
@@ -0,0 +1,34 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
open class A(val v: String) {
|
||||||
|
suspend fun suspendThere(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
open suspend fun suspendHere(): String = suspendThere("O") + suspendThere(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
class B(v: String) : A(v) {
|
||||||
|
override suspend fun suspendHere(): String = super.suspendHere() + suspendThere("56")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend A.() -> Unit) {
|
||||||
|
c.startCoroutine(B("K"), EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
builder {
|
||||||
|
result = suspendHere()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != "OK56") return "fail 1: $result"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
abstract class A(val v: String) {
|
||||||
|
suspend abstract fun foo(v: String): String
|
||||||
|
|
||||||
|
suspend fun suspendThere(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
open suspend fun suspendHere(): String = foo("O") + suspendThere(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
class B(v: String) : A(v) {
|
||||||
|
override suspend fun foo(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun suspendHere(): String = super.suspendHere() + suspendThere("56")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend A.() -> Unit) {
|
||||||
|
c.startCoroutine(B("K"), EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
builder {
|
||||||
|
result = suspendHere()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != "OK56") return "fail 1: $result"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
interface A {
|
||||||
|
val v: String
|
||||||
|
|
||||||
|
suspend fun suspendThere(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun suspendHere(): String = suspendThere("O") + suspendThere(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
interface A2 : A {
|
||||||
|
override suspend fun suspendHere(): String = super.suspendHere() + suspendThere("56")
|
||||||
|
}
|
||||||
|
|
||||||
|
class B(override val v: String) : A2
|
||||||
|
|
||||||
|
fun builder(c: suspend A.() -> Unit) {
|
||||||
|
c.startCoroutine(B("K"), EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = ""
|
||||||
|
|
||||||
|
builder {
|
||||||
|
result = suspendHere()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != "OK56") return "fail 1: $result"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
class Controller {
|
||||||
|
suspend fun suspendHere(): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume("K")
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend Controller.() -> Unit) {
|
||||||
|
c.startCoroutine(Controller(), EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
val logger = StringBuilder()
|
||||||
|
|
||||||
|
class A(val first: String, val second: String) {
|
||||||
|
init {
|
||||||
|
logger.append("A.<init>;")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString() = "$first$second"
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
init {
|
||||||
|
logger.append("A.<clinit>;")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> logged(message: String, result: () -> T): T {
|
||||||
|
logger.append(message)
|
||||||
|
return result()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = "OK"
|
||||||
|
|
||||||
|
builder {
|
||||||
|
var local: Any = A(logged("args;") { "O" }, suspendHere())
|
||||||
|
|
||||||
|
if (local.toString() != "OK") {
|
||||||
|
result = "fail 1: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (logger.toString() != "args;A.<clinit>;A.<init>;") {
|
||||||
|
return "Fail: '$logger'"
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
+152
@@ -0,0 +1,152 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
class Controller {
|
||||||
|
suspend fun suspendHere(): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume("K")
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun suspendWithArgument(v: String): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun suspendWithDouble(v: Double): Double = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume(v)
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend Controller.() -> Unit) {
|
||||||
|
c.startCoroutine(Controller(), EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
class A(val first: String, val second: String) {
|
||||||
|
override fun toString() = "$first$second"
|
||||||
|
}
|
||||||
|
|
||||||
|
class B(val first: String, val second: String, val third: String) {
|
||||||
|
override fun toString() = "$first$second$third"
|
||||||
|
}
|
||||||
|
|
||||||
|
class C(val a: Long, val b: Double, val c: Int, val d: String) {
|
||||||
|
override fun toString() = "$a#$b#$c#$d"
|
||||||
|
}
|
||||||
|
|
||||||
|
val condition = true
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = "OK"
|
||||||
|
|
||||||
|
builder {
|
||||||
|
for (count in 0..3) {
|
||||||
|
val local = A(if (count > 0) break else "O", suspendHere())
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
result = "fail 1: count=$count"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local.toString() != "OK") {
|
||||||
|
result = "fail 1: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (count in 0..3) {
|
||||||
|
val local = B(if (count > 0) break else "#", suspendWithArgument("O"), suspendHere())
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
result = "fail 2: count=$count"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local.toString() != "#OK") {
|
||||||
|
result = "fail 2: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (count in 0..3) {
|
||||||
|
val local = B(suspendWithArgument("#"), if (count > 0) break else "O", suspendHere())
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
result = "fail 3: count=$count"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local.toString() != "#OK") {
|
||||||
|
result = "fail 3: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (count in 0..3) {
|
||||||
|
val local = B(
|
||||||
|
"#",
|
||||||
|
B("",
|
||||||
|
if (count > 0) break else "O",
|
||||||
|
suspendWithArgument("")
|
||||||
|
).toString(),
|
||||||
|
suspendHere()
|
||||||
|
)
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
result = "fail 4: count=$count"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local.toString() != "#OK") {
|
||||||
|
result = "fail 4: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop@for (count in 0..3) {
|
||||||
|
val local = B(
|
||||||
|
if (!condition) "1" else suspendWithArgument("#"),
|
||||||
|
when {
|
||||||
|
count > 0 -> break@loop
|
||||||
|
condition -> suspendWithArgument("O")
|
||||||
|
else -> "2"
|
||||||
|
},
|
||||||
|
if (condition) suspendHere() else suspendWithArgument("3")
|
||||||
|
)
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
result = "fail 5: count=$count"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local.toString() != "#OK") {
|
||||||
|
result = "fail 5: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (count in 0..3) {
|
||||||
|
val local = C(
|
||||||
|
1234567890123L,
|
||||||
|
suspendWithDouble(3.14),
|
||||||
|
42,
|
||||||
|
if (count > 0) break else suspendWithArgument("OK")
|
||||||
|
)
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
result = "fail 6: count=$count"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
|
||||||
|
if (local.toString() != "1234567890123#3.14#42#OK") {
|
||||||
|
result = "fail 6: $local"
|
||||||
|
return@builder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
Vendored
-1
@@ -1,6 +1,5 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// WITH_COROUTINES
|
// WITH_COROUTINES
|
||||||
// IGNORE_BACKEND: JS
|
|
||||||
import helpers.*
|
import helpers.*
|
||||||
import kotlin.coroutines.experimental.*
|
import kotlin.coroutines.experimental.*
|
||||||
import kotlin.coroutines.experimental.intrinsics.*
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.experimental.*
|
||||||
|
import kotlin.coroutines.experimental.intrinsics.*
|
||||||
|
|
||||||
|
suspend fun suspendHere(): String = suspendCoroutineOrReturn { x ->
|
||||||
|
x.resume("OK")
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = arrayListOf<String>()
|
||||||
|
|
||||||
|
builder {
|
||||||
|
while (true) {
|
||||||
|
if (result.size == 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i in 1..2) {
|
||||||
|
result.add(suspendHere())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result[0]
|
||||||
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.1
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a: A = B(1)
|
val a: A = B(1)
|
||||||
a.copy(1)
|
a.copy(1)
|
||||||
|
|||||||
+1
-3
@@ -1,6 +1,4 @@
|
|||||||
// TARGET_BACKEND: JS
|
// IGNORE_BACKEND: JVM
|
||||||
// This test causes JVM to generate incorrect bytecode
|
|
||||||
// Could not use IGNORE_BACKEND directive, since it makes LightAnalysisModeCodegenTestsGenerated fail on this test
|
|
||||||
|
|
||||||
interface I<T> {
|
interface I<T> {
|
||||||
val prop: T
|
val prop: T
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
interface I {
|
||||||
|
fun foo(x: Int = 23): String
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class Base : I
|
||||||
|
|
||||||
|
class C : Base(), I {
|
||||||
|
override fun foo(x: Int) = "C:$x"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val x: I = C()
|
||||||
|
val r = x.foo() + ";" + x.foo(42)
|
||||||
|
if (r != "C:23;C:42") return "fail: $r"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+38
@@ -0,0 +1,38 @@
|
|||||||
|
// IGNORE_BACKEND: JS
|
||||||
|
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
class Delegate<T>(var inner: T) {
|
||||||
|
operator fun getValue(t: Any?, p: KProperty<*>): T = inner
|
||||||
|
operator fun setValue(t: Any?, p: KProperty<*>, i: T) { inner = i }
|
||||||
|
}
|
||||||
|
|
||||||
|
val del = Delegate("zzz")
|
||||||
|
|
||||||
|
class A {
|
||||||
|
inner class B {
|
||||||
|
var prop: String by del
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun asFailsWithCCE(block: () -> Unit) {
|
||||||
|
try {
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
catch (e: ClassCastException) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
catch (e: Throwable) {
|
||||||
|
throw AssertionError("Should throw ClassCastException, got $e")
|
||||||
|
}
|
||||||
|
throw AssertionError("Should throw ClassCastException, no exception thrown")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val c = A().B()
|
||||||
|
|
||||||
|
(del as Delegate<Int>).inner = 10
|
||||||
|
asFailsWithCCE { c.prop } // does not fail in JS due KT-8135.
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+38
@@ -0,0 +1,38 @@
|
|||||||
|
// IGNORE_BACKEND: JVM, JS
|
||||||
|
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
class Delegate<T>(var inner: T) {
|
||||||
|
operator fun getValue(t: Any?, p: KProperty<*>): T = inner
|
||||||
|
operator fun setValue(t: Any?, p: KProperty<*>, i: T) { inner = i }
|
||||||
|
}
|
||||||
|
|
||||||
|
val del = Delegate("zzz")
|
||||||
|
|
||||||
|
class A {
|
||||||
|
inner class B {
|
||||||
|
var prop: String by del
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun asFailsWithCCE(block: () -> Unit) {
|
||||||
|
try {
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
catch (e: ClassCastException) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
catch (e: Throwable) {
|
||||||
|
throw AssertionError("Should throw ClassCastException, got $e")
|
||||||
|
}
|
||||||
|
throw AssertionError("Should throw ClassCastException, no exception thrown")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val c = A().B()
|
||||||
|
|
||||||
|
(del as Delegate<String?>).inner = null
|
||||||
|
asFailsWithCCE { c.prop } // does not fail in JVM, JS due KT-8135.
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+25
@@ -0,0 +1,25 @@
|
|||||||
|
// FILE: Var.kt
|
||||||
|
package pvar
|
||||||
|
|
||||||
|
open class PVar<T>(private var value: T) {
|
||||||
|
protected operator fun getValue(thisRef: Any?, prop: Any?) = value
|
||||||
|
|
||||||
|
protected operator fun setValue(thisRef: Any?, prop: Any?, newValue: T) {
|
||||||
|
value = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: test.kt
|
||||||
|
import pvar.*
|
||||||
|
|
||||||
|
class C : PVar<Long>(42L) {
|
||||||
|
inner class Inner {
|
||||||
|
var x by this@C
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val inner = C().Inner()
|
||||||
|
inner.x = 1L
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
object Whatever {
|
||||||
|
operator fun getValue(thisRef: Any?, prop: Any?) = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val key by Whatever
|
||||||
|
return {
|
||||||
|
object {
|
||||||
|
val keys = key
|
||||||
|
}.keys
|
||||||
|
} ()
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
//WITH_REFLECT
|
||||||
|
|
||||||
|
import kotlin.properties.Delegates
|
||||||
|
|
||||||
|
interface MyInterface {
|
||||||
|
fun something(): String {
|
||||||
|
var foo: String by Delegates.notNull();
|
||||||
|
foo = "OK"
|
||||||
|
return foo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return object : MyInterface {
|
||||||
|
|
||||||
|
}.something()
|
||||||
|
}
|
||||||
Vendored
+4
-1
@@ -3,7 +3,10 @@
|
|||||||
|
|
||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
|
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.KProperty
|
||||||
|
import kotlin.reflect.KMutableProperty
|
||||||
|
import kotlin.reflect.KMutableProperty1
|
||||||
|
import kotlin.reflect.full.*
|
||||||
import kotlin.reflect.jvm.*
|
import kotlin.reflect.jvm.*
|
||||||
|
|
||||||
object Delegate {
|
object Delegate {
|
||||||
|
|||||||
+3
-3
@@ -10,15 +10,15 @@ open class MyClass(val value: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <T> runLogged(entry: String, action: () -> T): T {
|
inline fun <L> runLogged(entry: String, action: () -> L): L {
|
||||||
log += entry
|
log += entry
|
||||||
return action()
|
return action()
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun <T: MyClass> T.provideDelegate(host: Any?, p: Any): T =
|
operator fun <P: MyClass> P.provideDelegate(host: Any?, p: Any): P =
|
||||||
runLogged("tdf(${this.value});") { this }
|
runLogged("tdf(${this.value});") { this }
|
||||||
|
|
||||||
operator fun <T> T.getValue(receiver: Any?, p: Any): T =
|
operator fun <V> V.getValue(receiver: Any?, p: Any): V =
|
||||||
runLogged("get($this);") { this }
|
runLogged("get($this);") { this }
|
||||||
|
|
||||||
val testO by runLogged("O;") { MyClass("O") }
|
val testO by runLogged("O;") { MyClass("O") }
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
import kotlin.properties.ReadOnlyProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
class Delegate: ReadOnlyProperty<Test, String> {
|
||||||
|
override fun getValue(thisRef: Test, property: KProperty<*>) = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Provider {
|
||||||
|
operator fun provideDelegate(thisRef: Test, property: KProperty<*>) = Delegate()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
companion object {
|
||||||
|
val instance = Test()
|
||||||
|
}
|
||||||
|
|
||||||
|
val message by Provider()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Test.instance.message
|
||||||
+60
@@ -0,0 +1,60 @@
|
|||||||
|
// IGNORE_BACKEND: JVM
|
||||||
|
|
||||||
|
var log = ""
|
||||||
|
fun log(a: String) {
|
||||||
|
log += a + ";"
|
||||||
|
}
|
||||||
|
|
||||||
|
interface C {
|
||||||
|
fun foo(x: Int): Unit {
|
||||||
|
log("C.foo($x)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
fun foo(x: Int = 1): Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
class G(c: C) : C by c, I
|
||||||
|
class H(c: C) : I, C by c
|
||||||
|
|
||||||
|
fun test1() {
|
||||||
|
log = ""
|
||||||
|
|
||||||
|
val g1 = G(object: C {})
|
||||||
|
g1.foo(2)
|
||||||
|
g1.foo()
|
||||||
|
val g2 = G(object: C {
|
||||||
|
override fun foo(x: Int) {
|
||||||
|
log("[2] object:C.foo($x)")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
g2.foo(2)
|
||||||
|
g2.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test2() {
|
||||||
|
log = ""
|
||||||
|
|
||||||
|
val h1 = H(object: C {})
|
||||||
|
h1.foo(2)
|
||||||
|
h1.foo()
|
||||||
|
val h2 = H(object: C {
|
||||||
|
override fun foo(x: Int) {
|
||||||
|
log("[2] object:C.foo($x)")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
h2.foo(2)
|
||||||
|
h2.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
test1()
|
||||||
|
if (log != "C.foo(2);C.foo(1);[2] object:C.foo(2);[2] object:C.foo(1);") return "fail1: $log"
|
||||||
|
|
||||||
|
test2()
|
||||||
|
if (log != "C.foo(2);C.foo(1);[2] object:C.foo(2);[2] object:C.foo(1);") return "fail2: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class A {
|
||||||
|
X {
|
||||||
|
val x = "OK"
|
||||||
|
|
||||||
|
inner class Inner {
|
||||||
|
inner class Inner2 {
|
||||||
|
inner class Inner3 {
|
||||||
|
val y = x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val z = Inner().Inner2().Inner3()
|
||||||
|
|
||||||
|
override val test: String
|
||||||
|
get() = z.y
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val test: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A.X.test
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class A {
|
||||||
|
X {
|
||||||
|
val k = "K"
|
||||||
|
|
||||||
|
val anonObject = object {
|
||||||
|
inner class Inner {
|
||||||
|
val x = "O" + k
|
||||||
|
}
|
||||||
|
|
||||||
|
val innerX = Inner().x
|
||||||
|
|
||||||
|
override fun toString() = innerX
|
||||||
|
}
|
||||||
|
|
||||||
|
override val test = anonObject.toString()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val test: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A.X.test
|
||||||
Vendored
+24
@@ -0,0 +1,24 @@
|
|||||||
|
interface IFoo {
|
||||||
|
fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IBar {
|
||||||
|
fun bar(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class Base(val x: IFoo)
|
||||||
|
|
||||||
|
enum class Test : IFoo, IBar {
|
||||||
|
FOO {
|
||||||
|
// FOO referenced from inner class constructor with uninitialized 'this'
|
||||||
|
inner class Inner : Base(FOO)
|
||||||
|
|
||||||
|
val z = Inner()
|
||||||
|
|
||||||
|
override fun foo() = "OK"
|
||||||
|
|
||||||
|
override fun bar() = z.x.foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Test.FOO.bar()
|
||||||
Vendored
+24
@@ -0,0 +1,24 @@
|
|||||||
|
interface IFoo {
|
||||||
|
fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IBar {
|
||||||
|
fun bar(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class Test : IFoo, IBar {
|
||||||
|
FOO {
|
||||||
|
// FOO referenced from inner class constructor with initialized 'this'
|
||||||
|
inner class Inner {
|
||||||
|
val fooFoo = FOO.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
val z = Inner()
|
||||||
|
|
||||||
|
override fun foo() = "OK"
|
||||||
|
|
||||||
|
override fun bar() = z.fooFoo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Test.FOO.bar()
|
||||||
Vendored
+23
@@ -0,0 +1,23 @@
|
|||||||
|
interface IFoo {
|
||||||
|
fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IBar {
|
||||||
|
fun bar(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class Test : IFoo, IBar {
|
||||||
|
FOO {
|
||||||
|
// FOO referenced from inner class constructor with initialized 'this',
|
||||||
|
// in delegate initializer
|
||||||
|
inner class Inner : IFoo by FOO
|
||||||
|
|
||||||
|
val z = Inner()
|
||||||
|
|
||||||
|
override fun foo() = "OK"
|
||||||
|
|
||||||
|
override fun bar() = z.foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Test.FOO.bar()
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class A {
|
||||||
|
X {
|
||||||
|
val x = "OK"
|
||||||
|
|
||||||
|
inner class Inner {
|
||||||
|
val y = x
|
||||||
|
}
|
||||||
|
|
||||||
|
val z = Inner()
|
||||||
|
|
||||||
|
override val test: String
|
||||||
|
get() = z.y
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val test: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A.X.test
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class A {
|
||||||
|
X {
|
||||||
|
val x = "OK"
|
||||||
|
|
||||||
|
inner class Inner {
|
||||||
|
fun foo() = x
|
||||||
|
}
|
||||||
|
|
||||||
|
val z = Inner()
|
||||||
|
|
||||||
|
override val test = z.foo()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val test: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A.X.test
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class A {
|
||||||
|
X {
|
||||||
|
val x = "OK"
|
||||||
|
|
||||||
|
inner class Inner {
|
||||||
|
fun foo() = this@X.x
|
||||||
|
}
|
||||||
|
|
||||||
|
val z = Inner()
|
||||||
|
|
||||||
|
override val test = z.foo()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val test: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A.X.test
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
enum class Test(val x: String, val closure1: () -> String) {
|
||||||
|
FOO("O", { FOO.x }) {
|
||||||
|
override val y: String = "K"
|
||||||
|
val closure2 = { y } // Implicit 'FOO'
|
||||||
|
override val z: String = closure2()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val y: String
|
||||||
|
abstract val z: String
|
||||||
|
|
||||||
|
fun test() = closure1() + z
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Test.FOO.test()
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
enum class Test(val x: String, val closure1: () -> String) {
|
||||||
|
FOO("O", run { { FOO.x } }) {
|
||||||
|
override val y: String = "K"
|
||||||
|
val closure2 = { y } // Implicit 'FOO'
|
||||||
|
override val z: String = closure2()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val y: String
|
||||||
|
abstract val z: String
|
||||||
|
|
||||||
|
fun test() = closure1() + z
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Test.FOO.test()
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
enum class Foo(
|
||||||
|
val x: String,
|
||||||
|
val callback: () -> String
|
||||||
|
) {
|
||||||
|
FOO("OK", { FOO.x })
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Foo.FOO.callback()
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
interface Callback {
|
||||||
|
fun invoke(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class Foo(
|
||||||
|
val x: String,
|
||||||
|
val callback: Callback
|
||||||
|
) {
|
||||||
|
FOO(
|
||||||
|
"OK",
|
||||||
|
object : Callback {
|
||||||
|
override fun invoke() = FOO.x
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Foo.FOO.callback.invoke()
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
val value2 = "K"
|
||||||
|
override val value = "O".let { it + value2 }
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.value
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
val value2 = "K"
|
||||||
|
|
||||||
|
val anonObject = object {
|
||||||
|
val value3 = "O" + value2
|
||||||
|
|
||||||
|
override fun toString(): String = value3
|
||||||
|
}
|
||||||
|
|
||||||
|
override val value = anonObject.toString()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.value
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
val value2 = "K"
|
||||||
|
|
||||||
|
val anonObject = object {
|
||||||
|
override fun toString(): String =
|
||||||
|
"O" + value2
|
||||||
|
}
|
||||||
|
|
||||||
|
override val value = anonObject.toString()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.value
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
val k = "K"
|
||||||
|
|
||||||
|
inner class Inner {
|
||||||
|
fun foo() = "O" + k
|
||||||
|
}
|
||||||
|
|
||||||
|
val inner = Inner()
|
||||||
|
|
||||||
|
val bmr = inner::foo
|
||||||
|
|
||||||
|
override val value = bmr.invoke()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.value
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
|
||||||
|
override val value = "OK"
|
||||||
|
|
||||||
|
val bmr = B::value.get()
|
||||||
|
|
||||||
|
override fun foo(): String {
|
||||||
|
return bmr
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value: String
|
||||||
|
|
||||||
|
abstract fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.foo()
|
||||||
Vendored
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// LANGUAGE_VERSION: 1.2
|
||||||
|
|
||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
override val value = "OK"
|
||||||
|
|
||||||
|
override val test = ::value.get()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value: String
|
||||||
|
|
||||||
|
abstract val test: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.test
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
override val value2 = "K"
|
||||||
|
override val value = "O" + B.value2
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value2: String
|
||||||
|
abstract val value: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.value
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
enum class X {
|
||||||
|
B {
|
||||||
|
override val value2 = "K"
|
||||||
|
override val value = "O" + X.B.value2
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val value2: String
|
||||||
|
abstract val value: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = X.B.value
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user