From 6835eae19f679c256920d2cf02ed85f78948d9a8 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Wed, 20 Dec 2023 21:22:53 -0800 Subject: [PATCH 1/5] Unit test for over-compilation --- .../cyclic-dependency/A.scala | 13 +++++++++++++ .../cyclic-dependency/ABase.java | 14 ++++++++++++++ .../cyclic-dependency/H.scala | 12 ++++++++++++ .../cyclic-dependency/HBase.java | 14 ++++++++++++++ .../cyclic-dependency/changes/A.scala | 16 ++++++++++++++++ .../cyclic-dependency/changes/ABase.java | 16 ++++++++++++++++ .../cyclic-dependency/incOptions.properties | 1 + .../source-dependencies/cyclic-dependency/test | 6 ++++++ 8 files changed, 92 insertions(+) create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/A.scala create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/ABase.java create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/H.scala create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/HBase.java create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/A.scala create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/ABase.java create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/incOptions.properties create mode 100644 zinc/src/sbt-test/source-dependencies/cyclic-dependency/test diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/A.scala b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/A.scala new file mode 100644 index 000000000..436599e3c --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/A.scala @@ -0,0 +1,13 @@ +/* + * Zinc - The incremental compiler for Scala. + * Copyright Scala Center, Lightbend, and Mark Harrah + * + * Licensed under Apache License 2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +class A() extends ABase() + diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/ABase.java b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/ABase.java new file mode 100644 index 000000000..1b5de6e59 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/ABase.java @@ -0,0 +1,14 @@ +/* + * Zinc - The incremental compiler for Scala. + * Copyright Scala Center, Lightbend, and Mark Harrah + * + * Licensed under Apache License 2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +public abstract class ABase { + H h; +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/H.scala b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/H.scala new file mode 100644 index 000000000..e94157e9b --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/H.scala @@ -0,0 +1,12 @@ +/* + * Zinc - The incremental compiler for Scala. + * Copyright Scala Center, Lightbend, and Mark Harrah + * + * Licensed under Apache License 2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +class H() extends HBase() \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/HBase.java b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/HBase.java new file mode 100644 index 000000000..318df9893 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/HBase.java @@ -0,0 +1,14 @@ +/* + * Zinc - The incremental compiler for Scala. + * Copyright Scala Center, Lightbend, and Mark Harrah + * + * Licensed under Apache License 2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +public abstract class HBase { + A a; +} \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/A.scala b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/A.scala new file mode 100644 index 000000000..8cc435b37 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/A.scala @@ -0,0 +1,16 @@ +/* + * Zinc - The incremental compiler for Scala. + * Copyright Scala Center, Lightbend, and Mark Harrah + * + * Licensed under Apache License 2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +class A() extends ABase() + + + +// random placeholder change \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/ABase.java b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/ABase.java new file mode 100644 index 000000000..b23be5ce5 --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/changes/ABase.java @@ -0,0 +1,16 @@ +/* + * Zinc - The incremental compiler for Scala. + * Copyright Scala Center, Lightbend, and Mark Harrah + * + * Licensed under Apache License 2.0 + * SPDX-License-Identifier: Apache-2.0 + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +public abstract class ABase { + H h; +} + +// Random changes to force recompilation \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/incOptions.properties b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/incOptions.properties new file mode 100644 index 000000000..e7b9a57ec --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/incOptions.properties @@ -0,0 +1 @@ +pipelining = false \ No newline at end of file diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test new file mode 100644 index 000000000..d86a6ce0f --- /dev/null +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test @@ -0,0 +1,6 @@ +> compile + +$ copy-file changes/ABase.java ABase.java +$ copy-file changes/A.scala A.scala + +> checkIterations 1 \ No newline at end of file From 5df1b4b5e82c9a945bd79917d78a64304f02cedb Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Wed, 20 Dec 2023 21:23:18 -0800 Subject: [PATCH 2/5] Discard stale invalidationResults when completing cycle --- .../zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala b/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala index ef511be60..586524387 100644 --- a/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala +++ b/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala @@ -937,7 +937,7 @@ private final class AnalysisCallback( if (!writtenEarlyArtifacts) // writing implies the updates merge has happened mergeUpdates() // must merge updates each cycle or else scalac will clobber it } - incHandler.completeCycle(invalidationResults, getAnalysis) + incHandler.completeCycle(None, getAnalysis) } else { throw new IllegalStateException( "can't call AnalysisCallback#getCycleResultOnce more than once" From b69ea39d3458bbf9ea7d7611f1a205e87974943e Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Wed, 20 Dec 2023 21:27:00 -0800 Subject: [PATCH 3/5] Increase iteration count --- zinc/src/sbt-test/source-dependencies/cyclic-dependency/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test index d86a6ce0f..542ad82ae 100644 --- a/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test +++ b/zinc/src/sbt-test/source-dependencies/cyclic-dependency/test @@ -3,4 +3,4 @@ $ copy-file changes/ABase.java ABase.java $ copy-file changes/A.scala A.scala -> checkIterations 1 \ No newline at end of file +> checkIterations 2 \ No newline at end of file From a1df107cb0a05e206ab0f75b5af74f41081b7ca0 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Fri, 22 Dec 2023 13:46:08 -0800 Subject: [PATCH 4/5] Adopt Eugene's feedback --- .../src/main/scala/sbt/internal/inc/Incremental.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala b/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala index 586524387..4fab9b0f5 100644 --- a/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala +++ b/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala @@ -1090,14 +1090,14 @@ private final class AnalysisCallback( override def dependencyPhaseCompleted(): Unit = { val incHandler = incHandlerOpt.getOrElse(sys.error("incHandler was expected")) - if (invalidationResults.isEmpty) { + if (earlyOutput.isDefined && invalidationResults.isEmpty) { val a = getAnalysis val CompileCycleResult(continue, invalidations, merged) = incHandler.mergeAndInvalidate(a, false) // Store invalidations and continuation decision; the analysis will be computed again after Analyze phase. invalidationResults = Some(CompileCycleResult(continue, invalidations, Analysis.empty)) // If there will be no more compilation cycles, store the early analysis file and update the pickle jar - if (earlyOutput.isDefined && !continue && lookup.shouldDoEarlyOutput(merged)) { + if (!continue && lookup.shouldDoEarlyOutput(merged)) { writeEarlyArtifacts(merged) } } From 978244a7109ff0214b94b9adf27e1ba8ed924300 Mon Sep 17 00:00:00 2001 From: friendseeker <66892505+Friendseeker@users.noreply.github.com> Date: Fri, 22 Dec 2023 14:41:51 -0800 Subject: [PATCH 5/5] Revert line 940 change --- .../zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala b/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala index 4fab9b0f5..8e8f2b39c 100644 --- a/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala +++ b/internal/zinc-core/src/main/scala/sbt/internal/inc/Incremental.scala @@ -937,7 +937,7 @@ private final class AnalysisCallback( if (!writtenEarlyArtifacts) // writing implies the updates merge has happened mergeUpdates() // must merge updates each cycle or else scalac will clobber it } - incHandler.completeCycle(None, getAnalysis) + incHandler.completeCycle(invalidationResults, getAnalysis) } else { throw new IllegalStateException( "can't call AnalysisCallback#getCycleResultOnce more than once"