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.incremental.*
import org.jetbrains.jps.incremental.messages.BuildMessage
import org.jetbrains.jps.model.JpsDummyElement
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.library.sdk.JpsSdk
import org.jetbrains.jps.util.JpsPathUtil
import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.incremental.LookupSymbol
import org.jetbrains.kotlin.incremental.storage.version.CacheAttributesDiff
import org.jetbrains.kotlin.incremental.storage.version.CacheVersionManager
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.getKotlinCache
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.test.KotlinTestUtils
import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.keysToMap
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.File
@@ -247,20 +250,11 @@ abstract class AbstractIncrementalJpsTest(
rebuildAndCheckOutput(makeOverallResult)
}
private fun readModuleDependencies(): Map<String, List<DependencyDescriptor>>? {
val dependenciesTxt = File(testDataDir, "dependencies.txt")
if (!dependenciesTxt.exists()) return null
private fun readModulesConfig(): ModulesTxt? {
val dependenciesTxtFile = File(testDataDir, "dependencies.txt")
if (!dependenciesTxtFile.exists()) return null
val result = HashMap<String, List<DependencyDescriptor>>()
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
return DependenciesTxtBuilder().readFile(dependenciesTxtFile)
}
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)
Disposer.register(testRootDisposable, Disposable { FileUtilRt.delete(workDir) })
val moduleNames = configureModules()
val modulesTxt = configureModules()
initialMake()
val otherMakeResults = performModificationsAndMake(moduleNames)
val otherMakeResults = performModificationsAndMake(modulesTxt?.modules?.map { it.name })
val buildLogFile = buildLogFinder.findBuildLog(testDataDir)
val logs = createBuildLog(otherMakeResults)
@@ -371,7 +365,7 @@ abstract class AbstractIncrementalJpsTest(
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 modifications = getModificationsToPerform(testDataDir, moduleNames, allowNoFilesWithSuffixInTestData, TouchPolicy.TIMESTAMP)
@@ -393,55 +387,71 @@ abstract class AbstractIncrementalJpsTest(
}
// null means one module
private fun configureModules(): Set<String>? {
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)
}
private fun configureModules(): ModulesTxt? {
JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(myProject).outputUrl =
JpsPathUtil.pathToUrl(getAbsolutePath("out"))
val jdk = addJdk("my jdk")
val moduleDependencies = readModuleDependencies()
val moduleDependencies = readModulesConfig()
mapWorkingToOriginalFile = hashMapOf()
val moduleNames: Set<String>?
if (moduleDependencies == null) {
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)!! }
if (moduleDependencies == null) configureSingleModuleProject(jdk)
else configureMultiModuleProject(moduleDependencies, jdk)
for ((moduleName, dependencies) in moduleDependencies) {
val module = nameToModule[moduleName]!!
addStdlib()
for (dependency in dependencies) {
JpsModuleRootModificationUtil.addDependency(
module, nameToModule[dependency.name],
JpsJavaDependencyScope.COMPILE, dependency.exported
)
}
}
for (module in nameToModule.values) {
prepareModuleSources(module.name)
}
moduleNames = nameToModule.keys
}
configureDependencies()
return moduleNames
return moduleDependencies
}
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.addKotlinTestDependency(myProject)
}
@@ -24,7 +24,7 @@ abstract class AbstractIncrementalJsJpsTest : AbstractIncrementalJpsTest() {
super.tearDown()
}
override fun configureDependencies() {
override fun addStdlib() {
AbstractKotlinJpsBuildTestCase.addKotlinJavaScriptStdlibDependency(myProject)
}
@@ -5,10 +5,6 @@
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() {
override fun doTest(testDataPath: String) {
// temporary ignore jps-plugin/testData/incremental/multiplatform/multiModule tests
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.jps.build.dependeciestxt
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.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
@@ -22,7 +23,7 @@ import kotlin.reflect.full.memberProperties
* Dependencies description file.
* See [README.md] for more details.
*/
data class DependenciesTxt(
data class ModulesTxt(
val file: File,
val fileName: String,
val modules: List<Module>,
@@ -62,6 +63,8 @@ data class DependenciesTxt(
@Flag
var editExpectActual: Boolean = false
lateinit var jpsModule: JpsModule
companion object {
val flags: Map<String, KMutableProperty1<Module, Boolean>> = Module::class.memberProperties
.filter { it.findAnnotation<Flag>() != null }
@@ -98,17 +101,20 @@ class DependenciesTxtBuilder {
*/
class ModuleRef(name: String) {
var defined: Boolean = false
var actual: DependenciesTxt.Module = DependenciesTxt.Module(name)
var actual: ModulesTxt.Module = ModulesTxt.Module(name)
override fun toString() = actual.name
fun build(index: Int): DependenciesTxt.Module {
fun build(index: Int): ModulesTxt.Module {
val result = actual
result.index = index
val kotlinFacetSettings = result.kotlinFacetSettings
if (kotlinFacetSettings != null) {
kotlinFacetSettings.implementedModuleNames =
result.dependencies.filter { it.expectedBy }.map { it.to.name }
result.dependencies.asSequence()
.filter { it.expectedBy }
.map { it.to.name }
.toList()
}
return result
}
@@ -124,20 +130,20 @@ class DependenciesTxtBuilder {
val expectedBy: 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" }
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 ->
parseDeclaration(line)
}
// module.build() requires built dependencies
val dependencies = dependencies.map { it.build() }
return DependenciesTxt(
return ModulesTxt(
file,
fileTitle,
modules.values.mapIndexed { index, moduleRef -> moduleRef.build(index) },
@@ -190,10 +196,10 @@ class DependenciesTxtBuilder {
private fun moduleRef(name: String) =
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 module = DependenciesTxt.Module(name)
val module = ModulesTxt.Module(name)
val kotlinFacetSettings = KotlinFacetSettings()
module.kotlinFacetSettings = kotlinFacetSettings
@@ -213,7 +219,7 @@ class DependenciesTxtBuilder {
"jvm" -> kotlinFacetSettings.compilerArguments = K2JVMCompilerArguments()
"js" -> kotlinFacetSettings.compilerArguments = K2JSCompilerArguments()
else -> {
val flagProperty = DependenciesTxt.Module.flags[flag]
val flagProperty = ModulesTxt.Module.flags[flag]
if (flagProperty != null) flagProperty.set(module, true)
else error("Unknown module flag `$flag`")
}
@@ -236,16 +242,21 @@ class DependenciesTxtBuilder {
return null
} else {
var exported = false
var scope = JpsJavaDependencyScope.COMPILE
var scope: JpsJavaDependencyScope? = null
var expectedBy = false
fun setScope(newScope: JpsJavaDependencyScope) {
check(scope == null) { "`$this: $from -> $to` dependency is already flagged as $scope" }
scope = newScope
}
flags.forEach { flag ->
when (flag) {
"exported" -> exported = true
"compile" -> scope = JpsJavaDependencyScope.COMPILE
"test" -> scope = JpsJavaDependencyScope.TEST
"runtime" -> scope = JpsJavaDependencyScope.RUNTIME
"provided" -> scope = JpsJavaDependencyScope.PROVIDED
"compile" -> setScope(JpsJavaDependencyScope.COMPILE)
"test" -> setScope(JpsJavaDependencyScope.TEST)
"runtime" -> setScope(JpsJavaDependencyScope.RUNTIME)
"provided" -> setScope(JpsJavaDependencyScope.PROVIDED)
"expectedBy" -> expectedBy = true
else -> error("Unknown dependency flag `$flag`")
}
@@ -254,7 +265,7 @@ class DependenciesTxtBuilder {
return DependencyBuilder(
from = moduleRef(from),
to = moduleRef(to),
scope = scope,
scope = scope ?: JpsJavaDependencyScope.COMPILE,
expectedBy = expectedBy,
exported = exported
).also {
@@ -25,8 +25,8 @@ fun actualizeMppJpsIncTestCaseDirs(rootDir: String, dir: String) {
return
}
class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider: (TestCase) -> File) {
val DependenciesTxt.Module.capitalName get() = name.capitalize()
class MppJpsIncTestsGenerator(val txt: ModulesTxt, val testCaseDirProvider: (TestCase) -> File) {
val ModulesTxt.Module.capitalName get() = name.capitalize()
val testCases: List<TestCase>
@@ -84,15 +84,15 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
}
data class ModuleContentSettings(
val module: DependenciesTxt.Module,
val module: ModulesTxt.Module,
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,
var generateKtFile: 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 =
if (changeJavaClass) "editing${module.capitalName}Java"
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 dir: File = testCaseDirProvider(this)
@@ -244,7 +244,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
abstract val dir: File
private val modules = mutableMapOf<DependenciesTxt.Module, ModuleContentSettings>()
private val modules = mutableMapOf<ModulesTxt.Module, ModuleContentSettings>()
var step = 1
val steps = mutableListOf<String>()
@@ -255,7 +255,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
step++
}
var DependenciesTxt.Module.contentsSettings: ModuleContentSettings
var ModulesTxt.Module.contentsSettings: ModuleContentSettings
get() = modules.getOrPut(this) { ModuleContentSettings(this) }
set(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 {
module.isCommonModule -> {
// 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}"
private val DependenciesTxt.Module.javaClassName
private val ModulesTxt.Module.javaClassName
get() = "${serviceName}JavaClass"
protected fun serviceKtFile(module: DependenciesTxt.Module, fileNameSuffix: String = ""): File {
protected fun serviceKtFile(module: ModulesTxt.Module, fileNameSuffix: String = ""): File {
val suffix =
if (module.isCommonModule) "${module.serviceName}Header"
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")
}
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")
}
private val DependenciesTxt.Module.platformDependentFunName: String
private val ModulesTxt.Module.platformDependentFunName: String
get() {
check(isCommonModule)
return "${name}_platformDependent$serviceName"
}
private val DependenciesTxt.Module.platformIndependentFunName: String
private val ModulesTxt.Module.platformIndependentFunName: String
get() {
check(isCommonModule)
return "${name}_platformIndependent$serviceName"
}
private val DependenciesTxt.Module.platformOnlyFunName: String
private val ModulesTxt.Module.platformOnlyFunName: String
get() {
// platformOnly fun names already unique, so no module name prefix required
return "${name}_platformOnly${contentsSettings.serviceNameSuffix}"
}
protected fun generateCommonFile(
module: DependenciesTxt.Module,
module: ModulesTxt.Module,
fileNameSuffix: String = ""
) {
val settings = module.contentsSettings
@@ -343,7 +343,7 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
}
protected fun generatePlatformFile(
module: DependenciesTxt.Module,
module: ModulesTxt.Module,
fileNameSuffix: String = ""
) {
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
private fun StringBuilder.appendTestFun(
module: DependenciesTxt.Module,
module: ModulesTxt.Module,
settings: ModuleContentSettings
) {
appendln()
@@ -414,8 +414,8 @@ class MppJpsIncTestsGenerator(val txt: DependenciesTxt, val testCaseDirProvider:
appendln("}")
}
private fun DependenciesTxt.Module.collectDependenciesRecursivelyTo(
collection: MutableCollection<DependenciesTxt.Module>,
private fun ModulesTxt.Module.collectDependenciesRecursivelyTo(
collection: MutableCollection<ModulesTxt.Module>,
exportedOnly: Boolean = false
) {
dependencies.forEach {
@@ -1,5 +1,21 @@
================ 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
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module1' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
@@ -39,20 +55,4 @@ Compiling files:
module3/src/c.kt
End of files
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
module3/src/c.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
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
@@ -36,17 +49,4 @@ Compiling files:
module3/src/c.kt
End of files
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 =================
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
Local cache for KotlinChunk<KotlinJvmModuleBuildTarget>(Module 'module1' production) are INVALID: actual=CacheVersion(version=777) -> expected=CacheVersion(version=9011001)
Marked as dirty by Kotlin:
@@ -22,6 +38,12 @@ Name expected
================ Step #2 =================
Building module5
Exit code: NOTHING_DONE
------------------------------------------
Building module4
Exit code: NOTHING_DONE
------------------------------------------
Building module1
Compiling files:
module1/src/a.kt
@@ -54,20 +76,4 @@ Compiling files:
module3/src/c.kt
End of files
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
module3/src/c.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
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
@@ -25,6 +38,22 @@ Name expected
================ 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
Compiling files:
module1/src/a.kt
@@ -51,17 +80,4 @@ Compiling files:
module3/src/c.kt
End of files
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
------------------------------------------
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
Cleaning output files:
out/production/module3/META-INF/module3.kotlin_module
@@ -36,3 +26,13 @@ Compiling files:
End of files
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
------------------------------------------
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
Cleaning output files:
out/production/module3/module3.js
@@ -37,4 +26,15 @@ Compiling files:
module3/src/c.kt
End of files
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
------------------------------------------