[JS IR] Support per-file mode and ES modules
This commit is contained in:
+29
@@ -0,0 +1,29 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1289
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
object O {
|
||||
operator fun invoke() = "OK"
|
||||
}
|
||||
|
||||
inline fun callO() = O()
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
val a = O()
|
||||
if (a != "OK") return "fail: simple: $a"
|
||||
|
||||
val b = callO()
|
||||
if (b != "OK") return "fail: inline: $a"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1291
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
class A(val x: Int) {
|
||||
constructor(a: Int, b: Int) : this(a + b)
|
||||
}
|
||||
|
||||
external class B(x: Int) {
|
||||
constructor(a: Int, b: Int)
|
||||
|
||||
val x: Int
|
||||
}
|
||||
|
||||
// TODO: may be useful after implementing local classes in inline functions
|
||||
/*
|
||||
inline fun foo(p: Int, q: Int, r: Int): Pair<Int, Int> {
|
||||
class C(val x : Int) {
|
||||
constructor(a: Int, b: Int) : this(a + b)
|
||||
}
|
||||
return Pair(C(p).x, C(q, r).x)
|
||||
}
|
||||
*/
|
||||
|
||||
inline fun callPrimaryConstructor(x: Int) = A(x).x
|
||||
|
||||
inline fun callSecondaryConstructor(x: Int, y: Int) = A(x, y).x
|
||||
|
||||
// FILE: lib.js
|
||||
|
||||
function B(x, y) {
|
||||
this.x = x;
|
||||
if (typeof y !== 'undefined') {
|
||||
this.x += y;
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
val a = A(23).x
|
||||
if (a != 23) return "fail: primary constructor: $a"
|
||||
|
||||
val b = A(40, 2).x
|
||||
if (b != 42) return "fail: secondary constructor: $b"
|
||||
|
||||
val c = B(99).x
|
||||
if (c != 99) return "fail: native primary constructor: $c"
|
||||
|
||||
val d = B(100, 11).x
|
||||
if (d != 111) return "fail: native secondary constructor: $d"
|
||||
|
||||
/*
|
||||
val (e, f) = foo(123, 320, 1)
|
||||
if (e != 123) return "fail: local primary constructor: $e"
|
||||
if (f != 321) return "fail: local secondary constructor: $f"
|
||||
*/
|
||||
|
||||
val g = callPrimaryConstructor(55)
|
||||
if (g != 55) return "fail: primary constructor from inline function: $g"
|
||||
|
||||
val h = callSecondaryConstructor(990, 9)
|
||||
if (h != 999) return "fail: secondary constructor from inline function: $h"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1292
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
package lib
|
||||
|
||||
open class A {
|
||||
fun foo() = 23
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
|
||||
package main
|
||||
|
||||
import lib.A
|
||||
|
||||
class B : A() {
|
||||
fun bar() = foo() + 1
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val result = B().bar()
|
||||
if (result != 24) return "fail: $result"
|
||||
return "OK"
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1283
|
||||
// MODULE: lib1
|
||||
// FILE: lib1.kt
|
||||
|
||||
fun foo() = "OK"
|
||||
|
||||
// MODULE: lib2(lib1)
|
||||
// FILE: lib2.kt
|
||||
|
||||
inline fun bar() = foo()
|
||||
|
||||
// MODULE: main(lib1, lib2)
|
||||
// FILE: main.kt
|
||||
|
||||
fun box() = bar()
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1283
|
||||
// MODULE: 1
|
||||
// FILE: lib1.kt
|
||||
|
||||
fun foo() = "OK"
|
||||
|
||||
// MODULE: 2(1)
|
||||
// FILE: lib2.kt
|
||||
|
||||
inline fun bar() = foo()
|
||||
|
||||
// MODULE: main(2)
|
||||
// FILE: main.kt
|
||||
|
||||
fun box() = bar()
|
||||
@@ -0,0 +1,21 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1283
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
fun bar(f: () -> String) = f()
|
||||
|
||||
inline fun foo(): String {
|
||||
return bar { "OK" }
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box() = foo()
|
||||
@@ -0,0 +1,39 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1289
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
var log = ""
|
||||
|
||||
object O {
|
||||
init {
|
||||
log += "O.init;"
|
||||
}
|
||||
|
||||
fun result() = "OK"
|
||||
}
|
||||
|
||||
fun getResult(): String {
|
||||
log += "before;"
|
||||
val result = O.result()
|
||||
log += "after;"
|
||||
return result
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
val result = getResult()
|
||||
if (result != "OK") return "fail: unexpected result: $result"
|
||||
|
||||
if (log != "before;O.init;after;") return "fail: wrong evaluation order: $log"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1382
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
object O {
|
||||
val result = "OK"
|
||||
|
||||
inline fun foo(): String {
|
||||
val o = object {
|
||||
fun bar() = O
|
||||
}
|
||||
return fetch(o.bar())
|
||||
}
|
||||
}
|
||||
|
||||
fun fetch(o: O) = o.result
|
||||
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box() = O.foo()
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1284
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
object O
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
var o: Any = O
|
||||
if (o !is O) return "fail1"
|
||||
if (!(o is O)) return "fail2"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1290
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
package lib
|
||||
|
||||
class A(val x: Int)
|
||||
|
||||
fun A.foo() = 23 + x
|
||||
|
||||
inline fun A.baz() = 99 + x
|
||||
|
||||
inline fun A.callFoo() = foo()
|
||||
|
||||
inline fun A.buzz(): Int {
|
||||
val o = object {
|
||||
fun f() = 111 + x
|
||||
}
|
||||
return o.f()
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
val a = A(1).foo()
|
||||
if (a != 24) return "fail: simple function: $a"
|
||||
|
||||
val c = A(1).baz()
|
||||
if (c != 100) return "fail: inline function: $c"
|
||||
|
||||
val d = A(1).buzz()
|
||||
if (d != 112) return "fail: inline function with object expression: $d"
|
||||
|
||||
val e = A(2).callFoo()
|
||||
if (e != 25) return "fail: inline function calling another function: $e"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1287
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
package lib
|
||||
|
||||
fun foo() = 23
|
||||
|
||||
external fun bar(): Int = definedExternally
|
||||
|
||||
inline fun baz() = 99
|
||||
|
||||
inline fun callFoo() = foo()
|
||||
|
||||
inline fun buzz(): Int {
|
||||
val o = object {
|
||||
fun f() = 111
|
||||
}
|
||||
return o.f()
|
||||
}
|
||||
|
||||
// FILE: lib.js
|
||||
|
||||
function bar() {
|
||||
return 42;
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
|
||||
package main
|
||||
|
||||
fun box(): String {
|
||||
val a = lib.foo()
|
||||
if (a != 23) return "fail: simple function: $a"
|
||||
|
||||
val b = lib.bar()
|
||||
if (b != 42) return "fail: native function: $b"
|
||||
|
||||
val c = lib.baz()
|
||||
if (c != 99) return "fail: inline function: $c"
|
||||
|
||||
val d = lib.buzz()
|
||||
if (d != 111) return "fail: inline function with object expression: $d"
|
||||
|
||||
val e = lib.callFoo()
|
||||
if (e != 23) return "fail: inline function calling another function: $e"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1286
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
var foo = 23
|
||||
|
||||
var bar: Int = 42
|
||||
get() = field
|
||||
set(value) {
|
||||
field = value
|
||||
}
|
||||
|
||||
@JsName("faz") var baz = 99
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: lib.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
if (foo != 23) return "fail: simple property initial value: $foo"
|
||||
foo = 24
|
||||
if (foo != 24) return "fail: simple property new value: $foo"
|
||||
|
||||
if (bar != 42) return "fail: property with accessor initial value: $bar"
|
||||
bar = 43
|
||||
if (bar != 43) return "fail: property with accessor new value: $bar"
|
||||
|
||||
if (baz != 99) return "fail: renamed property initial value: $baz"
|
||||
baz = 100
|
||||
if (baz != 100) return "fail: renamed property new value: $baz"
|
||||
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: JS
|
||||
// ES_MODULES
|
||||
// SPLIT_PER_MODULE
|
||||
// EXPECTED_REACHABLE_NODES: 1287
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
package lib
|
||||
|
||||
val foo = 23
|
||||
|
||||
val boo: Int
|
||||
get() = 42
|
||||
|
||||
external val bar: Int = definedExternally
|
||||
|
||||
external val far: Int
|
||||
get() = definedExternally
|
||||
|
||||
// TODO: annotations like this are not serialized properly. Uncomment after KT-14529 gets fixed
|
||||
/*
|
||||
val fuzz: Int
|
||||
@JsName("getBuzz") get() = 55
|
||||
*/
|
||||
|
||||
inline fun fetchFoo() = foo
|
||||
|
||||
@JsName("fee")
|
||||
val tee = 2525
|
||||
|
||||
// FILE: lib.js
|
||||
|
||||
var bar = 99
|
||||
var far = 111
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: lib.kt
|
||||
package main
|
||||
|
||||
import lib.*
|
||||
|
||||
fun box(): String {
|
||||
if (foo != 23) return "fail: simple property: $foo"
|
||||
if (boo != 42) return "fail: property with accessor: $boo"
|
||||
if (bar != 99) return "fail: native property: $bar"
|
||||
if (far != 111) return "fail: native property with accessor: $far"
|
||||
//if (fuzz != 55) return "fail: property with JsName on accessor: $fuzz"
|
||||
if (tee != 2525) return "fail: native property with JsName: $tee"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user