From 08e62d3303b7b79cb46a92b1cf12cbc17d7c521f Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 22 Jan 2016 15:47:35 +0300 Subject: [PATCH] Recompile subtypes when class member is changed Original commit: a474165a8fa752b8658d21098fff553ac2aae223 --- .../kotlin/jps/build/KotlinBuilder.kt | 16 ++++++++++--- ...perimentalIncrementalJpsTestGenerated.java | 12 ++++++++++ .../experimentalOn/expected-kotlin-caches.txt | 4 ++++ .../build.log | 4 ++++ .../methodAdded/build.log | 2 ++ .../methodAnnotationAdded/build.log | 2 ++ .../methodNullabilityChanged/build.log | 3 +++ .../overrideExplicit/A.kt | 3 +++ .../overrideExplicit/A.kt.new.1 | 3 +++ .../overrideExplicit/A.kt.new.2 | 3 +++ .../overrideExplicit/B.kt | 3 +++ .../overrideExplicit/C.kt | 1 + .../overrideExplicit/build.log | 23 +++++++++++++++++++ .../overrideImplicit/A.kt | 3 +++ .../overrideImplicit/B.kt | 3 +++ .../overrideImplicit/B.kt.new.1 | 3 +++ .../overrideImplicit/B.kt.new.2 | 3 +++ .../overrideImplicit/BA.kt | 1 + .../overrideImplicit/C.kt | 1 + .../overrideImplicit/build.log | 23 +++++++++++++++++++ .../propertyNullabilityChanged/build.log | 3 +++ .../experimental-expected-kotlin-caches.txt | 3 ++- .../experimental-expected-kotlin-caches.txt | 3 ++- .../experimental-ic-build.log | 7 ++++++ 24 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.1 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.2 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/B.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/C.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/build.log create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/A.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.1 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.2 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/BA.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/C.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/build.log diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 62773565ebb..3a0d2447b13 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -744,6 +744,7 @@ private fun CompilationResult.doProcessChangesUsingLookups( caches: Collection> ) { val dirtyLookupSymbols = HashSet() + val dirtyClassesFqNames = HashSet() val lookupStorage = dataManager.getStorage(KotlinDataContainerTarget, JpsLookupStorageProvider) val allCaches: Sequence> = caches.asSequence().flatMap { it.dependentsWithThis } @@ -764,10 +765,12 @@ private fun CompilationResult.doProcessChangesUsingLookups( } } else if (change is ChangeInfo.MembersChanged) { - val scopes = withSubtypes(change.fqName, allCaches).map { it.asString() } + val fqNames = withSubtypes(change.fqName, allCaches) + // need to recompile subtypes because changed member might break override + dirtyClassesFqNames.addAll(fqNames) - change.names.forAllPairs(scopes) { name, scope -> - dirtyLookupSymbols.add(LookupSymbol(name, scope)) + change.names.forAllPairs(fqNames) { name, fqName -> + dirtyLookupSymbols.add(LookupSymbol(name, fqName.asString())) } } } @@ -782,6 +785,13 @@ private fun CompilationResult.doProcessChangesUsingLookups( dirtyFiles.addAll(affectedFiles) } + for (cache in allCaches) { + for (dirtyClassFqName in dirtyClassesFqNames) { + val srcFile = cache.getSourceFileIfClass(dirtyClassFqName) ?: continue + dirtyFiles.add(srcFile) + } + } + fsOperations.markFiles(dirtyFiles.asIterable(), excludeFiles = compiledFiles) KotlinBuilder.LOG.debug("End of processing changes") } diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java index 21cb93aca87..8d733b367d3 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java @@ -1213,6 +1213,18 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta doTest(fileName); } + @TestMetadata("overrideExplicit") + public void testOverrideExplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/"); + doTest(fileName); + } + + @TestMetadata("overrideImplicit") + public void testOverrideImplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/"); + doTest(fileName); + } + @TestMetadata("packageFacadeToClass") public void testPackageFacadeToClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/packageFacadeToClass/"); diff --git a/jps/jps-plugin/testData/incremental/changeIncrementalOption/experimentalOn/expected-kotlin-caches.txt b/jps/jps-plugin/testData/incremental/changeIncrementalOption/experimentalOn/expected-kotlin-caches.txt index c892b694310..17c6e62dbff 100644 --- a/jps/jps-plugin/testData/incremental/changeIncrementalOption/experimentalOn/expected-kotlin-caches.txt +++ b/jps/jps-plugin/testData/incremental/changeIncrementalOption/experimentalOn/expected-kotlin-caches.txt @@ -7,12 +7,14 @@ kotlin-data-container Module 'module1' production experimental-format-version.txt format-version.txt + class-fq-name-to-source.tab proto.tab source-to-classes.tab Module 'module1' tests Module 'module2' production experimental-format-version.txt format-version.txt + class-fq-name-to-source.tab package-parts.tab proto.tab source-to-classes.tab @@ -22,12 +24,14 @@ Module 'module2' tests Module 'module3' production experimental-format-version.txt format-version.txt + class-fq-name-to-source.tab proto.tab source-to-classes.tab Module 'module3' tests Module 'module4' production experimental-format-version.txt format-version.txt + class-fq-name-to-source.tab proto.tab source-to-classes.tab Module 'module4' tests \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/companionObjectInheritedMemberChanged/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/companionObjectInheritedMemberChanged/build.log index f83d4d254bb..6fdf4fc4dbc 100644 --- a/jps/jps-plugin/testData/incremental/classHierarchyAffected/companionObjectInheritedMemberChanged/build.log +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/companionObjectInheritedMemberChanged/build.log @@ -5,6 +5,8 @@ Compiling files: src/B.kt End of files Cleaning output files: +out/production/module/A$AA.class +out/production/module/A.class out/production/module/CompanionExtensionKt.class out/production/module/CompanionReferenceExplicitKt.class out/production/module/CompanionReferenceImplicitKt.class @@ -12,6 +14,7 @@ out/production/module/ImportedMemberKt.class out/production/module/META-INF/module.kotlin_module End of files Compiling files: +src/A.kt src/companionExtension.kt src/companionReferenceExplicit.kt src/companionReferenceImplicit.kt @@ -28,6 +31,7 @@ Cleaning output files: out/production/module/B.class End of files Compiling files: +src/A.kt src/B.kt src/companionExtension.kt src/companionReferenceExplicit.kt diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAdded/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAdded/build.log index 270e4f5daa5..b450c2880fc 100644 --- a/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAdded/build.log +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAdded/build.log @@ -6,8 +6,10 @@ src/A.kt End of files Cleaning output files: out/production/module/META-INF/module.kotlin_module +out/production/module/foo/AChild.class out/production/module/foo/UseAChildKt.class End of files Compiling files: +src/AChild.kt src/useAChild.kt End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAnnotationAdded/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAnnotationAdded/build.log index 270e4f5daa5..b450c2880fc 100644 --- a/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAnnotationAdded/build.log +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodAnnotationAdded/build.log @@ -6,8 +6,10 @@ src/A.kt End of files Cleaning output files: out/production/module/META-INF/module.kotlin_module +out/production/module/foo/AChild.class out/production/module/foo/UseAChildKt.class End of files Compiling files: +src/AChild.kt src/useAChild.kt End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodNullabilityChanged/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodNullabilityChanged/build.log index a6e893da45d..534d69f15e7 100644 --- a/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodNullabilityChanged/build.log +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/methodNullabilityChanged/build.log @@ -6,9 +6,11 @@ src/A.kt End of files Cleaning output files: out/production/module/META-INF/module.kotlin_module +out/production/module/foo/AChild.class out/production/module/foo/UseAChildKt.class End of files Compiling files: +src/AChild.kt src/useAChild.kt End of files COMPILATION FAILED @@ -20,5 +22,6 @@ out/production/module/foo/A.class End of files Compiling files: src/A.kt +src/AChild.kt src/useAChild.kt End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt new file mode 100644 index 00000000000..d58cb4fd74b --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt @@ -0,0 +1,3 @@ +open class A { + open fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.1 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.1 new file mode 100644 index 00000000000..5c259647d20 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.1 @@ -0,0 +1,3 @@ +open class A { + open fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.2 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.2 new file mode 100644 index 00000000000..d58cb4fd74b --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/A.kt.new.2 @@ -0,0 +1,3 @@ +open class A { + open fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/B.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/B.kt new file mode 100644 index 00000000000..fe031bf8549 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/B.kt @@ -0,0 +1,3 @@ +class B : A() { + override fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/C.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/C.kt new file mode 100644 index 00000000000..2c74d386ad3 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/C.kt @@ -0,0 +1 @@ +class C \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/build.log new file mode 100644 index 00000000000..334e8d99380 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/build.log @@ -0,0 +1,23 @@ +Cleaning output files: +out/production/module/A.class +End of files +Compiling files: +src/A.kt +End of files +Cleaning output files: +out/production/module/B.class +End of files +Compiling files: +src/B.kt +End of files +COMPILATION FAILED +'f' overrides nothing + + +Cleaning output files: +out/production/module/A.class +End of files +Compiling files: +src/A.kt +src/B.kt +End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/A.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/A.kt new file mode 100644 index 00000000000..f24918ce642 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/A.kt @@ -0,0 +1,3 @@ +interface A { + fun f(c: C) +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt new file mode 100644 index 00000000000..4686016741c --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt @@ -0,0 +1,3 @@ +open class B { + fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.1 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.1 new file mode 100644 index 00000000000..114a9baca4b --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.1 @@ -0,0 +1,3 @@ +open class B { + fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.2 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.2 new file mode 100644 index 00000000000..4686016741c --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/B.kt.new.2 @@ -0,0 +1,3 @@ +open class B { + fun f(c: C) {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/BA.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/BA.kt new file mode 100644 index 00000000000..c3556f5d64a --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/BA.kt @@ -0,0 +1 @@ +open class BA : B(), A \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/C.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/C.kt new file mode 100644 index 00000000000..2c74d386ad3 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/C.kt @@ -0,0 +1 @@ +class C \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/build.log new file mode 100644 index 00000000000..de3e633548e --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/overrideImplicit/build.log @@ -0,0 +1,23 @@ +Cleaning output files: +out/production/module/B.class +End of files +Compiling files: +src/B.kt +End of files +Cleaning output files: +out/production/module/BA.class +End of files +Compiling files: +src/BA.kt +End of files +COMPILATION FAILED +Class 'BA' must be declared abstract or implement abstract member public abstract fun f(c: C): kotlin.Unit defined in A + + +Cleaning output files: +out/production/module/B.class +End of files +Compiling files: +src/B.kt +src/BA.kt +End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/propertyNullabilityChanged/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/propertyNullabilityChanged/build.log index e91a715b155..488756b17ac 100644 --- a/jps/jps-plugin/testData/incremental/classHierarchyAffected/propertyNullabilityChanged/build.log +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/propertyNullabilityChanged/build.log @@ -7,9 +7,11 @@ src/A.kt End of files Cleaning output files: out/production/module/META-INF/module.kotlin_module +out/production/module/foo/AChild.class out/production/module/foo/UseAChildKt.class End of files Compiling files: +src/AChild.kt src/useAChild.kt End of files COMPILATION FAILED @@ -21,5 +23,6 @@ out/production/module/foo/A.class End of files Compiling files: src/A.kt +src/AChild.kt src/useAChild.kt End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/lazyKotlinCaches/class/experimental-expected-kotlin-caches.txt b/jps/jps-plugin/testData/incremental/lazyKotlinCaches/class/experimental-expected-kotlin-caches.txt index b12e9b37962..0889bb8f6ae 100644 --- a/jps/jps-plugin/testData/incremental/lazyKotlinCaches/class/experimental-expected-kotlin-caches.txt +++ b/jps/jps-plugin/testData/incremental/lazyKotlinCaches/class/experimental-expected-kotlin-caches.txt @@ -7,6 +7,7 @@ kotlin-data-container Module 'module' production experimental-format-version.txt format-version.txt + class-fq-name-to-source.tab proto.tab source-to-classes.tab -Module 'module' tests +Module 'module' tests \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/lazyKotlinCaches/classInheritance/experimental-expected-kotlin-caches.txt b/jps/jps-plugin/testData/incremental/lazyKotlinCaches/classInheritance/experimental-expected-kotlin-caches.txt index 61e7c351e3b..700ec2032f6 100644 --- a/jps/jps-plugin/testData/incremental/lazyKotlinCaches/classInheritance/experimental-expected-kotlin-caches.txt +++ b/jps/jps-plugin/testData/incremental/lazyKotlinCaches/classInheritance/experimental-expected-kotlin-caches.txt @@ -7,8 +7,9 @@ kotlin-data-container Module 'module' production experimental-format-version.txt format-version.txt + class-fq-name-to-source.tab proto.tab source-to-classes.tab subtypes.tab supertypes.tab -Module 'module' tests +Module 'module' tests \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/multiModule/circularDependencyClasses/experimental-ic-build.log b/jps/jps-plugin/testData/incremental/multiModule/circularDependencyClasses/experimental-ic-build.log index 11f21fb526c..d7b2fc49156 100644 --- a/jps/jps-plugin/testData/incremental/multiModule/circularDependencyClasses/experimental-ic-build.log +++ b/jps/jps-plugin/testData/incremental/multiModule/circularDependencyClasses/experimental-ic-build.log @@ -7,3 +7,10 @@ End of files Compiling files: module2/src/module2_b.kt End of files +Cleaning output files: +out/production/module1/a/A.class +out/production/module1/a/AA.class +End of files +Compiling files: +module1/src/module1_a.kt +End of files \ No newline at end of file