[K/JS] Rework main function call to support it in per-file

This commit is contained in:
Artem Kobzar
2023-10-04 12:13:20 +00:00
committed by Space Team
parent faae5f9b38
commit eef57f216c
57 changed files with 1091 additions and 172 deletions
@@ -0,0 +1,24 @@
// EXPECTED_REACHABLE_NODES: 1281
// ES_MODULES
// CALL_MAIN
var ok: String = "OK"
fun main(args: Array<Int>) {
ok += "Fail Int"
}
fun main(args: Array<in String>) {
ok += "Fail IN"
}
fun main(args: Array<String>): Unit? {
ok += "Fail return Unit?"
return Unit
}
fun Any.main(args: Array<String>) {
ok += "Fail Any.main(...)"
}
fun box() = ok
@@ -0,0 +1,56 @@
// EXPECTED_REACHABLE_NODES: 1281
// ES_MODULES
// CALL_MAIN
// FILE: ok.kt
package ok
var ok: String = "fail"
// FILE: 1.kt
// RECOMPILE
package a.a
import ok.*
fun main(args: Array<String>) {
ok = "fail: b.b"
}
// FILE: 0.kt
package b
import ok.*
fun main(args: Array<String>) {
ok = "fail: b"
}
// FILE: 2.kt
package a
import ok.*
fun main(args: Array<String>) {
ok = "OK"
}
// FILE: 3.kt
package a.b
import ok.*
fun main(args: Array<String>) {
ok = "fail: a.b"
}
// FILE: main.kt
import ok.*
fun box() = ok
+11
View File
@@ -0,0 +1,11 @@
// EXPECTED_REACHABLE_NODES: 1281
// ES_MODULES
// CALL_MAIN
var ok: String = "fail"
fun main() {
ok = "OK"
}
fun box() = ok
+13
View File
@@ -0,0 +1,13 @@
// EXPECTED_REACHABLE_NODES: 1281
// ES_MODULES
// CALL_MAIN
var ok: String = "fail"
fun main(args: Array<String>) {
if (0 != args.size) error("fail")
ok = "OK"
}
fun box() = ok
@@ -0,0 +1,27 @@
// EXPECTED_REACHABLE_NODES: 1296
// ES_MODULES
// CALL_MAIN
import kotlin.coroutines.*
var ok: String = "fail"
var callback: () -> Unit = {}
suspend fun main(args: Array<String>) {
if (0 != args.size) error("Fail")
suspendCoroutine<Unit> { cont ->
callback = {
cont.resume(Unit)
}
}
ok = "OK"
}
fun box(): String {
if ("fail" != ok) return "Fail"
callback()
return ok
}
@@ -0,0 +1,25 @@
// EXPECTED_REACHABLE_NODES: 1296
// ES_MODULES
// CALL_MAIN
import kotlin.coroutines.*
var ok: String = "fail"
var callback: () -> Unit = {}
suspend fun main() {
suspendCoroutine<Unit> { cont ->
callback = {
cont.resume(Unit)
}
}
ok = "OK"
}
fun box(): String {
if ("fail" != ok) error("Fail")
callback()
return ok
}
@@ -0,0 +1,30 @@
// EXPECTED_REACHABLE_NODES: 1299
// ES_MODULES
// CALL_MAIN
import kotlin.coroutines.*
var callback: () -> Unit = {}
val exception = Exception()
suspend fun main() {
suspendCoroutine<Unit> { cont ->
callback = {
cont.resume(Unit)
}
}
throw exception
}
fun box(): String {
try {
callback()
} catch (e: Exception) {
if (e !== exception) return "Fail"
}
return "OK"
}
@@ -0,0 +1,18 @@
// EXPECTED_REACHABLE_NODES: 1281
// ES_MODULES
// CALL_MAIN
var o: String = "fail O"
var k: String = "K"
fun main() {
k = "fail K"
}
fun main(args: Array<String>) {
if (args.size != 0) error("Fail")
o = "O"
}
fun box() = o + k
@@ -0,0 +1,7 @@
package foo.bar
var ok = "Fail"
fun main() {
ok = "OK"
}
@@ -0,0 +1,20 @@
package foo.bar
var ok = "OK"
fun main(args: Array<Int>) {
ok += "Fail Int"
}
fun main(args: Array<in String>) {
ok += "Fail IN"
}
fun main(args: Array<String>): Unit? {
ok += "Fail return Unit?"
return Unit
}
fun Any.main(args: Array<String>) {
ok += "Fail Any.main(...)"
}
@@ -0,0 +1,19 @@
package foo.bar
import kotlin.coroutines.*
var ok: String = "fail"
var callback: () -> Unit = {}
suspend fun main(args: Array<String>) {
if (0 != args.size) error("Fail")
suspendCoroutine<Unit> { cont ->
callback = {
cont.resume(Unit)
}
}
ok = "OK"
}
@@ -0,0 +1,11 @@
package foo.bar
var ok = "fail"
fun main(args: Array<String>) {
if (args.size != 0) {
ok = "Fail with args zie"
} else {
ok = "OK"
}
}
@@ -0,0 +1,7 @@
package foo
import foo.bar.ok
fun main() {
ok = "OK2"
}
@@ -0,0 +1,10 @@
var ok = "Fail"
fun main() {
ok = "OK"
}
fun box(stepId: Int): String {
return when (stepId) {
0 -> ok
else -> "Unknown"
}
}
@@ -0,0 +1,13 @@
import foo.bar.ok
fun box(stepId: Int): String {
return when (stepId) {
0 -> ok
1 -> ok
2 -> ok
3 -> ok
4 -> ok
5 -> if (ok != "OK2") "Fail" else "OK"
else -> "Unknown"
}
}
@@ -0,0 +1,18 @@
import foo.bar.ok
import foo.bar.callback
fun box(stepId: Int): String {
return when (stepId) {
0 -> ok
1 -> ok
2 -> ok
3 -> {
if (ok != "fail") return "Fail"
callback()
ok
}
4 -> ok
5 -> if (ok != "OK2") "Fail" else "OK"
else -> "Unknown"
}
}
@@ -0,0 +1,13 @@
import foo.bar.ok
fun box(stepId: Int): String {
return when (stepId) {
0 -> ok
1 -> ok
2 -> ok
3 -> ok
4 -> ok
5 -> if (ok != "OK2") "Fail" else "OK"
else -> "Unknown"
}
}
@@ -0,0 +1,29 @@
STEP 0:
modifications:
U : m.0.kt -> m.kt
added file: m.kt
STEP 1:
modifications:
U : m.1.kt -> m.kt
U : f.1.kt -> f.kt
added file: f.kt
modified ir: m.kt
STEP 2:
modifications:
U : f.2.kt -> f.kt
modified ir: f.kt
STEP 3:
modifications:
U : f.3.kt -> f.kt
U : m.3.kt -> m.kt
modified ir: f.kt, m.kt
STEP 4:
modifications:
U : f.4.kt -> f.kt
U : m.4.kt -> m.kt
modified ir: f.kt, m.kt
STEP 5:
modifications:
U : l.5.kt -> l.kt
added file: l.kt
updated exports: f.kt
@@ -0,0 +1,27 @@
MODULES: main
CALL_MAIN: true
STEP 0:
libs: main
dirty js modules: main
dirty js files: main/m, main/m.export, main
STEP 1:
libs: main
dirty js modules: main
dirty js files: main/foo/bar/f, main/m, main
STEP 2:
libs: main
dirty js modules: main
dirty js files: main/foo/bar/f, main
STEP 3:
libs: main
dirty js modules: main
dirty js files: main/foo/bar/f, main/m, main
STEP 4:
libs: main
dirty js modules: main
dirty js files: main/foo/bar/f, main/m, main
STEP 5:
libs: main
dirty js modules: main
dirty js files: main/foo/l, main/foo/bar/f, main