[K/JS] Rework main function call to support it in per-file
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user