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
Original commit: c7f66a1585
This commit is contained in:
@@ -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) {
|
||||
|
||||
+10
-5
@@ -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->
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package a
|
||||
package module1
|
||||
|
||||
class A
|
||||
|
||||
@@ -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 {}
|
||||
+5
-5
@@ -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()
|
||||
}
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
package b
|
||||
|
||||
fun b(param: a.A) {
|
||||
a.a()
|
||||
}
|
||||
+1
-2
@@ -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
|
||||
+1
-2
@@ -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
|
||||
+1
-2
@@ -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
|
||||
+3
@@ -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
|
||||
+7
-17
@@ -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
|
||||
|
||||
+1
-4
@@ -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
|
||||
+1
-2
@@ -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
|
||||
+1
-2
@@ -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
|
||||
Reference in New Issue
Block a user