| // LANGUAGE: +ContextParameters +ExplicitContextArguments |
| |
| // MODULE: a |
| // FILE: a.kt |
| context(a: String, b: String) |
| fun fromDifferentModule() = a + b |
| |
| // MODULE: b(a) |
| // FILE: b.kt |
| import kotlin.coroutines.* |
| |
| context(s: String) |
| fun simple1() = s |
| |
| context(i: Int, s: String) |
| fun simple2() = s |
| |
| context(t: T) |
| fun <T> generic1() = t |
| |
| context(t: T, r: R) |
| fun <T, R> generic2() = r |
| |
| context(f: () -> String) |
| fun lambda() = f() |
| |
| context(f: () -> T) |
| fun <T> genericLambda() = f() |
| |
| context(f: (T) -> T) |
| fun <T> genericLambda(t: T) = f(t) |
| |
| fun getString() = "OK" |
| |
| fun stringIdentity(s: String) = s |
| |
| context(c: String) |
| fun contextAndValue(s: String) = c + s |
| |
| context(c1: String, c2: String) |
| fun contextAndValue2(s1: String, s2: String) = c1 + c2 + s1 + s2 |
| |
| fun interface Fun { |
| fun invoke(): String |
| } |
| |
| context(f: Fun) |
| fun samConversion() = f.invoke() |
| |
| context(f: suspend () -> String) |
| fun suspendConversion(): String { |
| var result = "" |
| f.startCoroutine(Continuation(EmptyCoroutineContext) { result = it.getOrThrow() }) |
| return result |
| } |
| |
| fun interface SuspendFun { |
| suspend fun invoke(): String |
| } |
| |
| context(f: SuspendFun) |
| fun samWithSuspendConversion(): String { |
| var result = "" |
| suspend { f.invoke() }.startCoroutine(Continuation(EmptyCoroutineContext) { result = it.getOrThrow() }) |
| return result |
| } |
| |
| context(s: String) |
| fun overload() = "OK" |
| |
| fun overload(s: CharSequence) = "NOT OK" |
| |
| fun box(): String { |
| if (simple1(s = "OK") != "OK") return "FAIL 1" |
| if (simple2(i = 1, s = "OK") != "OK") return "FAIL 2" |
| if (generic1(t = "OK") != "OK") return "FAIL 3" |
| if (generic1(t = 1) != 1) return "FAIL 4" |
| if (generic1<Long>(t = 1) != 1L) return "FAIL 5" |
| if (generic2(t = 1, r = "OK") != "OK") return "FAIL 6" |
| if (generic2<Long, _>(t = 1, r = "OK") != "OK") return "FAIL 7" |
| if (generic2(t = "OK", r = 1) != 1) return "FAIL 8" |
| if (generic2<_, Long>(t = "OK", r = 1) != 1L) return "FAIL 9" |
| |
| with(1) { |
| if (simple2(s = "OK") != "OK") return "FAIL 10" |
| if (generic2(r = "OK") != "OK") return "FAIL 11" |
| if (generic2(t = "OK") != 1) return "FAIL 12" |
| } |
| |
| with("NOT OK") { |
| context(s: String) |
| fun local(): String { |
| if (simple1(s = "OK") != "OK") return "FAIL 13" |
| if (generic1(t = "OK") != "OK") return "FAIL 14" |
| return "OK" |
| } |
| local().let { if (it != "OK") return it } |
| if (simple1(s = "OK") != "OK") return "FAIL 15" |
| if (generic1(t = "OK") != "OK") return "FAIL 16" |
| } |
| |
| if (lambda(f = { "OK" }) != "OK") return "FAIL 17" |
| |
| if (genericLambda<String>(f = { "OK" }) != "OK") return "FAIL 18" |
| if (genericLambda<String>(f = ::getString) != "OK") return "FAIL 19" |
| |
| if (genericLambda<String>("OK", f = { it }) != "OK") return "FAIL 20" |
| if (genericLambda<String>("OK", f = ::stringIdentity) != "OK") return "FAIL 21" |
| if (genericLambda("OK", f = { it }) != "OK") return "FAIL 22" |
| if (genericLambda("OK", f = ::stringIdentity) != "OK") return "FAIL 23" |
| |
| if (contextAndValue(s = "K", c = "O") != "OK") return "FAIL 24" |
| if (contextAndValue(c = "O", s = "K") != "OK") return "FAIL 25" |
| |
| // test side effects |
| var i = 0 |
| if (contextAndValue(s = run { i = 1; "K" }, c = run { if (i == 1) "O" else "!" }) != "OK") return "FAIL 26" |
| if (contextAndValue(c = run { i = 2; "O" }, s = run { if (i == 2) "K" else "!" }) != "OK") return "FAIL 27" |
| |
| i = 0 |
| if (contextAndValue2( |
| run { if (i == 0) { i = 1; "1" } else "X" }, |
| c2 = run { if (i == 1) { i = 2; "2" } else "X" }, |
| s2 = run { if (i == 2) { i = 3; "3" } else "X" }, |
| c1 = run { if (i == 3) { i = 4; "4" } else "X" }, |
| ) != "4213") return "FAIL 28" |
| |
| if (fromDifferentModule(a = "O", b = "K") != "OK") return "FAIL 29" |
| if (fromDifferentModule(b = "K", a = "O") != "OK") return "FAIL 30" |
| |
| if (samConversion(f = { "OK" }) != "OK") return "FAIL 31" |
| val okFunction: () -> String = { "OK" } |
| if (suspendConversion(f = { "OK" }) != "OK") return "FAIL 32" |
| if (suspendConversion(f = okFunction) != "OK") return "FAIL 32" |
| if (samWithSuspendConversion(f = { "OK" }) != "OK") return "FAIL 32" |
| if (samWithSuspendConversion(f = okFunction) != "OK") return "FAIL 32" |
| |
| if (overload(s = "OK") != "OK") return "FAIL 35" |
| |
| return "OK" |
| } |