[K/JS] Add serialization/deserialization for JsImport/JsExport nodes

This commit is contained in:
Artem Kobzar
2023-04-13 12:58:46 +00:00
committed by Space Team
parent 85644bbbf6
commit 5dc6da2b33
19 changed files with 196 additions and 22 deletions
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity
import org.jetbrains.kotlin.ir.backend.js.ic.*
import org.jetbrains.kotlin.ir.backend.js.jsPhases
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.extension
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.safeModuleName
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
@@ -58,8 +59,6 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
private val TEST_FILE_IGNORE_PATTERN = Regex("^.*\\..+\\.\\w\\w$")
private val JS_MODULE_KIND = ModuleKind.COMMON_JS
private const val SOURCE_MAPPING_URL_PREFIX = "//# sourceMappingURL="
}
@@ -114,11 +113,11 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
return File(File(buildDir, moduleName), "$moduleName.klib")
}
private fun createConfiguration(moduleName: String, language: List<String>): CompilerConfiguration {
private fun createConfiguration(moduleName: String, language: List<String>, moduleKind: ModuleKind): CompilerConfiguration {
val copy = environment.configuration.copy()
copy.put(CommonConfigurationKeys.MODULE_NAME, moduleName)
copy.put(JSConfigurationKeys.GENERATE_DTS, true)
copy.put(JSConfigurationKeys.MODULE_KIND, JS_MODULE_KIND)
copy.put(JSConfigurationKeys.MODULE_KIND, moduleKind)
copy.put(JSConfigurationKeys.PROPERTY_LAZY_INITIALIZATION, true)
copy.put(JSConfigurationKeys.SOURCE_MAP, true)
@@ -185,7 +184,7 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
friends += klibFile
}
}
val configuration = createConfiguration(module, projStep.language)
val configuration = createConfiguration(module, projStep.language, projectInfo.moduleKind)
outputKlibFile.delete()
buildKlib(configuration, module, moduleSourceDir, dependencies, friends, outputKlibFile)
}
@@ -241,7 +240,7 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
}
private fun File.writeAsJsModule(jsCode: String, moduleName: String) {
writeText(ClassicJsBackendFacade.wrapWithModuleEmulationMarkers(jsCode, JS_MODULE_KIND, moduleName))
writeText(ClassicJsBackendFacade.wrapWithModuleEmulationMarkers(jsCode, projectInfo.moduleKind, moduleName))
}
private fun prepareExternalJsFiles(): MutableList<String> {
@@ -258,12 +257,13 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
try {
V8IrJsTestChecker.checkWithTestFunctionArgs(
files = jsFiles,
testModuleName = "./$mainModuleName.js",
testModuleName = "./$mainModuleName${projectInfo.moduleKind.extension}",
testPackageName = null,
testFunctionName = BOX_FUNCTION_NAME,
testFunctionArgs = "$stepId",
expectedResult = "OK",
withModuleSystem = true
entryModulePath = jsFiles.last(),
withModuleSystem = projectInfo.moduleKind in setOf(ModuleKind.COMMON_JS, ModuleKind.UMD, ModuleKind.AMD)
)
} catch (e: ComparisonFailure) {
throw ComparisonFailure("Mismatched box out at step $stepId", e.expected, e.actual)
@@ -301,8 +301,8 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
}
private fun writeJsCode(stepId: Int, mainModuleName: String, jsOutput: CompilationOutputs): List<String> {
val compiledJsFiles = jsOutput.writeAll(jsDir, mainModuleName, true, mainModuleName, JS_MODULE_KIND).filter {
it.extension == "js"
val compiledJsFiles = jsOutput.writeAll(jsDir, mainModuleName, true, mainModuleName, projectInfo.moduleKind).filter {
it.extension == "js" || it.extension == "mjs"
}
for (jsCodeFile in compiledJsFiles) {
val sourceMappingUrlLine = jsCodeFile.readLines().singleOrNull { it.startsWith(SOURCE_MAPPING_URL_PREFIX) }
@@ -325,7 +325,7 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
error("module ${it.moduleName} has friends, but only main module may have the friends")
}
val configuration = createConfiguration(projStep.order.last(), projStep.language)
val configuration = createConfiguration(projStep.order.last(), projStep.language, projectInfo.moduleKind)
val cacheUpdater = CacheUpdater(
mainModule = mainModuleInfo.modulePath,
allModules = testInfo.mapTo(mutableListOf(STDLIB_KLIB)) { it.modulePath },
@@ -79,9 +79,10 @@ abstract class AbstractJsTestChecker {
testFunctionName: String,
testFunctionArgs: String,
expectedResult: String,
withModuleSystem: Boolean
withModuleSystem: Boolean,
entryModulePath: String? = null
) {
val actualResult = run(files, testModuleName, testPackageName, testFunctionName, testFunctionArgs, withModuleSystem)
val actualResult = run(files, testModuleName, testPackageName, testFunctionName, testFunctionArgs, withModuleSystem, entryModulePath)
Assert.assertEquals(expectedResult, actualResult.normalize())
}
@@ -115,6 +115,12 @@ public class JsFirInvalidationTestGenerated extends AbstractJsFirInvalidationTes
runTest("js/js.translator/testData/incremental/invalidation/enumsInInlineFunctions/");
}
@Test
@TestMetadata("esModules")
public void testEsModules() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/esModules/");
}
@Test
@TestMetadata("exceptionsFromInlineFunction")
public void testExceptionsFromInlineFunction() throws Exception {
@@ -115,6 +115,12 @@ public class JsIrES6InvalidationTestGenerated extends AbstractJsIrES6Invalidatio
runTest("js/js.translator/testData/incremental/invalidation/enumsInInlineFunctions/");
}
@Test
@TestMetadata("esModules")
public void testEsModules() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/esModules/");
}
@Test
@TestMetadata("exceptionsFromInlineFunction")
public void testExceptionsFromInlineFunction() throws Exception {
@@ -115,6 +115,12 @@ public class JsIrInvalidationTestGenerated extends AbstractJsIrInvalidationTest
runTest("js/js.translator/testData/incremental/invalidation/enumsInInlineFunctions/");
}
@Test
@TestMetadata("esModules")
public void testEsModules() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/esModules/");
}
@Test
@TestMetadata("exceptionsFromInlineFunction")
public void testExceptionsFromInlineFunction() throws Exception {
@@ -0,0 +1,2 @@
data class Demo(val x: Int) {
}
@@ -0,0 +1,2 @@
class Demo(val x: Int) {
}
@@ -0,0 +1,2 @@
inline class Demo(val x: Int) {
}
@@ -0,0 +1,16 @@
STEP 0:
modifications:
U : l1.0_data_class.kt -> l1.kt
added file: l1.kt
STEP 1:
modifications:
U : l1.1_simple_class.kt -> l1.kt
modified ir: l1.kt
STEP 2:
modifications:
U : l1.2_inline_class.kt -> l1.kt
modified ir: l1.kt
STEP 3:
modifications:
U : l1.1_simple_class.kt -> l1.kt
modified ir: l1.kt
@@ -0,0 +1,18 @@
fun box(stepId: Int): String {
val d = Demo(15)
when (stepId) {
0, 2 -> {
if (!testEquals(d, Demo(15))) return "Fail equals"
if (testHashCode(d) != Demo(15).hashCode()) return "Fail hashCode"
if (testToString(d) != "Demo(x=15)") return "Fail toString"
}
1, 3-> {
if (testEquals(d, Demo(15))) return "Fail equals"
if (testHashCode(d) == Demo(15).hashCode()) return "Fail hashCode"
if (testToString(d) != "[object Object]") return "Fail toString"
}
else -> return "Unknown"
}
return "OK"
}
@@ -0,0 +1,6 @@
STEP 0:
dependencies: lib1
added file: m.kt, testEquals.kt, testHashCode.kt, testToString.kt
STEP 1..3:
dependencies: lib1
updated imports: m.kt, testEquals.kt, testHashCode.kt, testToString.kt
@@ -0,0 +1,3 @@
fun testEquals(lhs: Demo, rhs: Demo): Boolean {
return lhs == rhs
}
@@ -0,0 +1,3 @@
fun testHashCode(d: Demo): Int {
return d.hashCode()
}
@@ -0,0 +1,3 @@
fun testToString(d: Demo): String {
return d.toString()
}
@@ -0,0 +1,9 @@
MODULES: lib1, main
MODULE_KIND: es
STEP 0:
libs: lib1, main
dirty js: lib1, main
STEP 1..3:
libs: lib1, main
dirty js: lib1, main