[JS IR IC] Remove JS files of the deleted modules from the out directory

This commit is contained in:
Alexander Korepanov
2022-12-22 14:13:42 +01:00
committed by Space Team
parent fde71918ed
commit a4192c38f2
4 changed files with 34 additions and 26 deletions
@@ -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.js.backend.ast.JsProgram
import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.serialization.js.ModuleKind
import java.io.File import java.io.File
import java.nio.file.Files
abstract class CompilationOutputs { abstract class CompilationOutputs {
var dependencies: Collection<Pair<String, CompilationOutputs>> = emptyList() var dependencies: Collection<Pair<String, CompilationOutputs>> = emptyList()
@@ -20,29 +21,35 @@ abstract class CompilationOutputs {
abstract fun writeJsCode(outputJsFile: File, outputJsMapFile: File) abstract fun writeJsCode(outputJsFile: File, outputJsMapFile: File)
fun writeAll(outputDir: File, outputName: String, genDTS: Boolean, moduleName: String, moduleKind: ModuleKind): List<String> { fun writeAll(outputDir: File, outputName: String, genDTS: Boolean, moduleName: String, moduleKind: ModuleKind): Collection<File> {
val writtenJsFiles = ArrayList<String>(dependencies.size + 1) val writtenFiles = LinkedHashSet<File>(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() writtenFiles += jsFile
writeJsCode(outputJsFile, outputJsFile.mapForJsFile) writtenFiles += jsMapFile
}
dependencies.forEach { (name, content) -> dependencies.forEach { (name, content) ->
outputDir.resolve("$name.js").let { depJsFile -> outputDir.resolve("$name.js").writeAsJsFile(content)
depJsFile.parentFile.mkdirs()
content.writeJsCode(depJsFile, depJsFile.mapForJsFile)
writtenJsFiles += depJsFile.absolutePath
}
} }
writtenJsFiles += outputJsFile.absolutePath val outputJsFile = outputDir.resolve("$outputName.js")
outputJsFile.writeAsJsFile(this)
if (genDTS) { 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 { fun getFullTsDefinition(moduleName: String, moduleKind: ModuleKind): String {
@@ -51,10 +58,10 @@ abstract class CompilationOutputs {
} }
private val File.mapForJsFile private val File.mapForJsFile
get() = resolveSibling("$name.map") get() = resolveSibling("$name.map").canonicalFile
private val File.dtsForJsFile private val File.dtsForJsFile
get() = resolveSibling("$nameWithoutExtension.d.ts") get() = resolveSibling("$nameWithoutExtension.d.ts").canonicalFile
} }
class CompilationOutputsBuilt( class CompilationOutputsBuilt(
@@ -227,7 +227,6 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() {
} }
private fun prepareExternalJsFiles(): MutableList<String> { private fun prepareExternalJsFiles(): MutableList<String> {
jsDir.invalidateDir()
return testDir.filesInDir.mapNotNullTo(mutableListOf(MODULE_EMULATION_FILE)) { file -> return testDir.filesInDir.mapNotNullTo(mutableListOf(MODULE_EMULATION_FILE)) { file ->
file.takeIf { it.name.isAllowedJsFile() }?.readText()?.let { jsCode -> file.takeIf { it.name.isAllowedJsFile() }?.readText()?.let { jsCode ->
val externalModule = jsDir.resolve(file.name) val externalModule = jsDir.resolve(file.name)
@@ -239,16 +238,16 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() {
private fun verifyJsCode(stepId: Int, mainModuleName: String, jsOutput: CompilationOutputs) { private fun verifyJsCode(stepId: Int, mainModuleName: String, jsOutput: CompilationOutputs) {
val files = prepareExternalJsFiles() val compiledJsFiles = jsOutput.writeAll(jsDir, mainModuleName, true, mainModuleName, JS_MODULE_KIND).filter {
val compiledJsFiles = jsOutput.writeAll(jsDir, mainModuleName, true, mainModuleName, JS_MODULE_KIND) it.extension == "js"
}
for (jsCodeFile in compiledJsFiles) { for (jsCodeFile in compiledJsFiles) {
val jsFile = File(jsCodeFile) jsCodeFile.writeAsJsModule(jsCodeFile.readText(), "./${jsCodeFile.name}")
jsFile.writeAsJsModule(jsFile.readText(), "./${jsFile.name}")
} }
try { try {
V8IrJsTestChecker.checkWithTestFunctionArgs( V8IrJsTestChecker.checkWithTestFunctionArgs(
files = files + compiledJsFiles, files = compiledJsFiles.mapTo(prepareExternalJsFiles()) { it.absolutePath },
testModuleName = "./$mainModuleName.js", testModuleName = "./$mainModuleName.js",
testPackageName = null, testPackageName = null,
testFunctionName = BOX_FUNCTION_NAME, testFunctionName = BOX_FUNCTION_NAME,
@@ -272,14 +272,16 @@ class JsIrBackendFacade(
} }
private fun CompilationOutputs.writeTo(outputFile: File, moduleId: String, moduleKind: ModuleKind) { 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) mainModuleFile.fixJsFile(outputFile, moduleId, moduleKind)
dependencies.map { it.first }.zip(allJsFiles.dropLast(1)).forEach { (depModuleId, builtJsFilePath) -> dependencies.map { it.first }.zip(allJsFiles.dropLast(1)).forEach { (depModuleId, builtJsFilePath) ->
val newFile = outputFile.augmentWithModuleName(depModuleId) val newFile = outputFile.augmentWithModuleName(depModuleId)
File(builtJsFilePath).fixJsFile(newFile, depModuleId, moduleKind) builtJsFilePath.fixJsFile(newFile, depModuleId, moduleKind)
} }
} }
@@ -169,8 +169,8 @@ abstract class AbstractJsKLibABITestCase : KtUsefulTestCase() {
buildBinaryNoIC(configuration, mainModuleKlibFile, allDependencies) buildBinaryNoIC(configuration, mainModuleKlibFile, allDependencies)
val binariesDir = File(buildDir, BIN_DIR_NAME).also { it.mkdirs() } 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 { val binaries = compilationOutputs.writeAll(binariesDir, MAIN_MODULE_NAME, false, MAIN_MODULE_NAME, ModuleKind.PLAIN).filter {
File(it) it.extension == "js"
} }
executeAndCheckBinaries(MAIN_MODULE_NAME, binaries) executeAndCheckBinaries(MAIN_MODULE_NAME, binaries)