Fix recompilation of dependent modules on cache/abi version change

New cache version was written to dependent targets,
when they have not been compiled yet

 #KT-9190 Fixed
This commit is contained in:
Alexey Tsvetkov
2015-09-23 16:20:48 +03:00
parent 7ef23da289
commit c7f66a1585
25 changed files with 126 additions and 58 deletions
@@ -30,7 +30,10 @@ import org.jetbrains.jps.builders.java.JavaBuilderUtil
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor
import org.jetbrains.jps.builders.java.dependencyView.Mappings
import org.jetbrains.jps.incremental.*
import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.*
import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.ABORT
import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.ADDITIONAL_PASS_REQUIRED
import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.NOTHING_DONE
import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.OK
import org.jetbrains.jps.incremental.fs.CompilationRound
import org.jetbrains.jps.incremental.java.JavaBuilder
import org.jetbrains.jps.incremental.messages.BuildMessage
@@ -143,7 +146,8 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
LOG.info("Clearing caches for " + chunk.targets.map { it.presentableName }.join())
val incrementalCaches = getIncrementalCaches(chunk, context)
incrementalCaches.values().forEach(StorageOwner::clean)
return CHUNK_REBUILD_REQUIRED
FSOperations.markDirtyRecursively(context, CompilationRound.NEXT, chunk)
return ADDITIONAL_PASS_REQUIRED
}
}
@@ -205,7 +209,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
isJsModule -> ChangesInfo.NO_CHANGES
else -> {
val generatedClasses = generatedFiles.filterIsInstance<GeneratedJvmClass>()
val info = updateKotlinIncrementalCache(compilationErrors, incrementalCaches, generatedFiles)
val info = updateKotlinIncrementalCache(compilationErrors, incrementalCaches, generatedFiles, chunk)
updateJavaMappings(chunk, compilationErrors, context, dirtyFilesHolder, filesToCompile, generatedClasses)
info
}
@@ -264,7 +268,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
private fun recompileEverything() {
allCompiledFiles.clear()
FSOperations.markDirtyRecursively(context, chunk)
FSOperations.markDirtyRecursively(context, CompilationRound.NEXT, chunk)
}
private fun recompileOtherAndDependents() {
@@ -449,13 +453,14 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
private fun updateKotlinIncrementalCache(
compilationErrors: Boolean,
incrementalCaches: Map<ModuleBuildTarget, IncrementalCacheImpl>,
generatedFiles: List<GeneratedFile>
generatedFiles: List<GeneratedFile>,
chunk: ModuleChunk
): ChangesInfo {
if (!IncrementalCompilation.isEnabled()) {
return ChangesInfo.NO_CHANGES
}
incrementalCaches.values().forEach { it.saveCacheFormatVersion() }
chunk.targets.forEach { incrementalCaches[it]!!.saveCacheFormatVersion() }
var changesInfo = ChangesInfo.NO_CHANGES
for (generatedFile in generatedFiles) {
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.jps.build
import org.jetbrains.kotlin.jps.incremental.getKotlinCacheVersion
import kotlin.test.assertTrue
public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(allowNoFilesWithSuffixInTestData = true) {
fun testCacheVersionChanged() {
@@ -28,8 +27,12 @@ public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(all
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedAndFileModified/")
}
fun testCacheVersionChangedMultiModule() {
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedMultiModule/")
fun testCacheVersionChangedMultiModule1() {
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedModule1/")
}
fun testCacheVersionChangedMultiModule2() {
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedModule2/")
}
override fun performAdditionalModifications(modifications: List<AbstractIncrementalJpsTest.Modification>) {
@@ -39,8 +42,10 @@ public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(all
for (target in targets) {
val cacheVersion = paths.getKotlinCacheVersion(target)
val cacheVersionFile = cacheVersion.formatVersionFile
assertTrue(cacheVersionFile.exists(), "Cache version file does not exists: $cacheVersionFile")
cacheVersionFile.writeText("777")
if (cacheVersionFile.exists()) {
cacheVersionFile.writeText("777")
}
}
}
}
@@ -0,0 +1,31 @@
Cleaning output files:
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/module4_d.kt
End of files
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/module1/A.class
out/production/module1/module1/Module1Package.class
out/production/module1/module1/Module1_aKt.class
End of files
Compiling files:
module1/src/module1_a.kt
End of files
Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/module2/Module2Package.class
out/production/module2/module2/Module2_bKt.class
End of files
Compiling files:
module2/src/module2_b.kt
End of files
Cleaning output files:
out/production/module3/META-INF/module3.kotlin_module
out/production/module3/module3/Module3Package.class
out/production/module3/module3/Module3_cKt.class
End of files
Compiling files:
module3/src/module3_c.kt
End of files
@@ -0,0 +1,5 @@
module1->
module2->module1
module3->module2
module4->
module5->
@@ -0,0 +1,6 @@
package module1
class A
fun a() {
}
@@ -0,0 +1,8 @@
package module2
import module1.*
fun b() {
A()
a()
}
@@ -0,0 +1,7 @@
package module3
import module2.*
fun c() {
b()
}
@@ -0,0 +1,3 @@
package module4
class D
@@ -0,0 +1,3 @@
package module5;
class E {}
@@ -1,16 +1,16 @@
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/a/A.class
out/production/module1/a/APackage.class
out/production/module1/a/Module1_aKt.class
out/production/module1/module1/A.class
out/production/module1/module1/Module1Package.class
out/production/module1/module1/Module1_aKt.class
End of files
Compiling files:
module1/src/module1_a.kt
End of files
Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/b/BPackage.class
out/production/module2/b/Module2_bKt.class
out/production/module2/module2/Module2Package.class
out/production/module2/module2/Module2_bKt.class
End of files
Compiling files:
module2/src/module2_b.kt
@@ -0,0 +1,6 @@
package module1
class A
fun a() {
}
@@ -0,0 +1,7 @@
package module2
import module1.*
fun b(param: A) {
a()
}
@@ -0,0 +1,7 @@
package module2
import module1.*
fun b(param: A) {
a()
}
@@ -1,5 +0,0 @@
package b
fun b(param: a.A) {
a.a()
}
@@ -1,5 +0,0 @@
package b
fun b(param: a.A) {
a.a()
}
@@ -2,5 +2,4 @@ Module 'module' production
format-version.txt
proto.tab
source-to-classes.tab
Module 'module' tests
format-version.txt
Module 'module' tests
@@ -4,5 +4,4 @@ Module 'module' production
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module' tests
format-version.txt
Module 'module' tests
@@ -3,5 +3,4 @@ Module 'module' production
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module' tests
format-version.txt
Module 'module' tests
@@ -4,4 +4,7 @@ End of files
Compiling files:
module1/src/module1_a.kt
module1/src/module1_other.kt
End of files
Compiling files:
module2/src/module2_B.java
End of files
@@ -5,30 +5,20 @@ Compiling files:
module1/src/module1_a.kt
module1/src/module1_other.kt
End of files
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/module1/A.class
out/production/module1/module1/Module1Package.class
out/production/module1/module1/Module1_aKt.class
Compiling files:
module3/src/module3_c.kt
End of files
Compiling files:
module1/src/module1_a.kt
End of files
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/module1/A.class
out/production/module1/module1/Module1Package.class
out/production/module1/module1/Module1_aKt.class
out/production/module1/module1/Module1_otherKt.class
module2/src/module2_B.java
End of files
Compiling files:
module1/src/module1_a.kt
module1/src/module1_other.kt
End of files
Cleaning output files:
out/production/module2/B.class
Compiling files:
module3/src/module3_c.kt
End of files
Compiling files:
module2/src/module2_B.java
@@ -5,14 +5,11 @@ Module 'module1' production
proto.tab
source-to-classes.tab
Module 'module1' tests
format-version.txt
Module 'module2' production
format-version.txt
Module 'module2' tests
Module 'module3' production
format-version.txt
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module3' tests
format-version.txt
Module 'module3' tests
@@ -4,5 +4,4 @@ Module 'module' production
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module' tests
format-version.txt
Module 'module' tests
@@ -5,5 +5,4 @@ Module 'module' production
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module' tests
format-version.txt
Module 'module' tests