JPS tests: switch to new dependencies.txt parser

Order of modules changed because new parser preserve order, while previously modules are accidentally sorted by hashCode().

Original commit: 808e83a01e
This commit is contained in:
Sergey Rostov
2018-09-04 12:31:27 +03:00
parent d87777ae4d
commit 0eef15508f
11 changed files with 218 additions and 179 deletions
@@ -38,22 +38,25 @@ import org.jetbrains.jps.builders.logging.BuildLoggingManager
import org.jetbrains.jps.cmdline.ProjectDescriptor import org.jetbrains.jps.cmdline.ProjectDescriptor
import org.jetbrains.jps.incremental.* import org.jetbrains.jps.incremental.*
import org.jetbrains.jps.incremental.messages.BuildMessage import org.jetbrains.jps.incremental.messages.BuildMessage
import org.jetbrains.jps.model.JpsDummyElement
import org.jetbrains.jps.model.JpsModuleRootModificationUtil import org.jetbrains.jps.model.JpsModuleRootModificationUtil
import org.jetbrains.jps.model.java.JpsJavaDependencyScope
import org.jetbrains.jps.model.java.JpsJavaExtensionService import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.library.sdk.JpsSdk
import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.jps.util.JpsPathUtil
import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.incremental.LookupSymbol import org.jetbrains.kotlin.incremental.LookupSymbol
import org.jetbrains.kotlin.incremental.storage.version.CacheAttributesDiff import org.jetbrains.kotlin.incremental.storage.version.CacheAttributesDiff
import org.jetbrains.kotlin.incremental.storage.version.CacheVersionManager import org.jetbrains.kotlin.incremental.storage.version.CacheVersionManager
import org.jetbrains.kotlin.incremental.testingUtils.* import org.jetbrains.kotlin.incremental.testingUtils.*
import org.jetbrains.kotlin.jps.build.dependeciestxt.DependenciesTxtBuilder
import org.jetbrains.kotlin.jps.build.dependeciestxt.ModulesTxt
import org.jetbrains.kotlin.jps.incremental.CompositeLookupsCacheAttributesManager import org.jetbrains.kotlin.jps.incremental.CompositeLookupsCacheAttributesManager
import org.jetbrains.kotlin.jps.incremental.getKotlinCache import org.jetbrains.kotlin.jps.incremental.getKotlinCache
import org.jetbrains.kotlin.jps.incremental.withLookupStorage import org.jetbrains.kotlin.jps.incremental.withLookupStorage
import org.jetbrains.kotlin.jps.model.JpsKotlinFacetModuleExtension
import org.jetbrains.kotlin.jps.targets.KotlinModuleBuildTarget import org.jetbrains.kotlin.jps.targets.KotlinModuleBuildTarget
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.keysToMap
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
@@ -247,20 +250,11 @@ abstract class AbstractIncrementalJpsTest(
rebuildAndCheckOutput(makeOverallResult) rebuildAndCheckOutput(makeOverallResult)
} }
private fun readModuleDependencies(): Map<String, List<DependencyDescriptor>>? { private fun readModulesConfig(): ModulesTxt? {
val dependenciesTxt = File(testDataDir, "dependencies.txt") val dependenciesTxtFile = File(testDataDir, "dependencies.txt")
if (!dependenciesTxt.exists()) return null if (!dependenciesTxtFile.exists()) return null
val result = HashMap<String, List<DependencyDescriptor>>() return DependenciesTxtBuilder().readFile(dependenciesTxtFile)
for (line in dependenciesTxt.readLines()) {
val split = line.split("->")
val module = split[0]
val dependencies = if (split.size > 1) split[1] else ""
val dependencyList = dependencies.split(",").filterNot { it.isEmpty() }
result[module] = dependencyList.map(::parseDependency)
}
return result
} }
protected open fun createBuildLog(incrementalMakeResults: List<AbstractIncrementalJpsTest.MakeResult>): String = protected open fun createBuildLog(incrementalMakeResults: List<AbstractIncrementalJpsTest.MakeResult>): String =
@@ -277,10 +271,10 @@ abstract class AbstractIncrementalJpsTest(
workDir = FileUtilRt.createTempDirectory(TEMP_DIRECTORY_TO_USE, "jps-build", null) workDir = FileUtilRt.createTempDirectory(TEMP_DIRECTORY_TO_USE, "jps-build", null)
Disposer.register(testRootDisposable, Disposable { FileUtilRt.delete(workDir) }) Disposer.register(testRootDisposable, Disposable { FileUtilRt.delete(workDir) })
val moduleNames = configureModules() val modulesTxt = configureModules()
initialMake() initialMake()
val otherMakeResults = performModificationsAndMake(moduleNames) val otherMakeResults = performModificationsAndMake(modulesTxt?.modules?.map { it.name })
val buildLogFile = buildLogFinder.findBuildLog(testDataDir) val buildLogFile = buildLogFinder.findBuildLog(testDataDir)
val logs = createBuildLog(otherMakeResults) val logs = createBuildLog(otherMakeResults)
@@ -371,7 +365,7 @@ abstract class AbstractIncrementalJpsTest(
protected data class MakeResult(val log: String, val makeFailed: Boolean, val mappingsDump: String?) protected data class MakeResult(val log: String, val makeFailed: Boolean, val mappingsDump: String?)
private fun performModificationsAndMake(moduleNames: Set<String>?): List<MakeResult> { private fun performModificationsAndMake(moduleNames: Collection<String>?): List<MakeResult> {
val results = arrayListOf<MakeResult>() val results = arrayListOf<MakeResult>()
val modifications = getModificationsToPerform(testDataDir, moduleNames, allowNoFilesWithSuffixInTestData, TouchPolicy.TIMESTAMP) val modifications = getModificationsToPerform(testDataDir, moduleNames, allowNoFilesWithSuffixInTestData, TouchPolicy.TIMESTAMP)
@@ -393,55 +387,71 @@ abstract class AbstractIncrementalJpsTest(
} }
// null means one module // null means one module
private fun configureModules(): Set<String>? { private fun configureModules(): ModulesTxt? {
fun prepareModuleSources(moduleName: String?) {
val sourceDirName = moduleName?.let { "$it/src" } ?: "src"
val filePrefix = moduleName?.let { "${it}_" } ?: ""
val sourceDestinationDir = File(workDir, sourceDirName)
val sourcesMapping = copyTestSources(testDataDir, sourceDestinationDir, filePrefix)
mapWorkingToOriginalFile.putAll(sourcesMapping)
preProcessSources(sourceDestinationDir)
}
JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(myProject).outputUrl = JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(myProject).outputUrl =
JpsPathUtil.pathToUrl(getAbsolutePath("out")) JpsPathUtil.pathToUrl(getAbsolutePath("out"))
val jdk = addJdk("my jdk") val jdk = addJdk("my jdk")
val moduleDependencies = readModuleDependencies() val moduleDependencies = readModulesConfig()
mapWorkingToOriginalFile = hashMapOf() mapWorkingToOriginalFile = hashMapOf()
val moduleNames: Set<String>? if (moduleDependencies == null) configureSingleModuleProject(jdk)
if (moduleDependencies == null) { else configureMultiModuleProject(moduleDependencies, jdk)
addModule("module", arrayOf(getAbsolutePath("src")), null, null, jdk)
prepareModuleSources(moduleName = null)
moduleNames = null
} else {
val nameToModule = moduleDependencies.keys
.keysToMap { addModule(it, arrayOf(getAbsolutePath("$it/src")), null, null, jdk)!! }
for ((moduleName, dependencies) in moduleDependencies) { addStdlib()
val module = nameToModule[moduleName]!!
for (dependency in dependencies) { return moduleDependencies
JpsModuleRootModificationUtil.addDependency(
module, nameToModule[dependency.name],
JpsJavaDependencyScope.COMPILE, dependency.exported
)
}
}
for (module in nameToModule.values) {
prepareModuleSources(module.name)
}
moduleNames = nameToModule.keys
}
configureDependencies()
return moduleNames
} }
protected open fun configureDependencies() { private fun configureSingleModuleProject(jdk: JpsSdk<JpsDummyElement>?) {
addModule("module", arrayOf(getAbsolutePath("src")), null, null, jdk)
val sourceDestinationDir = File(workDir, "src")
val sourcesMapping = copyTestSources(testDataDir, File(workDir, "src"), "")
mapWorkingToOriginalFile.putAll(sourcesMapping)
preProcessSources(sourceDestinationDir)
}
private fun configureMultiModuleProject(
moduleDependencies: ModulesTxt,
jdk: JpsSdk<JpsDummyElement>?
) {
moduleDependencies.modules.forEach { module ->
module.jpsModule = addModule(
module.name,
arrayOf(getAbsolutePath("${module.name}/src")),
null,
null,
jdk
)!!
val kotlinFacetSettings = module.kotlinFacetSettings
if (kotlinFacetSettings != null) {
module.jpsModule.container.setChild(
JpsKotlinFacetModuleExtension.KIND,
JpsKotlinFacetModuleExtension(kotlinFacetSettings!!)
)
}
val sourceDirName = "${module.name}/src"
val filePrefix = "${module.name}_"
val sourceDestinationDir = File(workDir, sourceDirName)
val sourcesMapping = copyTestSources(testDataDir, sourceDestinationDir, filePrefix)
mapWorkingToOriginalFile.putAll(sourcesMapping)
preProcessSources(sourceDestinationDir)
}
moduleDependencies.dependencies.forEach {
JpsModuleRootModificationUtil.addDependency(
it.from.jpsModule, it.to.jpsModule,
it.scope, it.exported
)
}
}
protected open fun addStdlib() {
AbstractKotlinJpsBuildTestCase.addKotlinStdlibDependency(myProject) AbstractKotlinJpsBuildTestCase.addKotlinStdlibDependency(myProject)
AbstractKotlinJpsBuildTestCase.addKotlinTestDependency(myProject) AbstractKotlinJpsBuildTestCase.addKotlinTestDependency(myProject)
} }
@@ -24,7 +24,7 @@ abstract class AbstractIncrementalJsJpsTest : AbstractIncrementalJpsTest() {
super.tearDown() super.tearDown()
} }
override fun configureDependencies() { override fun addStdlib() {
AbstractKotlinJpsBuildTestCase.addKotlinJavaScriptStdlibDependency(myProject) AbstractKotlinJpsBuildTestCase.addKotlinJavaScriptStdlibDependency(myProject)
} }
@@ -5,10 +5,6 @@
package org.jetbrains.kotlin.jps.build package org.jetbrains.kotlin.jps.build
import org.jetbrains.kotlin.jps.build.dependeciestxt.DependenciesTxt
import org.jetbrains.kotlin.jps.build.dependeciestxt.MppJpsIncTestsGenerator
import java.io.File
abstract class AbstractMultiplatformJpsTest : AbstractIncrementalJpsTest() { abstract class AbstractMultiplatformJpsTest : AbstractIncrementalJpsTest() {
override fun doTest(testDataPath: String) { override fun doTest(testDataPath: String) {
// temporary ignore jps-plugin/testData/incremental/multiplatform/multiModule tests // temporary ignore jps-plugin/testData/incremental/multiplatform/multiModule tests
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.jps.build.dependeciestxt package org.jetbrains.kotlin.jps.build.dependeciestxt
import org.jetbrains.jps.model.java.JpsJavaDependencyScope import org.jetbrains.jps.model.java.JpsJavaDependencyScope
import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
@@ -22,7 +23,7 @@ import kotlin.reflect.full.memberProperties
* Dependencies description file. * Dependencies description file.
* See [README.md] for more details. * See [README.md] for more details.
*/ */
data class DependenciesTxt( data class ModulesTxt(
val file: File, val file: File,
val fileName: String, val fileName: String,
val modules: List<Module>, val modules: List<Module>,
@@ -62,6 +63,8 @@ data class DependenciesTxt(
@Flag @Flag
var editExpectActual: Boolean = false var editExpectActual: Boolean = false
lateinit var jpsModule: JpsModule
companion object { companion object {
val flags: Map<String, KMutableProperty1<Module, Boolean>> = Module::class.memberProperties val flags: Map<String, KMutableProperty1<Module, Boolean>> = Module::class.memberProperties
.filter { it.findAnnotation<Flag>() != null } .filter { it.findAnnotation<Flag>() != null }
@@ -98,17 +101,20 @@ class DependenciesTxtBuilder {
*/ */
class ModuleRef(name: String) { class ModuleRef(name: String) {
var defined: Boolean = false var defined: Boolean = false
var actual: DependenciesTxt.Module = DependenciesTxt.Module(name) var actual: ModulesTxt.Module = ModulesTxt.Module(name)
override fun toString() = actual.name override fun toString() = actual.name
fun build(index: Int): DependenciesTxt.Module { fun build(index: Int): ModulesTxt.Module {
val result = actual val result = actual
result.index = index result.index = index
val kotlinFacetSettings = result.kotlinFacetSettings val kotlinFacetSettings = result.kotlinFacetSettings
if (kotlinFacetSettings != null) { if (kotlinFacetSettings != null) {
kotlinFacetSettings.implementedModuleNames = kotlinFacetSettings.implementedModuleNames =
result.dependencies.filter { it.expectedBy }.map { it.to.name } result.dependencies.asSequence()
.filter { it.expectedBy }
.map { it.to.name }
.toList()
} }
return result return result
} }
@@ -124,20 +130,20 @@ class DependenciesTxtBuilder {
val expectedBy: Boolean, val expectedBy: Boolean,
val exported: Boolean val exported: Boolean
) { ) {
fun build(): DependenciesTxt.Dependency { fun build(): ModulesTxt.Dependency {
if (expectedBy) check(to.actual.isCommonModule) { "$this: ${to.actual} is not common module" } if (expectedBy) check(to.actual.isCommonModule) { "$this: ${to.actual} is not common module" }
return DependenciesTxt.Dependency(from.actual, to.actual, scope, expectedBy, exported) return ModulesTxt.Dependency(from.actual, to.actual, scope, expectedBy, exported)
} }
} }
fun readFile(file: File, fileTitle: String = file.toString()): DependenciesTxt { fun readFile(file: File, fileTitle: String = file.toString()): ModulesTxt {
file.forEachLine { line -> file.forEachLine { line ->
parseDeclaration(line) parseDeclaration(line)
} }
// module.build() requires built dependencies // module.build() requires built dependencies
val dependencies = dependencies.map { it.build() } val dependencies = dependencies.map { it.build() }
return DependenciesTxt( return ModulesTxt(
file, file,
fileTitle, fileTitle,
modules.values.mapIndexed { index, moduleRef -> moduleRef.build(index) }, modules.values.mapIndexed { index, moduleRef -> moduleRef.build(index) },
@@ -190,10 +196,10 @@ class DependenciesTxtBuilder {
private fun moduleRef(name: String) = private fun moduleRef(name: String) =
modules.getOrPut(name) { ModuleRef(name) } modules.getOrPut(name) { ModuleRef(name) }
private fun newModule(def: ValueWithFlags): DependenciesTxt.Module { private fun newModule(def: ValueWithFlags): ModulesTxt.Module {
val name = def.value.trim() val name = def.value.trim()
val module = DependenciesTxt.Module(name) val module = ModulesTxt.Module(name)
val kotlinFacetSettings = KotlinFacetSettings() val kotlinFacetSettings = KotlinFacetSettings()
module.kotlinFacetSettings = kotlinFacetSettings module.kotlinFacetSettings = kotlinFacetSettings
@@ -213,7 +219,7 @@ class DependenciesTxtBuilder {
"jvm" -> kotlinFacetSettings.compilerArguments = K2JVMCompilerArguments() "jvm" -> kotlinFacetSettings.compilerArguments = K2JVMCompilerArguments()
"js" -> kotlinFacetSettings.compilerArguments = K2JSCompilerArguments() "js" -> kotlinFacetSettings.compilerArguments = K2JSCompilerArguments()
else -> { else -> {
val flagProperty = DependenciesTxt.Module.flags[flag] val flagProperty = ModulesTxt.Module.flags[flag]
if (flagProperty != null) flagProperty.set(module, true) if (flagProperty != null) flagProperty.set(module, true)
else error("Unknown module flag `$flag`") else error("Unknown module flag `$flag`")
} }
@@ -236,16 +242,21 @@ class DependenciesTxtBuilder {
return null return null
} else { } else {
var exported = false var exported = false
var scope = JpsJavaDependencyScope.COMPILE var scope: JpsJavaDependencyScope? = null
var expectedBy = false var expectedBy = false
fun setScope(newScope: JpsJavaDependencyScope) {
check(scope == null) { "`$this: $from -> $to` dependency is already flagged as $scope" }
scope = newScope
}
flags.forEach { flag -> flags.forEach { flag ->
when (flag) { when (flag) {
"exported" -> exported = true "exported" -> exported = true
"compile" -> scope = JpsJavaDependencyScope.COMPILE "compile" -> setScope(JpsJavaDependencyScope.COMPILE)
"test" -> scope = JpsJavaDependencyScope.TEST "test" -> setScope(JpsJavaDependencyScope.TEST)
"runtime" -> scope = JpsJavaDependencyScope.RUNTIME "runtime" -> setScope(JpsJavaDependencyScope.RUNTIME)
"provided" -> scope = JpsJavaDependencyScope.PROVIDED "provided" -> setScope(JpsJavaDependencyScope.PROVIDED)
"expectedBy" -> expectedBy = true "expectedBy" -> expectedBy = true
else -> error("Unknown dependency flag `$flag`") else -> error("Unknown dependency flag `$flag`")
} }
@@ -254,7 +265,7 @@ class DependenciesTxtBuilder {
return DependencyBuilder( return DependencyBuilder(
from = moduleRef(from), from = moduleRef(from),
to = moduleRef(to), to = moduleRef(to),
scope = scope, scope = scope ?: JpsJavaDependencyScope.COMPILE,
expectedBy = expectedBy, expectedBy = expectedBy,
exported = exported exported = exported
).also { ).also {
@@ -25,8 +25,8 @@ fun actualizeMppJpsIncTestCaseDirs(rootDir: String, dir: String) {
return return
} }
class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider: (TestCase) -> File) { class MppJpsIncTestsGenerator(val txt: ModulesTxt, val testCaseDirProvider: (TestCase) -> File) {
val DependenciesTxt.Module.capitalName get() = name.capitalize() val ModulesTxt.Module.capitalName get() = name.capitalize()
val testCases: List<TestCase> val testCases: List<TestCase>
@@ -84,15 +84,15 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
} }
data class ModuleContentSettings( data class ModuleContentSettings(
val module: DependenciesTxt.Module, val module: ModulesTxt.Module,
val serviceNameSuffix: String = "", val serviceNameSuffix: String = "",
val generateActualDeclarationsFor: List<DependenciesTxt.Module> = module.expectedBy.map { it.to }, val generateActualDeclarationsFor: List<ModulesTxt.Module> = module.expectedBy.map { it.to },
val generatePlatformDependent: Boolean = true, val generatePlatformDependent: Boolean = true,
var generateKtFile: Boolean = true, var generateKtFile: Boolean = true,
var generateJavaFile: Boolean = true var generateJavaFile: Boolean = true
) )
inner class EditingTestCase(val module: DependenciesTxt.Module, val changeJavaClass: Boolean) : TestCase() { inner class EditingTestCase(val module: ModulesTxt.Module, val changeJavaClass: Boolean) : TestCase() {
override val name: String = override val name: String =
if (changeJavaClass) "editing${module.capitalName}Java" if (changeJavaClass) "editing${module.capitalName}Java"
else "editing${module.capitalName}Kotlin" else "editing${module.capitalName}Kotlin"
@@ -171,7 +171,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
} }
inner class EditingExpectActualTestCase(val commonModule: DependenciesTxt.Module) : TestCase() { inner class EditingExpectActualTestCase(val commonModule: ModulesTxt.Module) : TestCase() {
override val name: String = "editing${commonModule.capitalName}ExpectActual" override val name: String = "editing${commonModule.capitalName}ExpectActual"
override val dir: File = testCaseDirProvider(this) override val dir: File = testCaseDirProvider(this)
@@ -244,7 +244,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
abstract val dir: File abstract val dir: File
private val modules = mutableMapOf<DependenciesTxt.Module, ModuleContentSettings>() private val modules = mutableMapOf<ModulesTxt.Module, ModuleContentSettings>()
var step = 1 var step = 1
val steps = mutableListOf<String>() val steps = mutableListOf<String>()
@@ -255,7 +255,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
step++ step++
} }
var DependenciesTxt.Module.contentsSettings: ModuleContentSettings var ModulesTxt.Module.contentsSettings: ModuleContentSettings
get() = modules.getOrPut(this) { ModuleContentSettings(this) } get() = modules.getOrPut(this) { ModuleContentSettings(this) }
set(value) { set(value) {
modules[this] = value modules[this] = value
@@ -273,7 +273,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
} }
} }
private fun generateModuleContents(module: DependenciesTxt.Module) { private fun generateModuleContents(module: ModulesTxt.Module) {
when { when {
module.isCommonModule -> { module.isCommonModule -> {
// common module // common module
@@ -290,13 +290,13 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
} }
} }
private val DependenciesTxt.Module.serviceName private val ModulesTxt.Module.serviceName
get() = "$capitalName${contentsSettings.serviceNameSuffix}" get() = "$capitalName${contentsSettings.serviceNameSuffix}"
private val DependenciesTxt.Module.javaClassName private val ModulesTxt.Module.javaClassName
get() = "${serviceName}JavaClass" get() = "${serviceName}JavaClass"
protected fun serviceKtFile(module: DependenciesTxt.Module, fileNameSuffix: String = ""): File { protected fun serviceKtFile(module: ModulesTxt.Module, fileNameSuffix: String = ""): File {
val suffix = val suffix =
if (module.isCommonModule) "${module.serviceName}Header" if (module.isCommonModule) "${module.serviceName}Header"
else "${module.name.capitalize()}${module.contentsSettings.serviceNameSuffix}Impl" else "${module.name.capitalize()}${module.contentsSettings.serviceNameSuffix}Impl"
@@ -304,30 +304,30 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
return File(dir, "${module.indexedName}_service$suffix.kt$fileNameSuffix") return File(dir, "${module.indexedName}_service$suffix.kt$fileNameSuffix")
} }
fun serviceJavaFile(module: DependenciesTxt.Module, fileNameSuffix: String = ""): File { fun serviceJavaFile(module: ModulesTxt.Module, fileNameSuffix: String = ""): File {
return File(dir, "${module.indexedName}_${module.javaClassName}.java$fileNameSuffix") return File(dir, "${module.indexedName}_${module.javaClassName}.java$fileNameSuffix")
} }
private val DependenciesTxt.Module.platformDependentFunName: String private val ModulesTxt.Module.platformDependentFunName: String
get() { get() {
check(isCommonModule) check(isCommonModule)
return "${name}_platformDependent$serviceName" return "${name}_platformDependent$serviceName"
} }
private val DependenciesTxt.Module.platformIndependentFunName: String private val ModulesTxt.Module.platformIndependentFunName: String
get() { get() {
check(isCommonModule) check(isCommonModule)
return "${name}_platformIndependent$serviceName" return "${name}_platformIndependent$serviceName"
} }
private val DependenciesTxt.Module.platformOnlyFunName: String private val ModulesTxt.Module.platformOnlyFunName: String
get() { get() {
// platformOnly fun names already unique, so no module name prefix required // platformOnly fun names already unique, so no module name prefix required
return "${name}_platformOnly${contentsSettings.serviceNameSuffix}" return "${name}_platformOnly${contentsSettings.serviceNameSuffix}"
} }
protected fun generateCommonFile( protected fun generateCommonFile(
module: DependenciesTxt.Module, module: ModulesTxt.Module,
fileNameSuffix: String = "" fileNameSuffix: String = ""
) { ) {
val settings = module.contentsSettings val settings = module.contentsSettings
@@ -343,7 +343,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
} }
protected fun generatePlatformFile( protected fun generatePlatformFile(
module: DependenciesTxt.Module, module: ModulesTxt.Module,
fileNameSuffix: String = "" fileNameSuffix: String = ""
) { ) {
val isJvm = module.isJvmModule val isJvm = module.isJvmModule
@@ -386,7 +386,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
// call all functions declared in this module and all of its dependencies recursively // call all functions declared in this module and all of its dependencies recursively
private fun StringBuilder.appendTestFun( private fun StringBuilder.appendTestFun(
module: DependenciesTxt.Module, module: ModulesTxt.Module,
settings: ModuleContentSettings settings: ModuleContentSettings
) { ) {
appendln() appendln()
@@ -414,8 +414,8 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
appendln("}") appendln("}")
} }
private fun DependenciesTxt.Module.collectDependenciesRecursivelyTo( private fun ModulesTxt.Module.collectDependenciesRecursivelyTo(
collection: MutableCollection<DependenciesTxt.Module>, collection: MutableCollection<ModulesTxt.Module>,
exportedOnly: Boolean = false exportedOnly: Boolean = false
) { ) {
dependencies.forEach { dependencies.forEach {
@@ -1,5 +1,21 @@
================ Step #1 ================= ================ Step #1 =================
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module4' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
module4/src/d.kt
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module1 Building module1
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module1' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001) Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module1' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin: Marked as dirty by Kotlin:
@@ -40,19 +56,3 @@ Compiling files:
End of files End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Building module4
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module4' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
module4/src/d.kt
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module5
Exit code: NOTHING_DONE
------------------------------------------
@@ -6,6 +6,19 @@ Marked as dirty by Kotlin:
module2/src/b.kt module2/src/b.kt
module3/src/c.kt module3/src/c.kt
module4/src/d.kt module4/src/d.kt
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module1 Building module1
Cleaning output files: Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module out/production/module1/META-INF/module1.kotlin_module
@@ -37,16 +50,3 @@ Compiling files:
End of files End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Building module4
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module5
Exit code: NOTHING_DONE
------------------------------------------
@@ -1,5 +1,21 @@
================ Step #1 ================= ================ Step #1 =================
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module4' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
module4/src/d.kt
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module1 Building module1
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module1' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001) Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module1' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin: Marked as dirty by Kotlin:
@@ -22,6 +38,12 @@ Name expected
================ Step #2 ================= ================ Step #2 =================
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Exit code: NOTHING_DONE
------------------------------------------
Building module1 Building module1
Compiling files: Compiling files:
module1/src/a.kt module1/src/a.kt
@@ -55,19 +77,3 @@ Compiling files:
End of files End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Building module4
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module4' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
module4/src/d.kt
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module5
Exit code: NOTHING_DONE
------------------------------------------
@@ -7,6 +7,19 @@ Marked as dirty by Kotlin:
module2/src/b.kt module2/src/b.kt
module3/src/c.kt module3/src/c.kt
module4/src/d.kt module4/src/d.kt
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module1 Building module1
Cleaning output files: Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module out/production/module1/META-INF/module1.kotlin_module
@@ -25,6 +38,22 @@ Name expected
================ Step #2 ================= ================ Step #2 =================
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module4' production) are INVALID: actual=null -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
module4/src/d.kt
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module1 Building module1
Compiling files: Compiling files:
module1/src/a.kt module1/src/a.kt
@@ -52,16 +81,3 @@ Compiling files:
End of files End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Building module4
Cleaning output files:
out/production/module4/META-INF/module4.kotlin_module
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/d.kt
End of files
Exit code: OK
------------------------------------------
Building module5
Exit code: NOTHING_DONE
------------------------------------------
@@ -16,16 +16,6 @@ Exit code: ADDITIONAL_PASS_REQUIRED
------------------------------------------ ------------------------------------------
Exit code: NOTHING_DONE Exit code: NOTHING_DONE
------------------------------------------ ------------------------------------------
Building module2
Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/b/BKt.class
End of files
Compiling files:
module2/src/b.kt
End of files
Exit code: OK
------------------------------------------
Building module3 Building module3
Cleaning output files: Cleaning output files:
out/production/module3/META-INF/module3.kotlin_module out/production/module3/META-INF/module3.kotlin_module
@@ -36,3 +26,13 @@ Compiling files:
End of files End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Building module2
Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/b/BKt.class
End of files
Compiling files:
module2/src/b.kt
End of files
Exit code: OK
------------------------------------------
@@ -16,17 +16,6 @@ Exit code: ADDITIONAL_PASS_REQUIRED
------------------------------------------ ------------------------------------------
Exit code: NOTHING_DONE Exit code: NOTHING_DONE
------------------------------------------ ------------------------------------------
Building module2
Cleaning output files:
out/production/module2/module2.js
out/production/module2/module2.meta.js
out/production/module2/module2/b/b.kjsm
End of files
Compiling files:
module2/src/b.kt
End of files
Exit code: OK
------------------------------------------
Building module3 Building module3
Cleaning output files: Cleaning output files:
out/production/module3/module3.js out/production/module3/module3.js
@@ -38,3 +27,14 @@ Compiling files:
End of files End of files
Exit code: OK Exit code: OK
------------------------------------------ ------------------------------------------
Building module2
Cleaning output files:
out/production/module2/module2.js
out/production/module2/module2.meta.js
out/production/module2/module2/b/b.kjsm
End of files
Compiling files:
module2/src/b.kt
End of files
Exit code: OK
------------------------------------------