[JS IR] Support per-file mode and ES modules

This commit is contained in:
Svyatoslav Kuzmich
2021-02-23 15:44:06 +03:00
parent f479ac5c3a
commit 3f8dce4b53
140 changed files with 5136 additions and 609 deletions
@@ -0,0 +1,23 @@
// DONT_TARGET_EXACT_BACKEND: JS
// EXPECTED_REACHABLE_NODES: 1252
// INFER_MAIN_MODULE
// ES_MODULES
// MODULE: export-all-file
// FILE: lib.kt
@file:JsExport
abstract class A {
abstract fun foo(k: String): String
}
class B : A() {
override fun foo(k: String): String {
return "O" + k
}
}
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { B } from "./export-all-file/index.js";
console.assert(new B().foo("K") == "OK");
@@ -0,0 +1,16 @@
// DONT_TARGET_EXACT_BACKEND: JS
// SKIP_MINIFICATION
// INFER_MAIN_MODULE
// SKIP_NODE_JS
// ES_MODULES
// MODULE: non-identifier-module-name
// FILE: lib.kt
@JsName("foo")
@JsExport
public fun foo(k: String): String = "O$k"
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { foo } from "./non-identifier-module-name/index.js";
console.assert(foo("K") == "OK");
@@ -0,0 +1,39 @@
// DONT_TARGET_EXACT_BACKEND: JS
// EXPECTED_REACHABLE_NODES: 1252
// INFER_MAIN_MODULE
// ES_MODULES
// MODULE: overriden-chain-non-export-intermediate
// FILE: lib.kt
@JsExport
abstract class A {
abstract fun foo(): String
abstract fun bar(): String
}
abstract class B : A() {
abstract fun baz(): String
override fun foo(): String = "foo"
}
@JsExport
class C : B() {
override fun bar(): String = "bar"
override fun baz(): String = "baz"
fun bay(): String = "bay"
}
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { C } from "./overriden-chain-non-export-intermediate/index.js";
function test(c) {
if (c.foo() === "foo" && c.bar() === "bar" && c.bay() == "bay") return "OK"
return "fail"
}
console.assert(test(new C()) == "OK");
@@ -0,0 +1,41 @@
// EXPECTED_REACHABLE_NODES: 1252
// INFER_MAIN_MODULE
// DONT_TARGET_EXACT_BACKEND: JS
// ES_MODULES
// MODULE: overriden-external-method-with-same-name-method
// FILE: lib.kt
external abstract class Foo {
abstract fun o(): String
}
abstract class Bar : Foo() {
abstract fun String.o(): String
override fun o(): String {
return "O".o()
}
}
@JsExport
class Baz : Bar() {
override fun String.o(): String {
return this
}
}
// FILE: foo.js
function Foo() {}
Foo.prototype.k = function() {
return "K"
}
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { Baz } from "./overriden-external-method-with-same-name-method/index.js";
function test(foo) {
return foo.o() + foo.k()
}
console.assert(test(new Baz()) == "OK");
@@ -0,0 +1,44 @@
// EXPECTED_REACHABLE_NODES: 1252
// IGNORE_BACKEND: JS
// INFER_MAIN_MODULE
// ES_MODULES
// MODULE: overriden-external-method-with-same-stable-name-method
// FILE: lib.kt
external abstract class Foo {
abstract fun o(): String
}
abstract class Bar : Foo() {
@JsName("oStable")
abstract fun String.o(): String
override fun o(): String {
return "O".o()
}
}
@JsExport
class Baz : Bar() {
override fun String.o(): String {
return this
}
}
// FILE: foo.js
function Foo() {}
Foo.prototype.k = function() {
return "K"
}
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { Baz } from "./overriden-external-method-with-same-stable-name-method/index.js";
function test(foo) {
const oStable = foo.oStable("OK")
if (oStable !== "OK") return "false: " + oStable
return foo.o() + foo.k()
}
console.assert(test(new Baz()) == "OK");
@@ -0,0 +1,17 @@
// IGNORE_BACKEND: JS
// EXPECTED_REACHABLE_NODES: 1270
// SKIP_MINIFICATION
// INFER_MAIN_MODULE
// ES_MODULES
// MODULE: if
// FILE: lib.kt
@JsName("foo")
@JsExport
public fun foo(k: String): String = "O$k"
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { foo } from "./if/index.js";
console.assert(foo("K") == "OK");