[JS IR] tests both per-module and regular mode

This commit is contained in:
Anton Bannykh
2021-12-08 19:13:02 +03:00
parent 95b5c44fba
commit aa628ae7b3
17 changed files with 176 additions and 128 deletions
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.ir.backend.js.ic.*
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.SourceMapsInfo import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.SourceMapsInfo
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory
@@ -283,9 +284,11 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
val caches = loadModuleCaches(icCaches) val caches = loadModuleCaches(icCaches)
val moduleKind = configurationJs[JSConfigurationKeys.MODULE_KIND]!! val moduleKind = configurationJs[JSConfigurationKeys.MODULE_KIND]!!
val compiledModule = generateJsFromAst(moduleName, moduleKind, SourceMapsInfo.from(configurationJs), caches) val translationMode = TranslationMode.fromFlags(false, arguments.irPerModule)
val outputs = compiledModule.outputs!! val compiledModule = generateJsFromAst(moduleName, moduleKind, SourceMapsInfo.from(configurationJs), setOf(translationMode), caches)
val outputs = compiledModule.outputs.values.single()
outputFile.write(outputs) outputFile.write(outputs)
outputs.dependencies.forEach { (name, content) -> outputs.dependencies.forEach { (name, content) ->
@@ -408,18 +411,15 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
val transformer = IrModuleToJsTransformerTmp( val transformer = IrModuleToJsTransformerTmp(
ir.context, ir.context,
mainCallArguments, mainCallArguments,
fullJs = true,
dceJs = arguments.irDce,
multiModule = arguments.irPerModule,
relativeRequirePath = true, relativeRequirePath = true,
) )
transformer.generateModule(ir.allModules) transformer.generateModule(ir.allModules, setOf(TranslationMode.fromFlags(arguments.irDce, arguments.irPerModule)))
} else { } else {
val transformer = IrModuleToJsTransformer( val transformer = IrModuleToJsTransformer(
ir.context, ir.context,
mainCallArguments, mainCallArguments,
fullJs = true, fullJs = !arguments.irDce,
dceJs = arguments.irDce, dceJs = arguments.irDce,
multiModule = arguments.irPerModule, multiModule = arguments.irPerModule,
relativeRequirePath = true, relativeRequirePath = true,
@@ -430,11 +430,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
messageCollector.report(INFO, "Executable production duration: ${System.currentTimeMillis() - start}ms") messageCollector.report(INFO, "Executable production duration: ${System.currentTimeMillis() - start}ms")
val outputs = compiledModule.outputs.values.single()
val outputs = if (arguments.irDce && !arguments.irDceDriven)
compiledModule.outputsAfterDce!!
else
compiledModule.outputs!!
outputFile.write(outputs) outputFile.write(outputs)
outputs.dependencies.forEach { (name, content) -> outputs.dependencies.forEach { (name, content) ->
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.backend.js.lower.generateJsTests
import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.backend.js.utils.NameTables import org.jetbrains.kotlin.ir.backend.js.utils.NameTables
import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -30,8 +31,7 @@ import org.jetbrains.kotlin.js.config.RuntimeDiagnostic
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
class CompilerResult( class CompilerResult(
val outputs: CompilationOutputs?, val outputs: Map<TranslationMode, CompilationOutputs>,
val outputsAfterDce: CompilationOutputs?,
val tsDefinitions: String? = null val tsDefinitions: String? = null
) )
@@ -228,5 +228,5 @@ fun generateJsCode(
jsPhases.invokeToplevel(PhaseConfig(jsPhases), context, listOf(moduleFragment)) jsPhases.invokeToplevel(PhaseConfig(jsPhases), context, listOf(moduleFragment))
val transformer = IrModuleToJsTransformer(context, null, true, nameTables) val transformer = IrModuleToJsTransformer(context, null, true, nameTables)
return transformer.generateModule(listOf(moduleFragment)).outputs!!.jsCode return transformer.generateModule(listOf(moduleFragment)).outputs[TranslationMode.FULL]!!.jsCode
} }
@@ -92,9 +92,6 @@ fun compileWithIC(
val transformer = IrModuleToJsTransformerTmp( val transformer = IrModuleToJsTransformerTmp(
context, context,
mainArguments, mainArguments,
fullJs = generateFullJs,
dceJs = generateDceJs,
multiModule = multiModule,
relativeRequirePath = relativeRequirePath, relativeRequirePath = relativeRequirePath,
) )
@@ -129,24 +126,28 @@ fun generateJsFromAst(
mainModuleName: String, mainModuleName: String,
moduleKind: ModuleKind, moduleKind: ModuleKind,
sourceMapsInfo: SourceMapsInfo?, sourceMapsInfo: SourceMapsInfo?,
translationModes: Set<TranslationMode>,
caches: Map<String, ModuleCache>, caches: Map<String, ModuleCache>,
): CompilerResult { ): CompilerResult {
val deserializer = JsIrAstDeserializer() fun compilationOutput(multiModule: Boolean): CompilationOutputs {
val jsIrProgram = JsIrProgram(caches.values.map { val deserializer = JsIrAstDeserializer()
JsIrModule( val jsIrProgram = JsIrProgram(caches.values.map {
it.name.safeModuleName, JsIrModule(
sanitizeName(it.name.safeModuleName), it.name.safeModuleName,
it.asts.values.sortedBy { it.name }.mapNotNull { it.ast?.let { deserializer.deserialize(ByteArrayInputStream(it)) } }) sanitizeName(it.name.safeModuleName),
}) it.asts.values.sortedBy { it.name }.mapNotNull { it.ast?.let { deserializer.deserialize(ByteArrayInputStream(it)) } })
return CompilerResult( })
generateWrappedModuleBody(
multiModule = true, return generateWrappedModuleBody(
multiModule = multiModule,
mainModuleName = mainModuleName, mainModuleName = mainModuleName,
moduleKind = moduleKind, moduleKind = moduleKind,
jsIrProgram, jsIrProgram,
sourceMapsInfo = sourceMapsInfo, sourceMapsInfo = sourceMapsInfo,
relativeRequirePath = false, relativeRequirePath = false,
generateScriptModule = false, generateScriptModule = false,
), null )
) }
return CompilerResult(translationModes.associate { it to compilationOutput(it.perModule) }, null)
} }
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.js.sourceMap.SourceMapBuilderConsumer
import org.jetbrains.kotlin.js.util.TextOutputImpl import org.jetbrains.kotlin.js.util.TextOutputImpl
import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS
import java.io.File import java.io.File
import java.util.*
class IrModuleToJsTransformer( class IrModuleToJsTransformer(
private val backendContext: JsIrBackendContext, private val backendContext: JsIrBackendContext,
@@ -65,18 +66,20 @@ class IrModuleToJsTransformer(
namer.merge(module.files, additionalPackages) namer.merge(module.files, additionalPackages)
} }
val jsCode = if (fullJs) generateWrappedModuleBody(modules, exportedModule, namer) else null val code = EnumMap<TranslationMode, CompilationOutputs>(TranslationMode::class.java)
val dceJsCode = if (dceJs) { if (fullJs) code[TranslationMode.fromFlags(false, multiModule)] = generateWrappedModuleBody(modules, exportedModule, namer)
if (dceJs) {
eliminateDeadDeclarations(modules, backendContext, removeUnusedAssociatedObjects) eliminateDeadDeclarations(modules, backendContext, removeUnusedAssociatedObjects)
// Use a fresh namer for DCE so that we could compare the result with DCE-driven // Use a fresh namer for DCE so that we could compare the result with DCE-driven
// TODO: is this mode relevant for scripting? If yes, refactor so that the external name tables are used here when needed. // TODO: is this mode relevant for scripting? If yes, refactor so that the external name tables are used here when needed.
val namer = NameTables(emptyList(), context = backendContext) val namer = NameTables(emptyList(), context = backendContext)
namer.merge(modules.flatMap { it.files }, additionalPackages) namer.merge(modules.flatMap { it.files }, additionalPackages)
generateWrappedModuleBody(modules, exportedModule, namer) code[TranslationMode.fromFlags(true, multiModule)] = generateWrappedModuleBody(modules, exportedModule, namer)
} else null }
return CompilerResult(jsCode, dceJsCode, dts) return CompilerResult(code, dts)
} }
private fun generateWrappedModuleBody(modules: Iterable<IrModuleFragment>, exportedModule: ExportedModule, namer: NameTables): CompilationOutputs { private fun generateWrappedModuleBody(modules: Iterable<IrModuleFragment>, exportedModule: ExportedModule, namer: NameTables): CompilationOutputs {
@@ -30,15 +30,30 @@ import org.jetbrains.kotlin.js.util.TextOutputImpl
import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.serialization.js.ModuleKind
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
import java.util.*
enum class TranslationMode(val dce: Boolean, val perModule: Boolean) {
FULL(dce = false, perModule = false),
FULL_DCE(dce = true, perModule = false),
PER_MODULE(dce = false, perModule = true),
PER_MODULE_DCE(dce = true, perModule = true);
companion object {
fun fromFlags(dce: Boolean, perModule: Boolean): TranslationMode {
return if (perModule) {
if (dce) PER_MODULE_DCE else PER_MODULE
} else {
if (dce) FULL_DCE else FULL
}
}
}
}
class IrModuleToJsTransformerTmp( class IrModuleToJsTransformerTmp(
private val backendContext: JsIrBackendContext, private val backendContext: JsIrBackendContext,
private val mainArguments: List<String>?, private val mainArguments: List<String>?,
private val generateScriptModule: Boolean = false, private val generateScriptModule: Boolean = false,
var namer: NameTables = NameTables(emptyList(), context = backendContext), var namer: NameTables = NameTables(emptyList(), context = backendContext),
private val fullJs: Boolean = true,
private val dceJs: Boolean = false,
private val multiModule: Boolean = false,
private val relativeRequirePath: Boolean = false, private val relativeRequirePath: Boolean = false,
private val moduleToName: Map<IrModuleFragment, String> = emptyMap(), private val moduleToName: Map<IrModuleFragment, String> = emptyMap(),
private val removeUnusedAssociatedObjects: Boolean = true, private val removeUnusedAssociatedObjects: Boolean = true,
@@ -48,7 +63,7 @@ class IrModuleToJsTransformerTmp(
private val mainModuleName = backendContext.configuration[CommonConfigurationKeys.MODULE_NAME]!! private val mainModuleName = backendContext.configuration[CommonConfigurationKeys.MODULE_NAME]!!
private val moduleKind = backendContext.configuration[JSConfigurationKeys.MODULE_KIND]!! private val moduleKind = backendContext.configuration[JSConfigurationKeys.MODULE_KIND]!!
fun generateModule(modules: Iterable<IrModuleFragment>): CompilerResult { fun generateModule(modules: Iterable<IrModuleFragment>, modes: Set<TranslationMode>): CompilerResult {
val exportModelGenerator = ExportModelGenerator(backendContext, generateNamespacesForPackages = true) val exportModelGenerator = ExportModelGenerator(backendContext, generateNamespacesForPackages = true)
val exportData = modules.associate { module -> val exportData = modules.associate { module ->
@@ -63,7 +78,7 @@ class IrModuleToJsTransformerTmp(
module.files.forEach { StaticMembersLowering(backendContext).lower(it) } module.files.forEach { StaticMembersLowering(backendContext).lower(it) }
} }
val jsCode = if (fullJs) generateWrappedModuleBody( fun compilationOutput(multiModule: Boolean) = generateWrappedModuleBody(
multiModule, multiModule,
mainModuleName, mainModuleName,
moduleKind, moduleKind,
@@ -71,23 +86,23 @@ class IrModuleToJsTransformerTmp(
SourceMapsInfo.from(backendContext.configuration), SourceMapsInfo.from(backendContext.configuration),
relativeRequirePath, relativeRequirePath,
generateScriptModule, generateScriptModule,
) else null )
val dceJsCode = if (dceJs) { val result = EnumMap<TranslationMode, CompilationOutputs>(TranslationMode::class.java)
modes.filter { !it.dce }.forEach {
result[it] = compilationOutput(it.perModule)
}
if (modes.any { it.dce }) {
eliminateDeadDeclarations(modules, backendContext, removeUnusedAssociatedObjects) eliminateDeadDeclarations(modules, backendContext, removeUnusedAssociatedObjects)
}
generateWrappedModuleBody( modes.filter { it.dce }.forEach {
multiModule, result[it] = compilationOutput(it.perModule)
mainModuleName, }
moduleKind,
generateProgramFragments(modules, exportData),
SourceMapsInfo.from(backendContext.configuration),
relativeRequirePath,
generateScriptModule,
)
} else null
return CompilerResult(jsCode, dceJsCode, dts) return CompilerResult(result, dts)
} }
fun generateBinaryAst(files: Iterable<IrFile>): Map<String, ByteArray> { fun generateBinaryAst(files: Iterable<IrFile>): Map<String, ByteArray> {
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.js.config.* import org.jetbrains.kotlin.js.config.*
import org.jetbrains.kotlin.js.facade.MainCallParameters import org.jetbrains.kotlin.js.facade.MainCallParameters
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
@@ -52,10 +53,14 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
const val TEST_DATA_DIR_PATH = "js/js.translator/testData" const val TEST_DATA_DIR_PATH = "js/js.translator/testData"
const val OLD_MODULE_SUFFIX = "_old" const val OLD_MODULE_SUFFIX = "_old"
private const val OUTPUT_DIR_NAME = "outputDir" private val outputDirByMode = mapOf(
private const val RECOMPILED_OUTPUT_DIR_NAME = "outputDir-recompiled" TranslationMode.FULL to "outputDir",
TranslationMode.FULL_DCE to "dceOutputDir",
TranslationMode.PER_MODULE to "perModuleOutputDir",
TranslationMode.PER_MODULE_DCE to "perModuleDceOutputDir"
)
private const val OUTPUT_KLIB_DIR_NAME = "outputKlibDir" private const val OUTPUT_KLIB_DIR_NAME = "outputKlibDir"
private const val DCE_OUTPUT_DIR_NAME = "dceOutputDir"
private const val MINIFICATION_OUTPUT_DIR_NAME = "minOutputDir" private const val MINIFICATION_OUTPUT_DIR_NAME = "minOutputDir"
object ExceptionThrowingReporter : JsConfig.Reporter() { object ExceptionThrowingReporter : JsConfig.Reporter() {
@@ -77,38 +82,30 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
return testName + outputFileSuffix return testName + outputFileSuffix
} }
fun getJsModuleArtifactPath(testServices: TestServices, moduleName: String): String { fun getJsModuleArtifactPath(testServices: TestServices, moduleName: String, translationMode: TranslationMode = TranslationMode.FULL): String {
return getJsArtifactsOutputDir(testServices).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName) + "_v5" return getJsArtifactsOutputDir(testServices, translationMode).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName) + "_v5"
} }
fun getRecompiledJsModuleArtifactPath(testServices: TestServices, moduleName: String): String { fun getRecompiledJsModuleArtifactPath(testServices: TestServices, moduleName: String, translationMode: TranslationMode = TranslationMode.FULL): String {
return getJsArtifactsRecompiledOutputDir(testServices).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName) + "_v5" return getJsArtifactsRecompiledOutputDir(testServices, translationMode).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName) + "_v5"
} }
fun getJsKlibArtifactPath(testServices: TestServices, moduleName: String): String { fun getJsKlibArtifactPath(testServices: TestServices, moduleName: String): String {
return getJsKlibOutputDir(testServices).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName) return getJsKlibOutputDir(testServices).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName)
} }
fun getDceJsArtifactPath(testServices: TestServices, moduleName: String): String { fun getJsArtifactsOutputDir(testServices: TestServices, translationMode: TranslationMode = TranslationMode.FULL): File {
return getDceJsArtifactsOutputDir(testServices).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName) + "_v5" return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(outputDirByMode[translationMode]!!)
} }
fun getJsArtifactsOutputDir(testServices: TestServices): File { fun getJsArtifactsRecompiledOutputDir(testServices: TestServices, translationMode: TranslationMode = TranslationMode.FULL): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(OUTPUT_DIR_NAME) return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(outputDirByMode[translationMode]!! + "-recompiled")
}
fun getJsArtifactsRecompiledOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(RECOMPILED_OUTPUT_DIR_NAME)
} }
fun getJsKlibOutputDir(testServices: TestServices): File { fun getJsKlibOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(OUTPUT_KLIB_DIR_NAME) return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(OUTPUT_KLIB_DIR_NAME)
} }
fun getDceJsArtifactsOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(DCE_OUTPUT_DIR_NAME)
}
fun getMinificationJsArtifactsOutputDir(testServices: TestServices): File { fun getMinificationJsArtifactsOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(MINIFICATION_OUTPUT_DIR_NAME) return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(MINIFICATION_OUTPUT_DIR_NAME)
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.ir.backend.js.* import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
@@ -45,15 +46,12 @@ abstract class AbstractJsKLibABITestCase : AbstractKlibABITestCase() {
val transformer = IrModuleToJsTransformerTmp( val transformer = IrModuleToJsTransformerTmp(
ir.context, ir.context,
emptyList(), emptyList(),
fullJs = true,
dceJs = true,
multiModule = true,
relativeRequirePath = false relativeRequirePath = false
) )
val compiledResult = transformer.generateModule(ir.allModules) val compiledResult = transformer.generateModule(ir.allModules, setOf(TranslationMode.FULL_DCE))
val dceOutput = compiledResult.outputsAfterDce ?: error("No DCE output") val dceOutput = compiledResult.outputs[TranslationMode.FULL_DCE] ?: error("No DCE output")
val binariesDir = File(buildDir, BIN_DIR_NAME).also { it.mkdirs() } val binariesDir = File(buildDir, BIN_DIR_NAME).also { it.mkdirs() }
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.SourceMapsInfo import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.SourceMapsInfo
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
@@ -98,10 +98,11 @@ class JsIrBackendFacade(
val moduleName = configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME) val moduleName = configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)
val moduleKind = configuration.get(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN) val moduleKind = configuration.get(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN)
val sourceMapsInfo = SourceMapsInfo.from(configuration) val sourceMapsInfo = SourceMapsInfo.from(configuration)
val compiledModule = generateJsFromAst(moduleName, moduleKind, sourceMapsInfo, testServices.jsIrIncrementalDataProvider.getCaches()) val translationModes = setOf(TranslationMode.FULL, TranslationMode.PER_MODULE)
val compiledModule = generateJsFromAst(moduleName, moduleKind, sourceMapsInfo, translationModes, testServices.jsIrIncrementalDataProvider.getCaches())
return BinaryArtifacts.Js.JsIrArtifact( return BinaryArtifacts.Js.JsIrArtifact(
outputFile, compiledModule, testServices.jsIrIncrementalDataProvider.getCacheForModule(module) outputFile, compiledModule, testServices.jsIrIncrementalDataProvider.getCacheForModule(module)
).dump(module) ).dump(module, firstTimeCompilation)
} }
val loweredIr = compileIr( val loweredIr = compileIr(
@@ -140,21 +141,23 @@ class JsIrBackendFacade(
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in module.directives val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in module.directives
val esModules = JsEnvironmentConfigurationDirectives.ES_MODULES in module.directives val esModules = JsEnvironmentConfigurationDirectives.ES_MODULES in module.directives
val runNewIr2Js = JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS in module.directives val runNewIr2Js = JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS in module.directives
val perModuleOnly = JsEnvironmentConfigurationDirectives.SPLIT_PER_MODULE in module.directives
val outputFile = File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name) + ".js") val outputFile = File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL) + ".js")
val dceOutputFile = File(JsEnvironmentConfigurator.getDceJsArtifactPath(testServices, module.name) + ".js") val dceOutputFile = File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL_DCE) + ".js")
if (!esModules) { if (!esModules) {
if (runNewIr2Js) { if (runNewIr2Js) {
val transformer = IrModuleToJsTransformerTmp( val transformer = IrModuleToJsTransformerTmp(
loweredIr.context, loweredIr.context,
mainArguments, mainArguments,
fullJs = true,
dceJs = runIrDce,
multiModule = granularity == JsGenerationGranularity.PER_MODULE,
relativeRequirePath = false relativeRequirePath = false
) )
return BinaryArtifacts.Js.JsIrArtifact(outputFile, transformer.generateModule(loweredIr.allModules)).dump(module) // If runIrDce then include DCE results
// If perModuleOnly then skip whole program
// (it.dce => runIrDce) && (perModuleOnly => it.perModule)
val translationModes = TranslationMode.values().filter { (!it.dce || runIrDce) && (!perModuleOnly || it.perModule) }.toSet()
return BinaryArtifacts.Js.JsIrArtifact(outputFile, transformer.generateModule(loweredIr.allModules, translationModes)).dump(module)
} else { } else {
val transformer = IrModuleToJsTransformer( val transformer = IrModuleToJsTransformer(
loweredIr.context, loweredIr.context,
@@ -257,18 +260,23 @@ class JsIrBackendFacade(
} }
} }
private fun BinaryArtifacts.Js.JsIrArtifact.dump(module: TestModule): BinaryArtifacts.Js.JsIrArtifact { private fun BinaryArtifacts.Js.JsIrArtifact.dump(module: TestModule, firstTimeCompilation: Boolean = true): BinaryArtifacts.Js.JsIrArtifact {
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
val moduleId = configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME) val moduleId = configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)
val moduleKind = configuration.get(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN) val moduleKind = configuration.get(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN)
val outputDceFile = File(JsEnvironmentConfigurator.getDceJsArtifactPath(testServices, module.name) + ".js")
val generateDts = JsEnvironmentConfigurationDirectives.GENERATE_DTS in module.directives val generateDts = JsEnvironmentConfigurationDirectives.GENERATE_DTS in module.directives
val dontSkipRegularMode = JsEnvironmentConfigurationDirectives.SKIP_REGULAR_MODE !in module.directives val dontSkipRegularMode = JsEnvironmentConfigurationDirectives.SKIP_REGULAR_MODE !in module.directives
if (dontSkipRegularMode) { if (dontSkipRegularMode) {
compilerResult.outputs!!.writeTo(outputFile, moduleId, moduleKind) for ((mode, output) in compilerResult.outputs.entries) {
compilerResult.outputsAfterDce?.writeTo(outputDceFile, moduleId, moduleKind) val outputFile = if (firstTimeCompilation) {
File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + ".js")
} else {
File(JsEnvironmentConfigurator.getRecompiledJsModuleArtifactPath(testServices, module.name, mode) + ".js")
}
output.writeTo(outputFile, moduleId, moduleKind)
}
} }
if (generateDts) { if (generateDts) {
@@ -328,7 +336,9 @@ class JsIrBackendFacade(
} }
} }
fun File.augmentWithModuleName(moduleName: String): File { fun String.augmentWithModuleName(moduleName: String): String {
check(absolutePath.endsWith("_v5.js")) check(endsWith("_v5.js"))
return File(absolutePath.removeSuffix("_v5.js") + "-${moduleName}_v5.js") return removeSuffix("_v5.js") + "-${moduleName}_v5.js"
} }
fun File.augmentWithModuleName(moduleName: String): File = File(absolutePath.augmentWithModuleName(moduleName))
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.js.test.handlers package org.jetbrains.kotlin.js.test.handlers
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.test.backend.handlers.JsBinaryArtifactHandler import org.jetbrains.kotlin.test.backend.handlers.JsBinaryArtifactHandler
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives
import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.BinaryArtifacts
@@ -28,13 +29,19 @@ class JsArtifactsDumpHandler(testServices: TestServices) : JsBinaryArtifactHandl
val testGroupOutputDirForCompilation = File(pathToRootOutputDir + "out/" + testGroupOutputDirPrefix) val testGroupOutputDirForCompilation = File(pathToRootOutputDir + "out/" + testGroupOutputDirPrefix)
val testGroupOutputDirForMinification = File(pathToRootOutputDir + "out-min/" + testGroupOutputDirPrefix) val testGroupOutputDirForMinification = File(pathToRootOutputDir + "out-min/" + testGroupOutputDirPrefix)
val testGroupOutputDirForPerModuleCompilation = File(pathToRootOutputDir + "out-per-module/" + testGroupOutputDirPrefix)
val testGroupOutputDirForPerModuleMinification = File(pathToRootOutputDir + "out-per-module-min/" + testGroupOutputDirPrefix)
val outputDir = getOutputDir(originalFile, testGroupOutputDirForCompilation, stopFile) val outputDir = getOutputDir(originalFile, testGroupOutputDirForCompilation, stopFile)
val dceOutputDir = getOutputDir(originalFile, testGroupOutputDirForMinification, stopFile) val dceOutputDir = getOutputDir(originalFile, testGroupOutputDirForMinification, stopFile)
val perModuleOutputDir = getOutputDir(originalFile, testGroupOutputDirForPerModuleCompilation, stopFile)
val preModuleDceOutputDir = getOutputDir(originalFile, testGroupOutputDirForPerModuleMinification, stopFile)
val minOutputDir = File(dceOutputDir, originalFile.nameWithoutExtension) val minOutputDir = File(dceOutputDir, originalFile.nameWithoutExtension)
copy(JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices), outputDir) copy(JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices), outputDir)
copy(JsEnvironmentConfigurator.getDceJsArtifactsOutputDir(testServices), dceOutputDir) copy(JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices, TranslationMode.FULL_DCE), dceOutputDir)
copy(JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices, TranslationMode.PER_MODULE), perModuleOutputDir)
copy(JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices, TranslationMode.PER_MODULE_DCE), preModuleDceOutputDir)
copy(JsEnvironmentConfigurator.getMinificationJsArtifactsOutputDir(testServices), minOutputDir) copy(JsEnvironmentConfigurator.getMinificationJsArtifactsOutputDir(testServices), minOutputDir)
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.js.test.handlers package org.jetbrains.kotlin.js.test.handlers
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.js.backend.ast.JsExpressionStatement import org.jetbrains.kotlin.js.backend.ast.JsExpressionStatement
import org.jetbrains.kotlin.js.backend.ast.JsNullLiteral import org.jetbrains.kotlin.js.backend.ast.JsNullLiteral
import org.jetbrains.kotlin.js.backend.ast.JsProgram import org.jetbrains.kotlin.js.backend.ast.JsProgram
@@ -26,7 +27,7 @@ class JsAstHandler(testServices: TestServices) : JsBinaryArtifactHandler(testSer
val ktFiles = module.files.filter { it.isKtFile }.map { it.originalContent } val ktFiles = module.files.filter { it.isKtFile }.map { it.originalContent }
val jsProgram = when (val artifact = info.unwrap()) { val jsProgram = when (val artifact = info.unwrap()) {
is BinaryArtifacts.Js.OldJsArtifact -> (artifact.translationResult as TranslationResult.Success).program is BinaryArtifacts.Js.OldJsArtifact -> (artifact.translationResult as TranslationResult.Success).program
is BinaryArtifacts.Js.JsIrArtifact -> artifact.compilerResult.outputs?.jsProgram ?: return is BinaryArtifacts.Js.JsIrArtifact -> artifact.compilerResult.outputs[TranslationMode.FULL]?.jsProgram ?: return
else -> return else -> return
} }
processJsProgram(jsProgram, ktFiles, module.targetBackend!!) processJsProgram(jsProgram, ktFiles, module.targetBackend!!)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.js.test.handlers package org.jetbrains.kotlin.js.test.handlers
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.js.testOld.engines.ExternalTool import org.jetbrains.kotlin.js.testOld.engines.ExternalTool
import org.jetbrains.kotlin.js.test.utils.* import org.jetbrains.kotlin.js.test.utils.*
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives
@@ -34,22 +35,16 @@ class JsBoxRunner(testServices: TestServices) : AbstractJsArtifactsCollector(tes
if (dontRunGeneratedCode) return if (dontRunGeneratedCode) return
val (allJsFiles, dceAllJsFiles) = getAllFilesForRunner(testServices, modulesToArtifact) val allJsFiles = getAllFilesForRunner(testServices, modulesToArtifact)
val withModuleSystem = testWithModuleSystem(testServices) val withModuleSystem = testWithModuleSystem(testServices)
val testModuleName = getTestModuleName(testServices) val testModuleName = getTestModuleName(testServices)
val testPackage = extractTestPackage(testServices) val testPackage = extractTestPackage(testServices)
val dontSkipRegularMode = JsEnvironmentConfigurationDirectives.SKIP_REGULAR_MODE !in globalDirectives val dontSkipRegularMode = JsEnvironmentConfigurationDirectives.SKIP_REGULAR_MODE !in globalDirectives
val dontSkipIrIc = JsEnvironmentConfigurationDirectives.SKIP_IR_INCREMENTAL_CHECKS !in globalDirectives
val recompile = testServices.moduleStructure.modules
.flatMap { it.files }.any { JsEnvironmentConfigurationDirectives.RECOMPILE in it.directives }
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in globalDirectives
if (dontSkipRegularMode) { if (dontSkipRegularMode) {
runGeneratedCode(allJsFiles, testModuleName, testPackage, withModuleSystem) for (jsFiles in allJsFiles.values) {
runGeneratedCode(jsFiles, testModuleName, testPackage, withModuleSystem)
if (runIrDce && !(dontSkipIrIc && recompile)) {
runGeneratedCode(dceAllJsFiles, testModuleName, testPackage, withModuleSystem)
} }
} }
} }
@@ -58,7 +53,7 @@ class JsBoxRunner(testServices: TestServices) : AbstractJsArtifactsCollector(tes
val globalDirectives = testServices.moduleStructure.allDirectives val globalDirectives = testServices.moduleStructure.allDirectives
val esmOutputDir = JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices).esModulesSubDir val esmOutputDir = JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices).esModulesSubDir
val esmDceOutputDir = JsEnvironmentConfigurator.getDceJsArtifactsOutputDir(testServices).esModulesSubDir val esmDceOutputDir = JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices, TranslationMode.FULL_DCE).esModulesSubDir
val dontSkipRegularMode = JsEnvironmentConfigurationDirectives.SKIP_REGULAR_MODE !in globalDirectives val dontSkipRegularMode = JsEnvironmentConfigurationDirectives.SKIP_REGULAR_MODE !in globalDirectives
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in globalDirectives val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in globalDirectives
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.js.test.handlers
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.fir.backend.FirMetadataSource import org.jetbrains.kotlin.fir.backend.FirMetadataSource
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.js.test.converters.ClassicJsBackendFacade import org.jetbrains.kotlin.js.test.converters.ClassicJsBackendFacade
import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName
import org.jetbrains.kotlin.test.backend.handlers.JsBinaryArtifactHandler import org.jetbrains.kotlin.test.backend.handlers.JsBinaryArtifactHandler
@@ -71,7 +72,7 @@ class JsIrRecompiledArtifactsIdentityHandler(testServices: TestServices) : JsBin
} }
private fun Js.JsIrArtifact.allFiles(): Collection<File> { private fun Js.JsIrArtifact.allFiles(): Collection<File> {
return listOf(outputFile) + compilerResult.outputs!!.dependencies.map { (moduleId, _) -> return listOf(outputFile) + compilerResult.outputs[TranslationMode.FULL]!!.dependencies.map { (moduleId, _) ->
outputFile.augmentWithModuleName(moduleId) outputFile.augmentWithModuleName(moduleId)
}.sortedBy { it.name } }.sortedBy { it.name }
} }
@@ -5,14 +5,17 @@
package org.jetbrains.kotlin.js.test.utils package org.jetbrains.kotlin.js.test.utils
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.js.JavaScript import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider
import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName
import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION
import org.jetbrains.kotlin.js.testOld.* import org.jetbrains.kotlin.js.testOld.*
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.serialization.js.ModuleKind
import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.NO_JS_MODULE_SYSTEM import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.NO_JS_MODULE_SYSTEM
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.RUN_PLAIN_BOX_FUNCTION import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.RUN_PLAIN_BOX_FUNCTION
import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.BinaryArtifacts
@@ -96,30 +99,53 @@ fun testWithModuleSystem(testServices: TestServices): Boolean {
fun getAllFilesForRunner( fun getAllFilesForRunner(
testServices: TestServices, modulesToArtifact: Map<TestModule, BinaryArtifacts.Js> testServices: TestServices, modulesToArtifact: Map<TestModule, BinaryArtifacts.Js>
): Pair<List<String>, List<String>> { ): Map<TranslationMode, List<String>> {
val originalFile = testServices.moduleStructure.originalTestDataFiles.first() val originalFile = testServices.moduleStructure.originalTestDataFiles.first()
val outputDir = JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices)
val dceOutputDir = JsEnvironmentConfigurator.getDceJsArtifactsOutputDir(testServices)
val commonFiles = JsAdditionalSourceProvider.getAdditionalJsFiles(originalFile.parent).map { it.absolutePath } val commonFiles = JsAdditionalSourceProvider.getAdditionalJsFiles(originalFile.parent).map { it.absolutePath }
val (inputJsFilesBefore, inputJsFilesAfter) = extractJsFiles(testServices, testServices.moduleStructure.modules) val (inputJsFilesBefore, inputJsFilesAfter) = extractJsFiles(testServices, testServices.moduleStructure.modules)
val additionalFiles = getAdditionalFiles(testServices) val additionalFiles = getAdditionalFiles(testServices)
val additionalMainFiles = getAdditionalMainFiles(testServices) val additionalMainFiles = getAdditionalMainFiles(testServices)
val artifactsPaths = modulesToArtifact.values.map { it.outputFile.absolutePath }.filter { !File(it).isDirectory } if (modulesToArtifact.values.any { it is BinaryArtifacts.Js.JsIrArtifact }) {
val klibDependencies = modulesToArtifact.values // JS IR
.filterIsInstance<BinaryArtifacts.Js.JsIrArtifact>() val (module, compilerResult) = modulesToArtifact.entries.mapNotNull { (m, c) -> (c as? BinaryArtifacts.Js.JsIrArtifact)?.let { m to c.compilerResult } }.single()
.singleOrNull()?.let { artifact ->
artifact.compilerResult.outputs?.dependencies?.map { (moduleId, _) -> val result = mutableMapOf<TranslationMode, List<String>>()
artifact.outputFile.absolutePath.replace("_v5.js", "-${moduleId}_v5.js")
compilerResult.outputs.entries.forEach { (mode, outputs) ->
val paths = mutableListOf<String>()
val outputFile = JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + ".js"
outputs.dependencies.forEach { (moduleId, _) ->
paths += outputFile.augmentWithModuleName(moduleId)
} }
} ?: emptyList() paths += outputFile
val dceJsFiles = (klibDependencies + artifactsPaths).map { it.replace(outputDir.absolutePath, dceOutputDir.absolutePath) }
val allJsFiles = additionalFiles + inputJsFilesBefore + klibDependencies + artifactsPaths + commonFiles + additionalMainFiles + inputJsFilesAfter result[mode] = additionalFiles + inputJsFilesBefore + paths + commonFiles + additionalMainFiles + inputJsFilesAfter
val dceAllJsFiles = additionalFiles + inputJsFilesBefore + dceJsFiles + commonFiles + additionalMainFiles + inputJsFilesAfter }
return Pair(allJsFiles, dceAllJsFiles) return result
} else {
// Old BE and ES modules
val outputDir = JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices)
val dceOutputDir = JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices, TranslationMode.FULL_DCE)
val artifactsPaths = modulesToArtifact.values.map { it.outputFile.absolutePath }.filter { !File(it).isDirectory }
val allJsFiles = additionalFiles + inputJsFilesBefore + artifactsPaths + commonFiles + additionalMainFiles + inputJsFilesAfter
val result = mutableMapOf(TranslationMode.FULL to allJsFiles)
val globalDirectives = testServices.moduleStructure.allDirectives
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in globalDirectives
if (runIrDce) {
val dceJsFiles = artifactsPaths.map { it.replace(outputDir.absolutePath, dceOutputDir.absolutePath) }
val dceAllJsFiles = additionalFiles + inputJsFilesBefore + dceJsFiles + commonFiles + additionalMainFiles + inputJsFilesAfter
result[TranslationMode.FULL_DCE] = dceAllJsFiles
}
return result
}
} }
fun extractAllFilesForEsRunner(testServices: TestServices, esmOutputDir: File): Pair<List<String>, List<String>> { fun extractAllFilesForEsRunner(testServices: TestServices, esmOutputDir: File): Pair<List<String>, List<String>> {
@@ -155,7 +181,9 @@ fun extractAllFilesForEsRunner(testServices: TestServices, esmOutputDir: File):
} }
fun getOnlyJsFilesForRunner(testServices: TestServices, modulesToArtifact: Map<TestModule, BinaryArtifacts.Js>): List<String> { fun getOnlyJsFilesForRunner(testServices: TestServices, modulesToArtifact: Map<TestModule, BinaryArtifacts.Js>): List<String> {
return getAllFilesForRunner(testServices, modulesToArtifact).first return getAllFilesForRunner(testServices, modulesToArtifact).let {
it[TranslationMode.FULL] ?: it[TranslationMode.PER_MODULE]!!
}
} }
fun getTestModuleName(testServices: TestServices): String? { fun getTestModuleName(testServices: TestServices): String? {
@@ -1,6 +1,7 @@
// KT-49225 // KT-49225
// RUN_PLAIN_BOX_FUNCTION // RUN_PLAIN_BOX_FUNCTION
// IGNORE_BACKEND: JS // IGNORE_BACKEND: JS
// SPLIT_PER_MODULE
// MODULE: lib // MODULE: lib
// FILE: lib.kt // FILE: lib.kt
@@ -3,9 +3,6 @@ package foo
// CHECK_CONTAINS_NO_CALLS: multiplyInline except=imul TARGET_BACKENDS=JS // CHECK_CONTAINS_NO_CALLS: multiplyInline except=imul TARGET_BACKENDS=JS
// FIXME: Not inlined on IR BE
// CHECK_CONTAINS_NO_CALLS: multiplyInline except=multiply IGNORED_BACKENDS=JS
// CHECK_FUNCTION_EXISTS: runNoinline // CHECK_FUNCTION_EXISTS: runNoinline
// CHECK_NOT_CALLED: runNoinline // CHECK_NOT_CALLED: runNoinline
@@ -9,8 +9,6 @@ package foo
import test.* import test.*
// CHECK_CONTAINS_NO_CALLS: testClassObject except=Companion_getInstance
internal fun testFinalInline(): String { internal fun testFinalInline(): String {
return Z().finalInline({"final"}) return Z().finalInline({"final"})
} }
+1 -1
View File
@@ -1,7 +1,7 @@
// EXPECTED_REACHABLE_NODES: 1285 // EXPECTED_REACHABLE_NODES: 1285
// MODULE_KIND: UMD // MODULE_KIND: UMD
// NO_JS_MODULE_SYSTEM // NO_JS_MODULE_SYSTEM
// FUNCTION_CALLED_TIMES: require count=3 // FUNCTION_CALLED_TIMES: require count=3 TARGET_BACKENDS=JS
@JsModule("lib") @JsModule("lib")
@JsNonModule @JsNonModule