[JS IR] IC: support per-module layout
This commit is contained in:
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.js.test
|
||||
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.js.JavaScript
|
||||
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives
|
||||
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
|
||||
import org.jetbrains.kotlin.test.model.TestFile
|
||||
import org.jetbrains.kotlin.test.model.TestModule
|
||||
@@ -18,6 +19,7 @@ import java.io.FileFilter
|
||||
|
||||
class JsAdditionalSourceProvider(testServices: TestServices) : AdditionalSourceProvider(testServices) {
|
||||
override fun produceAdditionalFiles(globalDirectives: RegisteredDirectives, module: TestModule): List<TestFile> {
|
||||
if (JsEnvironmentConfigurationDirectives.NO_COMMON_FILES in module.directives) return emptyList()
|
||||
return getAdditionalKotlinFiles(module.files.first().originalFile.parent).map { it.toTestFile() }
|
||||
}
|
||||
|
||||
|
||||
@@ -92,8 +92,7 @@ class JsIrBackendFacade(
|
||||
val outputFile = if (firstTimeCompilation) {
|
||||
File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name) + ".js")
|
||||
} else {
|
||||
val outputFile = File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name) + ".js")
|
||||
File(outputFile.parentFile, outputFile.nameWithoutExtension + "-recompiled.js")
|
||||
File(JsEnvironmentConfigurator.getRecompiledJsModuleArtifactPath(testServices, module.name) + ".js")
|
||||
}
|
||||
val moduleName = configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)
|
||||
val moduleKind = configuration.get(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN)
|
||||
@@ -296,8 +295,7 @@ class JsIrBackendFacade(
|
||||
|
||||
dependencies.forEach { (moduleId, outputs) ->
|
||||
val moduleWrappedCode = ClassicJsBackendFacade.wrapWithModuleEmulationMarkers(outputs.jsCode, moduleKind, moduleId)
|
||||
val dependencyPath = outputFile.absolutePath.replace("_v5.js", "-${moduleId}_v5.js")
|
||||
File(dependencyPath).write(moduleWrappedCode)
|
||||
outputFile.augmentWithModuleName(moduleId).write(moduleWrappedCode)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,4 +324,9 @@ class JsIrBackendFacade(
|
||||
override fun shouldRunAnalysis(module: TestModule): Boolean {
|
||||
return JsEnvironmentConfigurator.isMainModule(module, testServices)
|
||||
}
|
||||
}
|
||||
|
||||
fun File.augmentWithModuleName(moduleName: String): File {
|
||||
check(absolutePath.endsWith("_v5.js"))
|
||||
return File(absolutePath.removeSuffix("_v5.js") + "-${moduleName}_v5.js")
|
||||
}
|
||||
+25
-3
@@ -6,11 +6,15 @@
|
||||
package org.jetbrains.kotlin.js.test.handlers
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
||||
import org.jetbrains.kotlin.js.test.converters.ClassicJsBackendFacade
|
||||
import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName
|
||||
import org.jetbrains.kotlin.test.backend.handlers.JsBinaryArtifactHandler
|
||||
import org.jetbrains.kotlin.test.model.BinaryArtifacts.Js
|
||||
import org.jetbrains.kotlin.test.model.TestModule
|
||||
import org.jetbrains.kotlin.test.services.TestServices
|
||||
import org.jetbrains.kotlin.test.services.assertions
|
||||
import java.io.File
|
||||
|
||||
class JsIrRecompiledArtifactsIdentityHandler(testServices: TestServices) : JsBinaryArtifactHandler(testServices) {
|
||||
override fun processModule(module: TestModule, info: Js) {
|
||||
@@ -46,10 +50,28 @@ class JsIrRecompiledArtifactsIdentityHandler(testServices: TestServices) : JsBin
|
||||
}
|
||||
}
|
||||
|
||||
val originalOutput = FileUtil.loadFile(originalArtifact.outputFile)
|
||||
val recompiledOutput = FileUtil.loadFile(incrementalArtifact.outputFile)
|
||||
testServices.assertions.assertEquals(originalOutput, recompiledOutput) { "Output file changed after recompilation" }
|
||||
val originalFilesToCheck = originalArtifact.allFiles()
|
||||
val recompiledFilesToCheck = incrementalArtifact.allFiles()
|
||||
|
||||
testServices.assertions.assertEquals(originalFilesToCheck.size, recompiledFilesToCheck.size)
|
||||
|
||||
for ((originalFile, recompiledFile) in originalFilesToCheck.zip(recompiledFilesToCheck)) {
|
||||
testServices.assertions.assertEquals(originalFile.name, recompiledFile.name)
|
||||
|
||||
val originalOutput = FileUtil.loadFile(originalFile)
|
||||
val recompiledOutput = FileUtil.loadFile(recompiledFile)
|
||||
|
||||
testServices.assertions.assertEquals(originalOutput, recompiledOutput) {
|
||||
"Output file changed after recompilation"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
|
||||
}
|
||||
|
||||
private fun Js.JsIrArtifact.allFiles(): Collection<File> {
|
||||
return listOf(outputFile) + compilerResult.outputs!!.dependencies.map { (moduleId, _) ->
|
||||
outputFile.augmentWithModuleName(moduleId)
|
||||
}.sortedBy { it.name }
|
||||
}
|
||||
|
||||
@@ -25,9 +25,11 @@ import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurato
|
||||
import org.jetbrains.kotlin.test.services.jsLibraryProvider
|
||||
import java.io.File
|
||||
|
||||
class TestModuleCache(val moduleName: String, val files: MutableMap<String, FileCache>) {
|
||||
class TestModuleCache(val files: MutableMap<String, FileCache>) {
|
||||
|
||||
constructor(moduleName: String) : this(moduleName, mutableMapOf())
|
||||
constructor() : this(mutableMapOf())
|
||||
|
||||
private lateinit var storedModuleName: String
|
||||
|
||||
fun cacheProvider(): PersistentCacheProvider {
|
||||
return object : PersistentCacheProvider {
|
||||
@@ -66,6 +68,10 @@ class TestModuleCache(val moduleName: String, val files: MutableMap<String, File
|
||||
override fun filePaths(): Iterable<String> {
|
||||
return files.keys
|
||||
}
|
||||
|
||||
override fun moduleName(): String {
|
||||
return storedModuleName
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,10 +123,14 @@ class TestModuleCache(val moduleName: String, val files: MutableMap<String, File
|
||||
override fun commitLibraryPath(libraryPath: String, flatHash: ULong, transHash: ULong) {
|
||||
|
||||
}
|
||||
|
||||
override fun commitModuleName(moduleName: String) {
|
||||
storedModuleName = moduleName
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun createModuleCache(): ModuleCache = ModuleCache(moduleName, files)
|
||||
fun createModuleCache(): ModuleCache = ModuleCache(storedModuleName, files)
|
||||
}
|
||||
|
||||
class JsIrIncrementalDataProvider(private val testServices: TestServices) : TestService {
|
||||
@@ -201,7 +211,7 @@ class JsIrIncrementalDataProvider(private val testServices: TestServices) : Test
|
||||
var moduleCache = predefinedKlibHasIcCache[canonicalPath]
|
||||
|
||||
if (moduleCache == null) {
|
||||
moduleCache = icCache[canonicalPath] ?: TestModuleCache(canonicalPath)
|
||||
moduleCache = icCache[canonicalPath] ?: TestModuleCache()
|
||||
|
||||
val libs = allDependencies.associateBy { File(it.libraryFile.path).canonicalPath }
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// EXPECTED_REACHABLE_NODES: 1282
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// EXPECTED_REACHABLE_NODES: 1283
|
||||
|
||||
// MODULE: lib
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// EXPECTED_REACHABLE_NODES: 1286
|
||||
// MODULE: lib1
|
||||
// FILE: lib1.kt
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// EXPECTED_REACHABLE_NODES: 1283
|
||||
// MODULE: lib
|
||||
// FILE: a.kt
|
||||
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// EXPECTED_REACHABLE_NODES: 1282
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// NO_COMMON_FILES
|
||||
// EXPECTED_REACHABLE_NODES: 1284
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
|
||||
Reference in New Issue
Block a user