diff --git a/compile/inc/Incremental.scala b/compile/inc/Incremental.scala index e6e8be492..211db2ce1 100644 --- a/compile/inc/Incremental.scala +++ b/compile/inc/Incremental.scala @@ -87,10 +87,19 @@ object Incremental def invalidateIncremental(previous: Relations, changes: APIChanges[File], recompiledSources: Set[File], log: Logger): Set[File] = { - val inv = invalidateTransitive(previous.usesInternalSrc _, changes.modified, log)// ++ scopeInvalidations(previous.extAPI _, changes.modified, changes.names) + val inv = + invalidateTransitive(previous.usesInternalSrc _, changes.modified, log) ++ + invalidateDuplicates(previous) + // ++ scopeInvalidations(previous.extAPI _, changes.modified, changes.names) if((inv -- recompiledSources).isEmpty) Set.empty else inv } + /** Invalidate all sources that claim to produce the same class file as another source file. */ + def invalidateDuplicates(merged: Relations): Set[File] = + merged.srcProd.reverseMap.flatMap { case (classFile, sources) => + if(sources.size > 1) sources else Nil + } toSet; + /** Only invalidates direct source dependencies. It excludes any sources that were recompiled during the previous run. * Callers may want to augment the returned set with 'modified' or all sources recompiled up to this point. */ def invalidateDirect(dependsOnSrc: File => Set[File], modified: Set[File]): Set[File] = diff --git a/sbt/src/sbt-test/source-dependencies/dup-class/changes/A.scala b/sbt/src/sbt-test/source-dependencies/dup-class/changes/A.scala new file mode 100644 index 000000000..69c493db2 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/dup-class/changes/A.scala @@ -0,0 +1 @@ +object A diff --git a/sbt/src/sbt-test/source-dependencies/dup-class/changes/A2.scala b/sbt/src/sbt-test/source-dependencies/dup-class/changes/A2.scala new file mode 100644 index 000000000..69c493db2 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/dup-class/changes/A2.scala @@ -0,0 +1 @@ +object A diff --git a/sbt/src/sbt-test/source-dependencies/dup-class/changes/B.scala b/sbt/src/sbt-test/source-dependencies/dup-class/changes/B.scala new file mode 100644 index 000000000..251ef7397 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/dup-class/changes/B.scala @@ -0,0 +1 @@ +object B diff --git a/sbt/src/sbt-test/source-dependencies/dup-class/test b/sbt/src/sbt-test/source-dependencies/dup-class/test new file mode 100644 index 000000000..531553bb5 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/dup-class/test @@ -0,0 +1,6 @@ +$ copy-file changes/A.scala A.scala +> compile +$ copy-file changes/A2.scala B.scala +-> compile +$ copy-file changes/B.scala B.scala +> compile