[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
@@ -605,14 +605,15 @@ class GenerateIrRuntime {
symbolTable,
additionalExportedDeclarationNames = emptySet(),
keep = emptySet(),
configuration
configuration,
null
)
ExternalDependenciesGenerator(symbolTable, listOf(jsLinker)).generateUnboundSymbolsAsDependencies()
jsPhases.invokeToplevel(phaseConfig, context, listOf(module))
val transformer = IrModuleToJsTransformer(context, null)
val transformer = IrModuleToJsTransformer(context, shouldReferMainFunction = false)
return transformer.generateModule(listOf(module), setOf(TranslationMode.PER_MODULE_DEV), false)
}
@@ -25,10 +25,7 @@ import org.jetbrains.kotlin.ir.backend.js.SourceMapsInfo
import org.jetbrains.kotlin.ir.backend.js.WholeWorldStageController
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.JsGenerationGranularity
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.backend.js.transformers.irToJs.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.converters.ClassicJsBackendFacade
@@ -44,6 +41,7 @@ import org.jetbrains.kotlin.test.builders.LanguageVersionSettingsBuilder
import org.jetbrains.kotlin.test.util.JUnit4Assertions
import org.jetbrains.kotlin.test.utils.TestDisposable
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.junit.ComparisonFailure
import org.junit.jupiter.api.AfterEach
import java.io.File
@@ -313,11 +311,16 @@ abstract class AbstractInvalidationTest(
)
}
private fun writeJsCode(stepId: Int, mainModuleName: String, jsOutput: CompilationOutputs): List<String> {
private fun writeJsCode(
stepId: Int,
mainModuleName: String,
jsOutput: CompilationOutputs,
dtsStrategy: TsCompilationStrategy
): List<String> {
val compiledJsFiles = jsOutput.writeAll(
jsDir,
mainModuleName,
true,
dtsStrategy,
mainModuleName,
projectInfo.moduleKind
).filter {
@@ -341,6 +344,12 @@ abstract class AbstractInvalidationTest(
fun execute() {
if (granularity in projectInfo.ignoredGranularities) return
val mainArguments = runIf(projectInfo.callMain) { emptyList<String>() }
val dtsStrategy = when (granularity) {
JsGenerationGranularity.PER_FILE -> TsCompilationStrategy.EACH_FILE
else -> TsCompilationStrategy.MERGED
}
for (projStep in projectInfo.steps) {
val testInfo = projStep.order.map { setupTestStep(projStep, it) }
@@ -363,10 +372,10 @@ abstract class AbstractInvalidationTest(
cacheDir = buildDir.resolve("incremental-cache").absolutePath,
compilerConfiguration = configuration,
irFactory = { IrFactoryImplForJsIC(WholeWorldStageController()) },
mainArguments = null,
compilerInterfaceFactory = { mainModule, cfg ->
JsIrCompilerWithIC(
mainModule,
mainArguments,
cfg,
granularity,
getPhaseConfig(projStep.id),
@@ -390,7 +399,7 @@ abstract class AbstractInvalidationTest(
)
val (jsOutput, rebuiltModules) = jsExecutableProducer.buildExecutable(granularity, outJsProgram = true)
val writtenFiles = writeJsCode(projStep.id, mainModuleName, jsOutput)
val writtenFiles = writeJsCode(projStep.id, mainModuleName, jsOutput, dtsStrategy)
verifyJsExecutableProducerBuildModules(projStep.id, rebuiltModules, dirtyData)
verifyJsCode(projStep.id, mainModuleName, writtenFiles)
@@ -138,10 +138,13 @@ class JsIrBackendFacade(
PhaseConfig(jsPhases)
}
val mainArguments = JsEnvironmentConfigurator.getMainCallParametersForModule(module)
.run { if (shouldBeGenerated()) arguments() else null }
val loweredIr = compileIr(
irModuleFragment.apply { resolveTestPaths() },
MainModule.Klib(inputArtifact.outputFile.absolutePath),
mainArguments,
configuration,
dependencyModules.onEach { it.resolveTestPaths() },
emptyMap(),
@@ -157,12 +160,10 @@ class JsIrBackendFacade(
granularity = granularity,
)
return loweredIr2JsArtifact(module, loweredIr)
return loweredIr2JsArtifact(module, loweredIr, mainArguments != null)
}
private fun loweredIr2JsArtifact(module: TestModule, loweredIr: LoweredIr): BinaryArtifacts.Js {
val mainArguments = JsEnvironmentConfigurator.getMainCallParametersForModule(module)
.run { if (shouldBeGenerated()) arguments() else null }
private fun loweredIr2JsArtifact(module: TestModule, loweredIr: LoweredIr, shouldReferMainFunction: Boolean): BinaryArtifacts.Js {
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in module.directives
val onlyIrDce = JsEnvironmentConfigurationDirectives.ONLY_IR_DCE in module.directives
val perModuleOnly = JsEnvironmentConfigurationDirectives.SPLIT_PER_MODULE in module.directives
@@ -178,12 +179,12 @@ class JsIrBackendFacade(
val transformer = IrModuleToJsTransformer(
loweredIr.context,
mainArguments,
moduleToName = runIf(isEsModules) {
loweredIr.allModules.associateWith {
"./${getJsArtifactSimpleName(testServices, it.safeName)}_v5".minifyIfNeed()
}
} ?: emptyMap()
} ?: emptyMap(),
shouldReferMainFunction,
)
// If runIrDce then include DCE results
// If perModuleOnly then skip whole program
@@ -290,7 +291,7 @@ class JsIrBackendFacade(
val tmpBuildDir = rootDir.resolve("tmp-build")
// CompilationOutputs keeps the `outputDir` clean by removing all outdated JS and other unknown files.
// To ensure that useful files around `outputFile`, such as irdump, are not removed, use `tmpBuildDir` instead.
val allJsFiles = writeAll(tmpBuildDir, outputFile.nameWithoutExtension, false, moduleId, moduleKind).filter {
val allJsFiles = writeAll(tmpBuildDir, outputFile.nameWithoutExtension, TsCompilationStrategy.NONE, moduleId, moduleKind).filter {
it.extension == "js" || it.extension == "mjs"
}
@@ -343,6 +343,12 @@ public class JsFirInvalidationPerFileTestGenerated extends AbstractJsFirInvalida
runTest("js/js.translator/testData/incremental/invalidation/localObjectsLeakThroughInterface/");
}
@Test
@TestMetadata("mainFunction")
public void testMainFunction() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainFunction/");
}
@Test
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
@@ -343,6 +343,12 @@ public class JsFirInvalidationPerModuleTestGenerated extends AbstractJsFirInvali
runTest("js/js.translator/testData/incremental/invalidation/localObjectsLeakThroughInterface/");
}
@Test
@TestMetadata("mainFunction")
public void testMainFunction() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainFunction/");
}
@Test
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
@@ -343,6 +343,12 @@ public class JsIrES6InvalidationPerFileTestGenerated extends AbstractJsIrES6Inva
runTest("js/js.translator/testData/incremental/invalidation/localObjectsLeakThroughInterface/");
}
@Test
@TestMetadata("mainFunction")
public void testMainFunction() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainFunction/");
}
@Test
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
@@ -343,6 +343,12 @@ public class JsIrES6InvalidationPerModuleTestGenerated extends AbstractJsIrES6In
runTest("js/js.translator/testData/incremental/invalidation/localObjectsLeakThroughInterface/");
}
@Test
@TestMetadata("mainFunction")
public void testMainFunction() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainFunction/");
}
@Test
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
@@ -343,6 +343,12 @@ public class JsIrInvalidationPerFileTestGenerated extends AbstractJsIrInvalidati
runTest("js/js.translator/testData/incremental/invalidation/localObjectsLeakThroughInterface/");
}
@Test
@TestMetadata("mainFunction")
public void testMainFunction() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainFunction/");
}
@Test
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
@@ -343,6 +343,12 @@ public class JsIrInvalidationPerModuleTestGenerated extends AbstractJsIrInvalida
runTest("js/js.translator/testData/incremental/invalidation/localObjectsLeakThroughInterface/");
}
@Test
@TestMetadata("mainFunction")
public void testMainFunction() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/mainFunction/");
}
@Test
@TestMetadata("mainModuleInvalidation")
public void testMainModuleInvalidation() throws Exception {
@@ -2598,6 +2598,64 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest {
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/main")
@TestDataPath("$PROJECT_ROOT")
public class Main {
@Test
public void testAllFilesPresentInMain() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/main"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
}
@Test
@TestMetadata("differentMains.kt")
public void testDifferentMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/differentMains.kt");
}
@Test
@TestMetadata("incremental.kt")
public void testIncremental() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/incremental.kt");
}
@Test
@TestMetadata("noArgs.kt")
public void testNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/noArgs.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/simple.kt");
}
@Test
@TestMetadata("suspendMain.kt")
public void testSuspendMain() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMain.kt");
}
@Test
@TestMetadata("suspendMainNoArgs.kt")
public void testSuspendMainNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainNoArgs.kt");
}
@Test
@TestMetadata("suspendMainThrows.kt")
public void testSuspendMainThrows() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainThrows.kt");
}
@Test
@TestMetadata("twoMains.kt")
public void testTwoMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/twoMains.kt");
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/native")
@TestDataPath("$PROJECT_ROOT")
@@ -2704,6 +2704,64 @@ public class FirJsES6BoxTestGenerated extends AbstractFirJsES6BoxTest {
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/main")
@TestDataPath("$PROJECT_ROOT")
public class Main {
@Test
public void testAllFilesPresentInMain() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/main"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
}
@Test
@TestMetadata("differentMains.kt")
public void testDifferentMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/differentMains.kt");
}
@Test
@TestMetadata("incremental.kt")
public void testIncremental() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/incremental.kt");
}
@Test
@TestMetadata("noArgs.kt")
public void testNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/noArgs.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/simple.kt");
}
@Test
@TestMetadata("suspendMain.kt")
public void testSuspendMain() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMain.kt");
}
@Test
@TestMetadata("suspendMainNoArgs.kt")
public void testSuspendMainNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainNoArgs.kt");
}
@Test
@TestMetadata("suspendMainThrows.kt")
public void testSuspendMainThrows() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainThrows.kt");
}
@Test
@TestMetadata("twoMains.kt")
public void testTwoMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/twoMains.kt");
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/native")
@TestDataPath("$PROJECT_ROOT")
@@ -2704,6 +2704,64 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/main")
@TestDataPath("$PROJECT_ROOT")
public class Main {
@Test
public void testAllFilesPresentInMain() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/main"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
}
@Test
@TestMetadata("differentMains.kt")
public void testDifferentMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/differentMains.kt");
}
@Test
@TestMetadata("incremental.kt")
public void testIncremental() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/incremental.kt");
}
@Test
@TestMetadata("noArgs.kt")
public void testNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/noArgs.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/simple.kt");
}
@Test
@TestMetadata("suspendMain.kt")
public void testSuspendMain() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMain.kt");
}
@Test
@TestMetadata("suspendMainNoArgs.kt")
public void testSuspendMainNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainNoArgs.kt");
}
@Test
@TestMetadata("suspendMainThrows.kt")
public void testSuspendMainThrows() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainThrows.kt");
}
@Test
@TestMetadata("twoMains.kt")
public void testTwoMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/twoMains.kt");
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/native")
@TestDataPath("$PROJECT_ROOT")
@@ -2598,6 +2598,64 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/main")
@TestDataPath("$PROJECT_ROOT")
public class Main {
@Test
public void testAllFilesPresentInMain() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/main"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
}
@Test
@TestMetadata("differentMains.kt")
public void testDifferentMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/differentMains.kt");
}
@Test
@TestMetadata("incremental.kt")
public void testIncremental() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/incremental.kt");
}
@Test
@TestMetadata("noArgs.kt")
public void testNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/noArgs.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/simple.kt");
}
@Test
@TestMetadata("suspendMain.kt")
public void testSuspendMain() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMain.kt");
}
@Test
@TestMetadata("suspendMainNoArgs.kt")
public void testSuspendMainNoArgs() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainNoArgs.kt");
}
@Test
@TestMetadata("suspendMainThrows.kt")
public void testSuspendMainThrows() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/suspendMainThrows.kt");
}
@Test
@TestMetadata("twoMains.kt")
public void testTwoMains() throws Exception {
runTest("js/js.translator/testData/box/esModules/main/twoMains.kt");
}
}
@Nested
@TestMetadata("js/js.translator/testData/box/esModules/native")
@TestDataPath("$PROJECT_ROOT")