diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheCommon.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheCommon.kt index 80327f0c197..3e6f7ed3b3f 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheCommon.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheCommon.kt @@ -88,11 +88,17 @@ abstract class IncrementalCacheCommon(workingDir: File) : BasicMapsOw abstract fun clearCacheForRemovedClasses(changesCollector: ChangesCollector) - protected fun removeAllFromClassStorage(removedClasses: Collection) { + protected fun removeAllFromClassStorage(removedClasses: Collection, changesCollector: ChangesCollector) { if (removedClasses.isEmpty()) return val removedFqNames = removedClasses.toSet() + for (removedClass in removedFqNames) { + for (affectedClass in withSubtypes(removedClass, thisWithDependentCaches)) { + changesCollector.collectSignature(affectedClass, areSubclassesAffected = false) + } + } + for (cache in thisWithDependentCaches) { val parentsFqNames = hashSetOf() val childrenFqNames = hashSetOf() diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt index 0864dd78d0f..a75bd4ac7a3 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt @@ -100,7 +100,7 @@ open class IncrementalJsCache(cachesDir: File) : IncrementalCacheCommon( translationResults.remove(it, changesCollector) inlineFunctions.remove(it) } - removeAllFromClassStorage(dirtyOutputClassesMap.getDirtyOutputClasses()) + removeAllFromClassStorage(dirtyOutputClassesMap.getDirtyOutputClasses(), changesCollector) dirtySources.clear() dirtyOutputClassesMap.clean() } diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJvmCache.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJvmCache.kt index 6d0a8fedf87..b3a400ba2da 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJvmCache.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJvmCache.kt @@ -223,7 +223,7 @@ open class IncrementalJvmCache( javaSourcesProtoMap.remove(it, changesCollector) } - removeAllFromClassStorage(dirtyClasses.map { it.fqNameForClassNameWithoutDollars }) + removeAllFromClassStorage(dirtyClasses.map { it.fqNameForClassNameWithoutDollars }, changesCollector) dirtyOutputClassesMap.clean() } diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/classRemoved/gradle-build.log b/jps-plugin/testData/incremental/classHierarchyAffected/classRemoved/gradle-build.log new file mode 100644 index 00000000000..c6ed1e50299 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/classRemoved/gradle-build.log @@ -0,0 +1,33 @@ +================ Step #1 ================= + +Compiling files: + src/B.kt + src/C.kt + src/createA.kt + src/createB.kt + src/createC.kt + src/useAfoo.kt + src/useBbar.kt + src/useCbaz.kt +End of files +Exit code: ABORT +------------------------------------------ +COMPILATION FAILED +Unresolved reference: A +Unresolved reference: A + +================ Step #2 ================= + +Compiling files: + src/B.kt + src/C.kt + src/createA.kt + src/createB.kt + src/createC.kt + src/funA.kt + src/useAfoo.kt + src/useBbar.kt + src/useCbaz.kt +End of files +Exit code: OK + diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/classRemovedAndRestored/gradle-build.log b/jps-plugin/testData/incremental/classHierarchyAffected/classRemovedAndRestored/gradle-build.log new file mode 100644 index 00000000000..d84bd394fbd --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/classRemovedAndRestored/gradle-build.log @@ -0,0 +1,36 @@ +================ Step #1 ================= + +Compiling files: + src/B.kt + src/createA.kt + src/createB.kt + src/useAfoo.kt + src/useBbar.kt +End of files +Exit code: ABORT +------------------------------------------ +COMPILATION FAILED +Unresolved reference: A +Unresolved reference: A + +================ Step #2 ================= + +Compiling files: + src/A.kt + src/B.kt + src/createA.kt + src/createB.kt + src/useAfoo.kt + src/useBbar.kt +End of files +Exit code: OK + +================ Step #3 ================= + +Compiling files: + src/failCompilation.kt +End of files +Exit code: ABORT +------------------------------------------ +COMPILATION FAILED +Expecting a top level declaration diff --git a/jps-plugin/testData/incremental/multiModule/classRemoved/build.log b/jps-plugin/testData/incremental/multiModule/classRemoved/build.log index 4a1d1fc30bd..9b620ddd4fc 100644 --- a/jps-plugin/testData/incremental/multiModule/classRemoved/build.log +++ b/jps-plugin/testData/incremental/multiModule/classRemoved/build.log @@ -34,6 +34,20 @@ Compiling files: module2/src/createA.kt module2/src/useAfoo.kt End of files +Marked as dirty by Kotlin: + module2/src/createB.kt + module2/src/useBbar.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module2/META-INF/module2.kotlin_module + out/production/module2/use/CreateBKt.class + out/production/module2/use/UseBbarKt.class +End of files +Compiling files: + module2/src/createB.kt + module2/src/useBbar.kt +End of files Exit code: OK ------------------------------------------