[Test] Unify work with KLIB artifact paths and dependencies

Unify functions from `JsEnvironmentConfigurator` and
`WasmEnvironmentConfigurator` that do the same logic. Make this logic
also be available for `NativeEnvironmentConfigurator`:
- get*ArtifactSimpleName()
- get*KlibArtifactPath()
- get*KlibOutputDir()
- getAllRecursiveLibrariesFor()
- getAllRecursiveDependenciesFor()
- getAllDependenciesMappingFor()
- getKlibDependencies()

This would allow to have the same logic in one place, and also
reuse it in `IrBackendFacade`s to be implemented for Native.

^KT-65117
This commit is contained in:
Dmitriy Dolovov
2024-01-19 12:59:52 +01:00
committed by Space Team
parent 7e9e064748
commit f204293e4d
10 changed files with 115 additions and 153 deletions
@@ -13,12 +13,9 @@ import org.jetbrains.kotlin.config.AnalysisFlags.allowFullyQualifiedNameInKClass
import org.jetbrains.kotlin.config.CommonConfigurationKeys 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.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode 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.platform.js.JsPlatforms import org.jetbrains.kotlin.platform.js.JsPlatforms
import org.jetbrains.kotlin.resolve.CompilerEnvironment import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.TargetEnvironment
@@ -37,11 +34,9 @@ import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.TYPED_ARRAYS import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.TYPED_ARRAYS
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.util.joinToArrayString import org.jetbrains.kotlin.test.util.joinToArrayString
import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
import java.io.File import java.io.File
@@ -49,7 +44,7 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
override val directiveContainers: List<DirectivesContainer> override val directiveContainers: List<DirectivesContainer>
get() = listOf(JsEnvironmentConfigurationDirectives) get() = listOf(JsEnvironmentConfigurationDirectives)
companion object { companion object : KlibBasedEnvironmentConfiguratorUtils {
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"
@@ -63,7 +58,6 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
TranslationMode.PER_FILE_PROD_MINIMIZED_NAMES to "outPfMin" TranslationMode.PER_FILE_PROD_MINIMIZED_NAMES to "outPfMin"
) )
private const val OUTPUT_KLIB_DIR_NAME = "outputKlibDir"
private const val MINIFICATION_OUTPUT_DIR_NAME = "minOutputDir" private const val MINIFICATION_OUTPUT_DIR_NAME = "minOutputDir"
object ExceptionThrowingReporter : JsConfig.Reporter() { object ExceptionThrowingReporter : JsConfig.Reporter() {
@@ -81,12 +75,6 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
} }
} }
fun getJsArtifactSimpleName(testServices: TestServices, moduleName: String): String {
val testName = testServices.testInfo.methodName.removePrefix("test").decapitalizeAsciiOnly()
val outputFileSuffix = if (moduleName == ModuleStructureExtractor.DEFAULT_MODULE_NAME) "" else "-$moduleName"
return testName + outputFileSuffix
}
fun getJsModuleArtifactPath(testServices: TestServices, moduleName: String, translationMode: TranslationMode = TranslationMode.FULL_DEV): String { fun getJsModuleArtifactPath(testServices: TestServices, moduleName: String, translationMode: TranslationMode = TranslationMode.FULL_DEV): String {
return getJsArtifactsOutputDir(testServices, translationMode).absolutePath + File.separator + getJsModuleArtifactName(testServices, moduleName) return getJsArtifactsOutputDir(testServices, translationMode).absolutePath + File.separator + getJsModuleArtifactName(testServices, moduleName)
} }
@@ -96,11 +84,7 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
} }
fun getJsModuleArtifactName(testServices: TestServices, moduleName: String): String { fun getJsModuleArtifactName(testServices: TestServices, moduleName: String): String {
return getJsArtifactSimpleName(testServices, moduleName) + "_v5" return getKlibArtifactSimpleName(testServices, moduleName) + "_v5"
}
fun getJsKlibArtifactPath(testServices: TestServices, moduleName: String): String {
return getJsKlibOutputDir(testServices).absolutePath + File.separator + getJsArtifactSimpleName(testServices, moduleName)
} }
fun getJsArtifactsOutputDir(testServices: TestServices, translationMode: TranslationMode = TranslationMode.FULL_DEV): File { fun getJsArtifactsOutputDir(testServices: TestServices, translationMode: TranslationMode = TranslationMode.FULL_DEV): File {
@@ -111,10 +95,6 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(outputDirByMode[translationMode]!! + "-recompiled") return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(outputDirByMode[translationMode]!! + "-recompiled")
} }
fun getJsKlibOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(OUTPUT_KLIB_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)
} }
@@ -182,36 +162,6 @@ class JsEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigu
} }
} }
fun getAllRecursiveDependenciesFor(module: TestModule, testServices: TestServices): Set<ModuleDescriptorImpl> {
val visited = mutableSetOf<ModuleDescriptorImpl>()
fun getRecursive(descriptor: ModuleDescriptor) {
descriptor.allDependencyModules.forEach {
if (it is ModuleDescriptorImpl && it !in visited) {
visited += it
getRecursive(it)
}
}
}
getRecursive(testServices.moduleDescriptorProvider.getModuleDescriptor(module))
return visited
}
fun getAllRecursiveLibrariesFor(module: TestModule, testServices: TestServices): Map<KotlinLibrary, ModuleDescriptorImpl> {
val dependencies = getAllRecursiveDependenciesFor(module, testServices)
return dependencies.associateBy { testServices.libraryProvider.getCompiledLibraryByDescriptor(it) }
}
fun getAllDependenciesMappingFor(module: TestModule, testServices: TestServices): Map<KotlinLibrary, List<KotlinLibrary>> {
val allRecursiveLibraries: Map<KotlinLibrary, ModuleDescriptor> = getAllRecursiveLibrariesFor(module, testServices)
val m2l = allRecursiveLibraries.map { it.value to it.key }.toMap()
return allRecursiveLibraries.keys.associateWith { m ->
val descriptor = allRecursiveLibraries[m] ?: error("No descriptor found for library ${m.libraryName}")
descriptor.allDependencyModules.filter { it != descriptor }.map { m2l.getValue(it) }
}
}
fun TestModule.hasFilesToRecompile(): Boolean { fun TestModule.hasFilesToRecompile(): Boolean {
return files.any { JsEnvironmentConfigurationDirectives.RECOMPILE in it.directives } return files.any { JsEnvironmentConfigurationDirectives.RECOMPILE in it.directives }
} }
@@ -0,0 +1,89 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.test.services.configuration
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.model.ArtifactKinds
import org.jetbrains.kotlin.test.model.DependencyKind
import org.jetbrains.kotlin.test.model.DependencyRelation
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly
import java.io.File
interface KlibBasedEnvironmentConfiguratorUtils {
fun getKlibArtifactSimpleName(testServices: TestServices, moduleName: String): String {
val testName = testServices.testInfo.methodName.removePrefix("test").decapitalizeAsciiOnly()
val outputFileSuffix = if (moduleName == ModuleStructureExtractor.DEFAULT_MODULE_NAME) "" else "-$moduleName"
return testName + outputFileSuffix
}
fun getKlibArtifactFile(testServices: TestServices, moduleName: String): File {
return getKlibOutputDir(testServices).resolve(getKlibArtifactSimpleName(testServices, moduleName))
}
fun getKlibOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(OUTPUT_KLIB_DIR_NAME)
}
fun getAllRecursiveLibrariesFor(module: TestModule, testServices: TestServices): Map<KotlinLibrary, ModuleDescriptorImpl> {
val dependencies = getAllRecursiveDependenciesFor(module, testServices)
return dependencies.associateBy { testServices.libraryProvider.getCompiledLibraryByDescriptor(it) }
}
fun getAllRecursiveDependenciesFor(module: TestModule, testServices: TestServices): Set<ModuleDescriptorImpl> {
val visited = mutableSetOf<ModuleDescriptorImpl>()
fun getRecursive(descriptor: ModuleDescriptor) {
descriptor.allDependencyModules.forEach {
if (it is ModuleDescriptorImpl && it !in visited) {
visited += it
getRecursive(it)
}
}
}
getRecursive(testServices.moduleDescriptorProvider.getModuleDescriptor(module))
return visited
}
fun getAllDependenciesMappingFor(module: TestModule, testServices: TestServices): Map<KotlinLibrary, List<KotlinLibrary>> {
val allRecursiveLibraries: Map<KotlinLibrary, ModuleDescriptor> = getAllRecursiveLibrariesFor(module, testServices)
val m2l = allRecursiveLibraries.map { it.value to it.key }.toMap()
return allRecursiveLibraries.keys.associateWith { m ->
val descriptor = allRecursiveLibraries[m] ?: error("No descriptor found for library ${m.libraryName}")
descriptor.allDependencyModules.filter { it != descriptor }.map { m2l.getValue(it) }
}
}
fun getKlibDependencies(module: TestModule, testServices: TestServices, kind: DependencyRelation): List<File> {
val visited = mutableSetOf<TestModule>()
fun getRecursive(module: TestModule, relation: DependencyRelation) {
val dependencies = if (relation == DependencyRelation.FriendDependency) {
module.friendDependencies
} else {
module.regularDependencies
}
dependencies
.filter { it.kind != DependencyKind.Source }
.map { testServices.dependencyProvider.getTestModule(it.moduleName) }.forEach {
if (it !in visited) {
visited += it
getRecursive(it, relation)
}
}
}
getRecursive(module, kind)
return visited.map { testServices.dependencyProvider.getArtifact(it, ArtifactKinds.KLib).outputFile }
}
companion object {
private const val OUTPUT_KLIB_DIR_NAME = "outputKlibDir"
}
}
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.test.services.runtimeClasspathProviders
import java.io.File import java.io.File
class NativeEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) { class NativeEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) {
companion object { companion object : KlibBasedEnvironmentConfiguratorUtils {
private val nativeHome private val nativeHome
get() = System.getProperty("kotlin.internal.native.test.nativeHome") get() = System.getProperty("kotlin.internal.native.test.nativeHome")
?: error("No nativeHome provided. Are you sure the test are executed within :native:native.tests?") ?: error("No nativeHome provided. Are you sure the test are executed within :native:native.tests?")
@@ -11,11 +11,9 @@ 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.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding
import org.jetbrains.kotlin.js.config.WasmTarget import org.jetbrains.kotlin.js.config.WasmTarget
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.serialization.js.ModuleKind
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.INFER_MAIN_MODULE import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.INFER_MAIN_MODULE
import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.PROPERTY_LAZY_INITIALIZATION import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.PROPERTY_LAZY_INITIALIZATION
@@ -24,7 +22,6 @@ import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectiv
import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives.DISABLE_WASM_EXCEPTION_HANDLING import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives.DISABLE_WASM_EXCEPTION_HANDLING
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.model.ArtifactKinds import org.jetbrains.kotlin.test.model.ArtifactKinds
import org.jetbrains.kotlin.test.model.DependencyKind import org.jetbrains.kotlin.test.model.DependencyKind
import org.jetbrains.kotlin.test.model.DependencyRelation import org.jetbrains.kotlin.test.model.DependencyRelation
@@ -50,9 +47,7 @@ abstract class WasmEnvironmentConfigurator(testServices: TestServices) : Environ
override val directiveContainers: List<DirectivesContainer> override val directiveContainers: List<DirectivesContainer>
get() = listOf(WasmEnvironmentConfigurationDirectives) get() = listOf(WasmEnvironmentConfigurationDirectives)
companion object { companion object : KlibBasedEnvironmentConfiguratorUtils {
private const val OUTPUT_KLIB_DIR_NAME = "outputKlibDir"
fun getRuntimePathsForModule(target: WasmTarget): List<String> { fun getRuntimePathsForModule(target: WasmTarget): List<String> {
val suffix = when (target) { val suffix = when (target) {
WasmTarget.JS -> "-js" WasmTarget.JS -> "-js"
@@ -62,75 +57,6 @@ abstract class WasmEnvironmentConfigurator(testServices: TestServices) : Environ
return listOf(System.getProperty("kotlin.wasm$suffix.stdlib.path")!!, System.getProperty("kotlin.wasm$suffix.kotlin.test.path")!!) return listOf(System.getProperty("kotlin.wasm$suffix.stdlib.path")!!, System.getProperty("kotlin.wasm$suffix.kotlin.test.path")!!)
} }
fun getKlibDependencies(module: TestModule, testServices: TestServices, kind: DependencyRelation): List<File> {
val visited = mutableSetOf<TestModule>()
fun getRecursive(module: TestModule, relation: DependencyRelation) {
val dependencies = if (relation == DependencyRelation.FriendDependency) {
module.friendDependencies
} else {
module.regularDependencies
}
dependencies
.filter { it.kind != DependencyKind.Source }
.map { testServices.dependencyProvider.getTestModule(it.moduleName) }.forEach {
if (it !in visited) {
visited += it
getRecursive(it, relation)
}
}
}
getRecursive(module, kind)
return visited.map { testServices.dependencyProvider.getArtifact(it, ArtifactKinds.KLib).outputFile }
}
fun getDependencies(module: TestModule, testServices: TestServices, kind: DependencyRelation): List<ModuleDescriptor> {
return getKlibDependencies(module, testServices, kind)
.map { testServices.libraryProvider.getDescriptorByPath(it.absolutePath) }
}
fun getWasmKlibArtifactPath(testServices: TestServices, moduleName: String): String {
return getWasmKlibOutputDir(testServices).absolutePath + File.separator + JsEnvironmentConfigurator.getJsArtifactSimpleName(
testServices,
moduleName
)
}
fun getWasmKlibOutputDir(testServices: TestServices): File {
return testServices.temporaryDirectoryManager.getOrCreateTempDirectory(OUTPUT_KLIB_DIR_NAME)
}
fun getAllRecursiveDependenciesFor(module: TestModule, testServices: TestServices): Set<ModuleDescriptorImpl> {
val visited = mutableSetOf<ModuleDescriptorImpl>()
fun getRecursive(descriptor: ModuleDescriptor) {
descriptor.allDependencyModules.forEach {
if (it is ModuleDescriptorImpl && it !in visited) {
visited += it
getRecursive(it)
}
}
}
getRecursive(testServices.moduleDescriptorProvider.getModuleDescriptor(module))
return visited
}
fun getAllRecursiveLibrariesFor(module: TestModule, testServices: TestServices): Map<KotlinLibrary, ModuleDescriptorImpl> {
val dependencies = getAllRecursiveDependenciesFor(module, testServices)
return dependencies.associateBy { testServices.libraryProvider.getCompiledLibraryByDescriptor(it) }
}
fun getAllDependenciesMappingFor(module: TestModule, testServices: TestServices): Map<KotlinLibrary, List<KotlinLibrary>> {
val allRecursiveLibraries: Map<KotlinLibrary, ModuleDescriptor> =
getAllRecursiveLibrariesFor(module, testServices)
val m2l = allRecursiveLibraries.map { it.value to it.key }.toMap()
return allRecursiveLibraries.keys.associateWith { m ->
val descriptor = allRecursiveLibraries[m] ?: error("No descriptor found for library ${m.libraryName}")
descriptor.allDependencyModules.filter { it != descriptor }.map { m2l.getValue(it) }
}
}
fun getMainModule(testServices: TestServices): TestModule { fun getMainModule(testServices: TestServices): TestModule {
val modules = testServices.moduleStructure.modules val modules = testServices.moduleStructure.modules
val inferMainModule = INFER_MAIN_MODULE in testServices.moduleStructure.allDirectives val inferMainModule = INFER_MAIN_MODULE in testServices.moduleStructure.allDirectives
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.io.File
class FirJsKlibBackendFacade( class FirJsKlibBackendFacade(
testServices: TestServices, testServices: TestServices,
@@ -51,7 +50,7 @@ class FirJsKlibBackendFacade(
} }
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
val outputFile = JsEnvironmentConfigurator.getJsKlibArtifactPath(testServices, module.name) val outputFile = JsEnvironmentConfigurator.getKlibArtifactFile(testServices, module.name)
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
val libraries = resolveLibraries(configuration, getAllJsDependenciesPaths(module, testServices)) val libraries = resolveLibraries(configuration, getAllJsDependenciesPaths(module, testServices))
@@ -62,7 +61,7 @@ class FirJsKlibBackendFacade(
configuration, configuration,
inputArtifact.diagnosticReporter, inputArtifact.diagnosticReporter,
inputArtifact.metadataSerializer, inputArtifact.metadataSerializer,
klibPath = outputFile, klibPath = outputFile.path,
libraries.map { it.library }, libraries.map { it.library },
inputArtifact.irModuleFragment, inputArtifact.irModuleFragment,
cleanFiles = inputArtifact.icData, cleanFiles = inputArtifact.icData,
@@ -76,7 +75,7 @@ class FirJsKlibBackendFacade(
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
val lib = CommonKLibResolver.resolve( val lib = CommonKLibResolver.resolve(
getAllJsDependenciesPaths(module, testServices) + listOf(outputFile), getAllJsDependenciesPaths(module, testServices) + listOf(outputFile.path),
configuration.getLogger(treatWarningsAsErrors = true) configuration.getLogger(treatWarningsAsErrors = true)
).getFullResolvedList().last().library ).getFullResolvedList().last().library
@@ -97,8 +96,8 @@ class FirJsKlibBackendFacade(
if (JsEnvironmentConfigurator.incrementalEnabled(testServices)) { if (JsEnvironmentConfigurator.incrementalEnabled(testServices)) {
testServices.jsIrIncrementalDataProvider.recordIncrementalData(module, lib) testServices.jsIrIncrementalDataProvider.recordIncrementalData(module, lib)
} }
testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile, moduleDescriptor, lib) testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile.path, moduleDescriptor, lib)
return BinaryArtifacts.KLib(File(outputFile), inputArtifact.diagnosticReporter) return BinaryArtifacts.KLib(outputFile, inputArtifact.diagnosticReporter)
} }
} }
@@ -42,7 +42,7 @@ import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsArtifactSimpleName import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsModuleArtifactName
import org.jetbrains.kotlin.test.services.configuration.getDependencies import org.jetbrains.kotlin.test.services.configuration.getDependencies
import org.jetbrains.kotlin.test.services.libraryProvider import org.jetbrains.kotlin.test.services.libraryProvider
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
@@ -127,7 +127,7 @@ class JsIrBackendFacade(
val phaseConfig = if (debugMode >= DebugMode.SUPER_DEBUG) { val phaseConfig = if (debugMode >= DebugMode.SUPER_DEBUG) {
val dumpOutputDir = File( val dumpOutputDir = File(
JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices), JsEnvironmentConfigurator.getJsArtifactsOutputDir(testServices),
JsEnvironmentConfigurator.getJsArtifactSimpleName(testServices, module.name) + "-irdump" JsEnvironmentConfigurator.getKlibArtifactSimpleName(testServices, module.name) + "-irdump"
) )
PhaseConfig( PhaseConfig(
jsPhases, jsPhases,
@@ -181,7 +181,7 @@ class JsIrBackendFacade(
loweredIr.context, loweredIr.context,
moduleToName = runIf(isEsModules) { moduleToName = runIf(isEsModules) {
loweredIr.allModules.associateWith { loweredIr.allModules.associateWith {
"./${getJsArtifactSimpleName(testServices, it.safeName)}_v5".minifyIfNeed() "./${getJsModuleArtifactName(testServices, it.safeName)}".minifyIfNeed()
} }
} ?: emptyMap(), } ?: emptyMap(),
shouldReferMainFunction, shouldReferMainFunction,
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.test.model.BinaryArtifacts
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
import java.io.File
class JsKlibBackendFacade( class JsKlibBackendFacade(
testServices: TestServices, testServices: TestServices,
@@ -44,7 +43,7 @@ class JsKlibBackendFacade(
} }
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
val outputFile = JsEnvironmentConfigurator.getJsKlibArtifactPath(testServices, module.name) val outputFile = JsEnvironmentConfigurator.getKlibArtifactFile(testServices, module.name)
if (firstTimeCompilation) { if (firstTimeCompilation) {
serializeModuleIntoKlib( serializeModuleIntoKlib(
@@ -52,7 +51,7 @@ class JsKlibBackendFacade(
configuration, configuration,
inputArtifact.diagnosticReporter, inputArtifact.diagnosticReporter,
inputArtifact.metadataSerializer, inputArtifact.metadataSerializer,
klibPath = outputFile, klibPath = outputFile.path,
JsEnvironmentConfigurator.getAllRecursiveLibrariesFor(module, testServices).keys.toList(), JsEnvironmentConfigurator.getAllRecursiveLibrariesFor(module, testServices).keys.toList(),
inputArtifact.irModuleFragment, inputArtifact.irModuleFragment,
cleanFiles = inputArtifact.icData, cleanFiles = inputArtifact.icData,
@@ -66,7 +65,7 @@ class JsKlibBackendFacade(
val dependencies = JsEnvironmentConfigurator.getAllRecursiveDependenciesFor(module, testServices).toList() val dependencies = JsEnvironmentConfigurator.getAllRecursiveDependenciesFor(module, testServices).toList()
val lib = CommonKLibResolver.resolve( val lib = CommonKLibResolver.resolve(
dependencies.map { testServices.libraryProvider.getPathByDescriptor(it) } + listOf(outputFile), dependencies.map { testServices.libraryProvider.getPathByDescriptor(it) } + listOf(outputFile.path),
configuration.getLogger(treatWarningsAsErrors = true) configuration.getLogger(treatWarningsAsErrors = true)
).getFullResolvedList().last().library ).getFullResolvedList().last().library
@@ -84,8 +83,8 @@ class JsKlibBackendFacade(
if (JsEnvironmentConfigurator.incrementalEnabled(testServices)) { if (JsEnvironmentConfigurator.incrementalEnabled(testServices)) {
testServices.jsIrIncrementalDataProvider.recordIncrementalData(module, lib) testServices.jsIrIncrementalDataProvider.recordIncrementalData(module, lib)
} }
testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile, moduleDescriptor, lib) testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile.path, moduleDescriptor, lib)
return BinaryArtifacts.KLib(File(outputFile), inputArtifact.diagnosticReporter) return BinaryArtifacts.KLib(outputFile, inputArtifact.diagnosticReporter)
} }
} }
@@ -57,8 +57,8 @@ class JsIrIncrementalDataProvider(private val testServices: TestServices) : Test
fun getCaches() = icCache.map { it.value.fetchArtifacts() } fun getCaches() = icCache.map { it.value.fetchArtifacts() }
fun getCacheForModule(module: TestModule): Map<String, ByteArray> { fun getCacheForModule(module: TestModule): Map<String, ByteArray> {
val path = JsEnvironmentConfigurator.getJsKlibArtifactPath(testServices, module.name) val path = JsEnvironmentConfigurator.getKlibArtifactFile(testServices, module.name)
val canonicalPath = File(path).canonicalPath val canonicalPath = path.canonicalPath
val moduleCache = icCache[canonicalPath] ?: error("No cache found for $path") val moduleCache = icCache[canonicalPath] ?: error("No cache found for $path")
val oldBinaryAsts = mutableMapOf<String, ByteArray>() val oldBinaryAsts = mutableMapOf<String, ByteArray>()
@@ -94,7 +94,7 @@ class JsIrIncrementalDataProvider(private val testServices: TestServices) : Test
recordIncrementalDataForRuntimeKlib(module) recordIncrementalDataForRuntimeKlib(module)
val dirtyFiles = module.files.map { "/${it.relativePath}" } val dirtyFiles = module.files.map { "/${it.relativePath}" }
val path = JsEnvironmentConfigurator.getJsKlibArtifactPath(testServices, module.name) val path = JsEnvironmentConfigurator.getKlibArtifactFile(testServices, module.name).path
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
val mainArguments = JsEnvironmentConfigurator.getMainCallParametersForModule(module) val mainArguments = JsEnvironmentConfigurator.getMainCallParametersForModule(module)
@@ -33,7 +33,7 @@ import java.io.File
const val MODULE_EMULATION_FILE = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/moduleEmulation.js" const val MODULE_EMULATION_FILE = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/moduleEmulation.js"
fun TestModule.getNameFor(filePath: String, testServices: TestServices): String { fun TestModule.getNameFor(filePath: String, testServices: TestServices): String {
return JsEnvironmentConfigurator.getJsArtifactSimpleName(testServices, name) + "-js-" + filePath return JsEnvironmentConfigurator.getKlibArtifactSimpleName(testServices, name) + "-js-" + filePath
} }
fun TestModule.getNameFor(file: TestFile, testServices: TestServices): String { fun TestModule.getNameFor(file: TestFile, testServices: TestServices): String {
@@ -28,7 +28,6 @@ import org.jetbrains.kotlin.test.model.BinaryArtifacts
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator
import java.io.File
class FirWasmKlibBackendFacade( class FirWasmKlibBackendFacade(
testServices: TestServices, testServices: TestServices,
@@ -50,7 +49,7 @@ class FirWasmKlibBackendFacade(
} }
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
val outputFile = WasmEnvironmentConfigurator.getWasmKlibArtifactPath(testServices, module.name) val outputFile = WasmEnvironmentConfigurator.getKlibArtifactFile(testServices, module.name)
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
val target = configuration.get(JSConfigurationKeys.WASM_TARGET, WasmTarget.JS) val target = configuration.get(JSConfigurationKeys.WASM_TARGET, WasmTarget.JS)
@@ -62,7 +61,7 @@ class FirWasmKlibBackendFacade(
configuration, configuration,
inputArtifact.diagnosticReporter, inputArtifact.diagnosticReporter,
inputArtifact.metadataSerializer, inputArtifact.metadataSerializer,
klibPath = outputFile, klibPath = outputFile.path,
libraries.map { it.library }, libraries.map { it.library },
inputArtifact.irModuleFragment, inputArtifact.irModuleFragment,
cleanFiles = inputArtifact.icData, cleanFiles = inputArtifact.icData,
@@ -76,7 +75,7 @@ class FirWasmKlibBackendFacade(
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
val lib = CommonKLibResolver.resolve( val lib = CommonKLibResolver.resolve(
getAllWasmDependenciesPaths(module, testServices, target) + listOf(outputFile), getAllWasmDependenciesPaths(module, testServices, target) + listOf(outputFile.path),
configuration.getLogger(treatWarningsAsErrors = true) configuration.getLogger(treatWarningsAsErrors = true)
).getFullResolvedList().last().library ).getFullResolvedList().last().library
@@ -94,8 +93,8 @@ class FirWasmKlibBackendFacade(
) )
testServices.moduleDescriptorProvider.replaceModuleDescriptorForModule(module, moduleDescriptor) testServices.moduleDescriptorProvider.replaceModuleDescriptorForModule(module, moduleDescriptor)
testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile, moduleDescriptor, lib) testServices.libraryProvider.setDescriptorAndLibraryByName(outputFile.path, moduleDescriptor, lib)
return BinaryArtifacts.KLib(File(outputFile), inputArtifact.diagnosticReporter) return BinaryArtifacts.KLib(outputFile, inputArtifact.diagnosticReporter)
} }
} }