From 8f40c4154e240c3cc3760b79969123eaadda587e Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Thu, 16 Nov 2023 18:45:05 -0800 Subject: [PATCH 1/6] Include mutual dependency in initial invalidation --- .../scala/sbt/internal/inc/IncrementalCommon.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala b/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala index 7f83293b3..6efdfa189 100644 --- a/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala +++ b/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala @@ -510,7 +510,16 @@ private[inc] abstract class IncrementalCommon( val removedClasses = classNames(removedSrcs) val dependentOnRemovedClasses = removedClasses.flatMap(previous.memberRef.internal.reverse) val modifiedClasses = classNames(modifiedSrcs) - val invalidatedClasses = removedClasses ++ dependentOnRemovedClasses ++ modifiedClasses + val mutualDependentOnModifiedClasses = { + val dependentOnModifiedClasses = modifiedClasses.flatMap(previous.memberRef.internal.reverse) + dependentOnModifiedClasses.filter(dependent => + previous.memberRef.internal.reverse(dependent).exists(modifiedClasses) + ) + } + val invalidatedClasses = + removedClasses ++ dependentOnRemovedClasses ++ modifiedClasses ++ mutualDependentOnModifiedClasses + +// val invalidatedClasses = removedClasses ++ dependentOnRemovedClasses ++ modifiedClasses val byProduct = changes.removedProducts.flatMap(previous.produced) val byLibraryDep = changes.libraryDeps.flatMap(previous.usesLibrary) From d8cf7a9b900eece94dc3bb333b1b5b9a86eb9274 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Thu, 16 Nov 2023 18:46:02 -0800 Subject: [PATCH 2/6] Add test cases from smarter and lukaszwawrzyk --- .../source-dependencies/abstract-class-to-trait/A.scala | 4 ++++ .../source-dependencies/abstract-class-to-trait/B.scala | 1 + .../source-dependencies/abstract-class-to-trait/C.scala | 1 + .../abstract-class-to-trait/changes/A.scala | 4 ++++ .../source-dependencies/abstract-class-to-trait/test | 5 +++++ .../source-dependencies/no-type-annotation/Before.scala | 1 + .../source-dependencies/no-type-annotation/Problem.scala | 3 +++ .../no-type-annotation/ProblemUser.scala | 7 +++++++ .../source-dependencies/no-type-annotation/Wrapper.scala | 3 +++ .../no-type-annotation/changes/Before.scala | 1 + .../no-type-annotation/changes/ProblemUser.scala | 7 +++++++ .../no-type-annotation/changes/Wrapper.scala | 3 +++ .../sbt-test/source-dependencies/no-type-annotation/test | 7 +++++++ 13 files changed, 47 insertions(+) create mode 100644 zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/A.scala create mode 100644 zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/B.scala create mode 100644 zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala create mode 100644 zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/changes/A.scala create mode 100644 zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/test create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/Before.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/Problem.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/ProblemUser.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/Wrapper.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Before.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/ProblemUser.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Wrapper.scala create mode 100644 zinc/src/sbt-test/source-dependencies/no-type-annotation/test diff --git a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/A.scala b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/A.scala new file mode 100644 index 000000000..d29b14b99 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/A.scala @@ -0,0 +1,4 @@ +abstract class A +object Test { + new B +} diff --git a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/B.scala b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/B.scala new file mode 100644 index 000000000..a18aec3db --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/B.scala @@ -0,0 +1 @@ +class B extends A diff --git a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala new file mode 100644 index 000000000..51596c853 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala @@ -0,0 +1 @@ +class C extends B \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/changes/A.scala b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/changes/A.scala new file mode 100644 index 000000000..151c016f7 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/changes/A.scala @@ -0,0 +1,4 @@ +trait A +object Test { + new B +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/test b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/test new file mode 100644 index 000000000..80c8ec9bf --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/test @@ -0,0 +1,5 @@ +> compile + +$ copy-file changes/A.scala A.scala + +> compile diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/Before.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/Before.scala new file mode 100644 index 000000000..5d7d45b0a --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/Before.scala @@ -0,0 +1 @@ +class Before \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/Problem.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/Problem.scala new file mode 100644 index 000000000..f959609b6 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/Problem.scala @@ -0,0 +1,3 @@ +class Problem(wrapper: Wrapper) { + def x = wrapper.x +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/ProblemUser.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/ProblemUser.scala new file mode 100644 index 000000000..daee6d13b --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/ProblemUser.scala @@ -0,0 +1,7 @@ +class ProblemUser { + val y: Seq[Before] = ??? + + private def method(p: Problem): Unit = { + println(p.x) + } +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/Wrapper.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/Wrapper.scala new file mode 100644 index 000000000..3759ef41c --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/Wrapper.scala @@ -0,0 +1,3 @@ +class Wrapper { + def x: Before = new Before +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Before.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Before.scala new file mode 100644 index 000000000..78670fc12 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Before.scala @@ -0,0 +1 @@ +class After \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/ProblemUser.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/ProblemUser.scala new file mode 100644 index 000000000..b970fd34a --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/ProblemUser.scala @@ -0,0 +1,7 @@ +class ProblemUser { + val y: Seq[After] = ??? + + private def method(p: Problem): Unit = { + println(p.x) + } +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Wrapper.scala b/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Wrapper.scala new file mode 100644 index 000000000..d7595004e --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/changes/Wrapper.scala @@ -0,0 +1,3 @@ +class Wrapper { + def x: After = new After +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/no-type-annotation/test b/zinc/src/sbt-test/source-dependencies/no-type-annotation/test new file mode 100644 index 000000000..af741c6d5 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/no-type-annotation/test @@ -0,0 +1,7 @@ +> compile + +$ copy-file changes/Before.scala Before.scala +$ copy-file changes/ProblemUser.scala ProblemUser.scala +$ copy-file changes/Wrapper.scala Wrapper.scala + +> compile \ No newline at end of file From a62f31525558edebd84381ee5a33e15aba6309d9 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Thu, 16 Nov 2023 18:47:17 -0800 Subject: [PATCH 3/6] Mark pending test as passing --- .../sbt-test/source-dependencies/false-error/{pending => test} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename zinc/src/sbt-test/source-dependencies/false-error/{pending => test} (100%) diff --git a/zinc/src/sbt-test/source-dependencies/false-error/pending b/zinc/src/sbt-test/source-dependencies/false-error/test similarity index 100% rename from zinc/src/sbt-test/source-dependencies/false-error/pending rename to zinc/src/sbt-test/source-dependencies/false-error/test From cc9bb528964563dd04fca1800e9655eee6120773 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Thu, 16 Nov 2023 18:53:03 -0800 Subject: [PATCH 4/6] Mark another pending unit test as passing Since comment says "This should compile" and the test expects successful compilation after clean, I guess the incremental compilation is indeed not supposed to fail there? --- zinc/src/sbt-test/source-dependencies/nested-type-params/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zinc/src/sbt-test/source-dependencies/nested-type-params/test b/zinc/src/sbt-test/source-dependencies/nested-type-params/test index 0c3e2ab7f..2280ad990 100644 --- a/zinc/src/sbt-test/source-dependencies/nested-type-params/test +++ b/zinc/src/sbt-test/source-dependencies/nested-type-params/test @@ -3,6 +3,6 @@ $ copy-file changes/Providers.scala Providers.scala $ copy-file changes/Bar.scala Bar.scala --> compile # This should compile +> compile # This should compile > clean > compile # Make sure that clean compile is fine \ No newline at end of file From e3e8f6e1fbe36c20248aaec6e525c9c34b5263a7 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Thu, 16 Nov 2023 19:02:08 -0800 Subject: [PATCH 5/6] Remove unneeded file in test case --- .../sbt-test/source-dependencies/abstract-class-to-trait/C.scala | 1 - 1 file changed, 1 deletion(-) delete mode 100644 zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala diff --git a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala b/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala deleted file mode 100644 index 51596c853..000000000 --- a/zinc/src/sbt-test/source-dependencies/abstract-class-to-trait/C.scala +++ /dev/null @@ -1 +0,0 @@ -class C extends B \ No newline at end of file From f0208b62a5d3c9faf9d599602a9fcb64ff2c0959 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Thu, 16 Nov 2023 19:29:33 -0800 Subject: [PATCH 6/6] Remove unneeded line --- .../src/main/scala/sbt/internal/inc/IncrementalCommon.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala b/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala index 6efdfa189..44d140230 100644 --- a/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala +++ b/internal/zinc-core/src/main/scala/sbt/internal/inc/IncrementalCommon.scala @@ -519,8 +519,6 @@ private[inc] abstract class IncrementalCommon( val invalidatedClasses = removedClasses ++ dependentOnRemovedClasses ++ modifiedClasses ++ mutualDependentOnModifiedClasses -// val invalidatedClasses = removedClasses ++ dependentOnRemovedClasses ++ modifiedClasses - val byProduct = changes.removedProducts.flatMap(previous.produced) val byLibraryDep = changes.libraryDeps.flatMap(previous.usesLibrary) val byExtSrcDep = {