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.JavaSourceRootDescriptor
|
||||||
import org.jetbrains.jps.builders.java.dependencyView.Mappings
|
import org.jetbrains.jps.builders.java.dependencyView.Mappings
|
||||||
import org.jetbrains.jps.incremental.*
|
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.fs.CompilationRound
|
||||||
import org.jetbrains.jps.incremental.java.JavaBuilder
|
import org.jetbrains.jps.incremental.java.JavaBuilder
|
||||||
import org.jetbrains.jps.incremental.messages.BuildMessage
|
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())
|
LOG.info("Clearing caches for " + chunk.targets.map { it.presentableName }.join())
|
||||||
val incrementalCaches = getIncrementalCaches(chunk, context)
|
val incrementalCaches = getIncrementalCaches(chunk, context)
|
||||||
incrementalCaches.values().forEach(StorageOwner::clean)
|
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
|
isJsModule -> ChangesInfo.NO_CHANGES
|
||||||
else -> {
|
else -> {
|
||||||
val generatedClasses = generatedFiles.filterIsInstance<GeneratedJvmClass>()
|
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)
|
updateJavaMappings(chunk, compilationErrors, context, dirtyFilesHolder, filesToCompile, generatedClasses)
|
||||||
info
|
info
|
||||||
}
|
}
|
||||||
@@ -264,7 +268,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
|
|||||||
|
|
||||||
private fun recompileEverything() {
|
private fun recompileEverything() {
|
||||||
allCompiledFiles.clear()
|
allCompiledFiles.clear()
|
||||||
FSOperations.markDirtyRecursively(context, chunk)
|
FSOperations.markDirtyRecursively(context, CompilationRound.NEXT, chunk)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun recompileOtherAndDependents() {
|
private fun recompileOtherAndDependents() {
|
||||||
@@ -449,13 +453,14 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
|
|||||||
private fun updateKotlinIncrementalCache(
|
private fun updateKotlinIncrementalCache(
|
||||||
compilationErrors: Boolean,
|
compilationErrors: Boolean,
|
||||||
incrementalCaches: Map<ModuleBuildTarget, IncrementalCacheImpl>,
|
incrementalCaches: Map<ModuleBuildTarget, IncrementalCacheImpl>,
|
||||||
generatedFiles: List<GeneratedFile>
|
generatedFiles: List<GeneratedFile>,
|
||||||
|
chunk: ModuleChunk
|
||||||
): ChangesInfo {
|
): ChangesInfo {
|
||||||
if (!IncrementalCompilation.isEnabled()) {
|
if (!IncrementalCompilation.isEnabled()) {
|
||||||
return ChangesInfo.NO_CHANGES
|
return ChangesInfo.NO_CHANGES
|
||||||
}
|
}
|
||||||
|
|
||||||
incrementalCaches.values().forEach { it.saveCacheFormatVersion() }
|
chunk.targets.forEach { incrementalCaches[it]!!.saveCacheFormatVersion() }
|
||||||
|
|
||||||
var changesInfo = ChangesInfo.NO_CHANGES
|
var changesInfo = ChangesInfo.NO_CHANGES
|
||||||
for (generatedFile in generatedFiles) {
|
for (generatedFile in generatedFiles) {
|
||||||
|
|||||||
+10
-5
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.jps.build
|
package org.jetbrains.kotlin.jps.build
|
||||||
|
|
||||||
import org.jetbrains.kotlin.jps.incremental.getKotlinCacheVersion
|
import org.jetbrains.kotlin.jps.incremental.getKotlinCacheVersion
|
||||||
import kotlin.test.assertTrue
|
|
||||||
|
|
||||||
public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(allowNoFilesWithSuffixInTestData = true) {
|
public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(allowNoFilesWithSuffixInTestData = true) {
|
||||||
fun testCacheVersionChanged() {
|
fun testCacheVersionChanged() {
|
||||||
@@ -28,8 +27,12 @@ public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(all
|
|||||||
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedAndFileModified/")
|
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedAndFileModified/")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testCacheVersionChangedMultiModule() {
|
fun testCacheVersionChangedMultiModule1() {
|
||||||
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedMultiModule/")
|
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedModule1/")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testCacheVersionChangedMultiModule2() {
|
||||||
|
doTest("jps-plugin/testData/incremental/custom/cacheVersionChangedModule2/")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun performAdditionalModifications(modifications: List<AbstractIncrementalJpsTest.Modification>) {
|
override fun performAdditionalModifications(modifications: List<AbstractIncrementalJpsTest.Modification>) {
|
||||||
@@ -39,8 +42,10 @@ public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(all
|
|||||||
for (target in targets) {
|
for (target in targets) {
|
||||||
val cacheVersion = paths.getKotlinCacheVersion(target)
|
val cacheVersion = paths.getKotlinCacheVersion(target)
|
||||||
val cacheVersionFile = cacheVersion.formatVersionFile
|
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
|
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:
|
Cleaning output files:
|
||||||
out/production/module1/META-INF/module1.kotlin_module
|
out/production/module1/META-INF/module1.kotlin_module
|
||||||
out/production/module1/a/A.class
|
out/production/module1/module1/A.class
|
||||||
out/production/module1/a/APackage.class
|
out/production/module1/module1/Module1Package.class
|
||||||
out/production/module1/a/Module1_aKt.class
|
out/production/module1/module1/Module1_aKt.class
|
||||||
End of files
|
End of files
|
||||||
Compiling files:
|
Compiling files:
|
||||||
module1/src/module1_a.kt
|
module1/src/module1_a.kt
|
||||||
End of files
|
End of files
|
||||||
Cleaning output files:
|
Cleaning output files:
|
||||||
out/production/module2/META-INF/module2.kotlin_module
|
out/production/module2/META-INF/module2.kotlin_module
|
||||||
out/production/module2/b/BPackage.class
|
out/production/module2/module2/Module2Package.class
|
||||||
out/production/module2/b/Module2_bKt.class
|
out/production/module2/module2/Module2_bKt.class
|
||||||
End of files
|
End of files
|
||||||
Compiling files:
|
Compiling files:
|
||||||
module2/src/module2_b.kt
|
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
|
format-version.txt
|
||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module' tests
|
Module 'module' tests
|
||||||
format-version.txt
|
|
||||||
+1
-2
@@ -4,5 +4,4 @@ Module 'module' production
|
|||||||
package-parts.tab
|
package-parts.tab
|
||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module' tests
|
Module 'module' tests
|
||||||
format-version.txt
|
|
||||||
+1
-2
@@ -3,5 +3,4 @@ Module 'module' production
|
|||||||
package-parts.tab
|
package-parts.tab
|
||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module' tests
|
Module 'module' tests
|
||||||
format-version.txt
|
|
||||||
+3
@@ -4,4 +4,7 @@ End of files
|
|||||||
Compiling files:
|
Compiling files:
|
||||||
module1/src/module1_a.kt
|
module1/src/module1_a.kt
|
||||||
module1/src/module1_other.kt
|
module1/src/module1_other.kt
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
module2/src/module2_B.java
|
||||||
End of files
|
End of files
|
||||||
+7
-17
@@ -5,30 +5,20 @@ Compiling files:
|
|||||||
module1/src/module1_a.kt
|
module1/src/module1_a.kt
|
||||||
module1/src/module1_other.kt
|
module1/src/module1_other.kt
|
||||||
End of files
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
module3/src/module3_c.kt
|
||||||
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
|
End of files
|
||||||
Compiling files:
|
Compiling files:
|
||||||
module1/src/module1_a.kt
|
module2/src/module2_B.java
|
||||||
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
|
|
||||||
End of files
|
End of files
|
||||||
|
|
||||||
|
|
||||||
Compiling files:
|
Compiling files:
|
||||||
module1/src/module1_a.kt
|
module1/src/module1_a.kt
|
||||||
module1/src/module1_other.kt
|
module1/src/module1_other.kt
|
||||||
End of files
|
End of files
|
||||||
Cleaning output files:
|
Compiling files:
|
||||||
out/production/module2/B.class
|
module3/src/module3_c.kt
|
||||||
End of files
|
End of files
|
||||||
Compiling files:
|
Compiling files:
|
||||||
module2/src/module2_B.java
|
module2/src/module2_B.java
|
||||||
|
|||||||
+1
-4
@@ -5,14 +5,11 @@ Module 'module1' production
|
|||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module1' tests
|
Module 'module1' tests
|
||||||
format-version.txt
|
|
||||||
Module 'module2' production
|
Module 'module2' production
|
||||||
format-version.txt
|
|
||||||
Module 'module2' tests
|
Module 'module2' tests
|
||||||
Module 'module3' production
|
Module 'module3' production
|
||||||
format-version.txt
|
format-version.txt
|
||||||
package-parts.tab
|
package-parts.tab
|
||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module3' tests
|
Module 'module3' tests
|
||||||
format-version.txt
|
|
||||||
+1
-2
@@ -4,5 +4,4 @@ Module 'module' production
|
|||||||
package-parts.tab
|
package-parts.tab
|
||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module' tests
|
Module 'module' tests
|
||||||
format-version.txt
|
|
||||||
+1
-2
@@ -5,5 +5,4 @@ Module 'module' production
|
|||||||
package-parts.tab
|
package-parts.tab
|
||||||
proto.tab
|
proto.tab
|
||||||
source-to-classes.tab
|
source-to-classes.tab
|
||||||
Module 'module' tests
|
Module 'module' tests
|
||||||
format-version.txt
|
|
||||||
Reference in New Issue
Block a user