diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/CompilationOutputs.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/CompilationOutputs.kt index 4855d56a1e1..e51f4ffb0e2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/CompilationOutputs.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/CompilationOutputs.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.backend.js.export.toTypeScript import org.jetbrains.kotlin.js.backend.ast.JsProgram import org.jetbrains.kotlin.serialization.js.ModuleKind import java.io.File +import java.nio.file.Files abstract class CompilationOutputs { var dependencies: Collection> = emptyList() @@ -20,29 +21,35 @@ abstract class CompilationOutputs { abstract fun writeJsCode(outputJsFile: File, outputJsMapFile: File) - fun writeAll(outputDir: File, outputName: String, genDTS: Boolean, moduleName: String, moduleKind: ModuleKind): List { - val writtenJsFiles = ArrayList(dependencies.size + 1) + fun writeAll(outputDir: File, outputName: String, genDTS: Boolean, moduleName: String, moduleKind: ModuleKind): Collection { + val writtenFiles = LinkedHashSet(2 * (dependencies.size + 1) + 1) - val outputJsFile = outputDir.resolve("$outputName.js") + fun File.writeAsJsFile(out: CompilationOutputs) { + parentFile.mkdirs() + val jsMapFile = mapForJsFile + val jsFile = canonicalFile + out.writeJsCode(jsFile, jsMapFile) - outputJsFile.parentFile.mkdirs() - writeJsCode(outputJsFile, outputJsFile.mapForJsFile) + writtenFiles += jsFile + writtenFiles += jsMapFile + } dependencies.forEach { (name, content) -> - outputDir.resolve("$name.js").let { depJsFile -> - depJsFile.parentFile.mkdirs() - content.writeJsCode(depJsFile, depJsFile.mapForJsFile) - writtenJsFiles += depJsFile.absolutePath - } + outputDir.resolve("$name.js").writeAsJsFile(content) } - writtenJsFiles += outputJsFile.absolutePath + val outputJsFile = outputDir.resolve("$outputName.js") + outputJsFile.writeAsJsFile(this) if (genDTS) { - outputJsFile.dtsForJsFile.writeText(getFullTsDefinition(moduleName, moduleKind)) + val dtsFile = outputJsFile.dtsForJsFile + dtsFile.writeText(getFullTsDefinition(moduleName, moduleKind)) + writtenFiles += dtsFile } - return writtenJsFiles + Files.walk(outputDir.toPath()).map { it.toFile() }.filter { it != outputDir && it !in writtenFiles }.forEach(File::delete) + + return writtenFiles } fun getFullTsDefinition(moduleName: String, moduleKind: ModuleKind): String { @@ -51,10 +58,10 @@ abstract class CompilationOutputs { } private val File.mapForJsFile - get() = resolveSibling("$name.map") + get() = resolveSibling("$name.map").canonicalFile private val File.dtsForJsFile - get() = resolveSibling("$nameWithoutExtension.d.ts") + get() = resolveSibling("$nameWithoutExtension.d.ts").canonicalFile } class CompilationOutputsBuilt( diff --git a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt index e81a10c821e..24da4eaf3d2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt @@ -227,7 +227,6 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { } private fun prepareExternalJsFiles(): MutableList { - jsDir.invalidateDir() return testDir.filesInDir.mapNotNullTo(mutableListOf(MODULE_EMULATION_FILE)) { file -> file.takeIf { it.name.isAllowedJsFile() }?.readText()?.let { jsCode -> val externalModule = jsDir.resolve(file.name) @@ -239,16 +238,16 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { private fun verifyJsCode(stepId: Int, mainModuleName: String, jsOutput: CompilationOutputs) { - val files = prepareExternalJsFiles() - val compiledJsFiles = jsOutput.writeAll(jsDir, mainModuleName, true, mainModuleName, JS_MODULE_KIND) + val compiledJsFiles = jsOutput.writeAll(jsDir, mainModuleName, true, mainModuleName, JS_MODULE_KIND).filter { + it.extension == "js" + } for (jsCodeFile in compiledJsFiles) { - val jsFile = File(jsCodeFile) - jsFile.writeAsJsModule(jsFile.readText(), "./${jsFile.name}") + jsCodeFile.writeAsJsModule(jsCodeFile.readText(), "./${jsCodeFile.name}") } try { V8IrJsTestChecker.checkWithTestFunctionArgs( - files = files + compiledJsFiles, + files = compiledJsFiles.mapTo(prepareExternalJsFiles()) { it.absolutePath }, testModuleName = "./$mainModuleName.js", testPackageName = null, testFunctionName = BOX_FUNCTION_NAME, diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt index 3ae910c0eb9..6e525c4b16e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt @@ -272,14 +272,16 @@ class JsIrBackendFacade( } private fun CompilationOutputs.writeTo(outputFile: File, moduleId: String, moduleKind: ModuleKind) { - val allJsFiles = writeAll(outputFile.parentFile, outputFile.nameWithoutExtension, false, moduleId, moduleKind) + val allJsFiles = writeAll(outputFile.parentFile, outputFile.nameWithoutExtension, false, moduleId, moduleKind).filter { + it.extension == "js" + } - val mainModuleFile = File(allJsFiles.last()) + val mainModuleFile = allJsFiles.last() mainModuleFile.fixJsFile(outputFile, moduleId, moduleKind) dependencies.map { it.first }.zip(allJsFiles.dropLast(1)).forEach { (depModuleId, builtJsFilePath) -> val newFile = outputFile.augmentWithModuleName(depModuleId) - File(builtJsFilePath).fixJsFile(newFile, depModuleId, moduleKind) + builtJsFilePath.fixJsFile(newFile, depModuleId, moduleKind) } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt index 53a10405560..658d76bfa31 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt @@ -169,8 +169,8 @@ abstract class AbstractJsKLibABITestCase : KtUsefulTestCase() { buildBinaryNoIC(configuration, mainModuleKlibFile, allDependencies) val binariesDir = File(buildDir, BIN_DIR_NAME).also { it.mkdirs() } - val binaries = compilationOutputs.writeAll(binariesDir, MAIN_MODULE_NAME, false, MAIN_MODULE_NAME, ModuleKind.PLAIN).map { - File(it) + val binaries = compilationOutputs.writeAll(binariesDir, MAIN_MODULE_NAME, false, MAIN_MODULE_NAME, ModuleKind.PLAIN).filter { + it.extension == "js" } executeAndCheckBinaries(MAIN_MODULE_NAME, binaries)