| // LANGUAGE: +ContextParameters |
| // WITH_STDLIB |
| // ES_MODULES |
| // FILE: contextParametersJSModule.kt |
| |
| external interface ContextA { fun value(): String } |
| external interface ContextB { fun value(): String } |
| |
| @JsModule("./contextParametersJSModule.mjs") |
| external object JS { |
| fun getContextA(): ContextA |
| fun getContextB(): ContextB |
| |
| // EXTERNAL_DECLARATION_WITH_CONTEXT_PARAMETERS |
| // context(a: ContextA) fun callValue(): String |
| // context(a: ContextA) fun callValueWithPrefix(prefix: String): String |
| // context(a: ContextA, b: ContextB) fun combineValues(): String |
| } |
| |
| context(a: ContextA) |
| fun resolveValue(): String = a.value() |
| |
| fun useAContextBlock(ctxA: ContextA): String = context(ctxA) { resolveValue() } |
| fun useAWith(ctxA: ContextA): String = with(ctxA) { resolveValue() } |
| |
| context(a: ContextA) |
| fun useANested(): String = resolveValue() |
| |
| |
| fun box(): String { |
| val ctxA = JS.getContextA() |
| |
| val ok = |
| useAContextBlock(ctxA) == "OK" && |
| useAWith(ctxA) == "OK" && |
| context(ctxA) { useANested() } == "OK" |
| // && context(ctxA) { JS.callValue() } == "OK" && |
| // context(ctxA) { JS.callValueWithPrefix("->") } == "->OK" && |
| // run { |
| // val ctxB = JS.getContextB() |
| // context(ctxA, ctxB) { JS.combineValues() } == "OKB" |
| // } |
| |
| return if (ok) "OK" else "FAIL" |
| } |
| |
| // FILE: contextParametersJSModule.mjs |
| export function getContextA() { |
| return { value() { return "OK"; } }; |
| } |
| |
| export function getContextB() { |
| return { value() { return "B"; } }; |
| } |
| |
| export function callValue(a) { |
| return a.value(); |
| } |
| |
| export function callValueWithPrefix(a, prefix) { |
| return prefix + a.value(); |
| } |
| |
| export function combineValues(a, b) { |
| return a.value() + b.value(); |
| } |