From 65f79588980f231c630af68d5705e2aca0d26707 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Tue, 2 Feb 2016 01:33:43 +0100 Subject: [PATCH] Invalidate package objects transitively in name hashing Modify `invalidatedPackageObjects` to look for package objects that transitively inherit from an invalidated class instead of just inheriting directly. This is the correct behavior that should have been implemented in the first place. The bug comes from a subtle copy&paste mistake. The old implementation used `publicInherited` relation and new one looks identical but uses `inheritance` relation. The difference is that `publicInherited` was a relation that was expanded transitively along inheritance chain but `inheritance` is not. We have to perform the transitive walk in `IncrementalNameHashing.invalidatedPackageObjects` implementation. Mark `pkg-self` test as passing. Fixes #2326 --- .../inc/src/main/scala/sbt/inc/IncrementalNameHashing.scala | 4 +++- .../sbt-test/source-dependencies/pkg-self/{pending => test} | 0 2 files changed, 3 insertions(+), 1 deletion(-) rename sbt/src/sbt-test/source-dependencies/pkg-self/{pending => test} (100%) diff --git a/compile/inc/src/main/scala/sbt/inc/IncrementalNameHashing.scala b/compile/inc/src/main/scala/sbt/inc/IncrementalNameHashing.scala index 1aaff67b4..49c0c1d4c 100644 --- a/compile/inc/src/main/scala/sbt/inc/IncrementalNameHashing.scala +++ b/compile/inc/src/main/scala/sbt/inc/IncrementalNameHashing.scala @@ -18,7 +18,9 @@ private final class IncrementalNameHashing(log: Logger, options: IncOptions) ext // Package objects are fragile: if they inherit from an invalidated source, get "class file needed by package is missing" error // This might be too conservative: we probably only need package objects for packages of invalidated sources. override protected def invalidatedPackageObjects(invalidated: Set[File], relations: Relations): Set[File] = - invalidated flatMap relations.inheritance.internal.reverse filter { _.getName == "package.scala" } + transitiveDeps(invalidated)(relations.inheritance.internal.reverse).filter { + _.getName == "package.scala" + } override protected def sameAPI[T](src: T, a: Source, b: Source): Option[APIChange[T]] = { if (SameAPI(a, b)) diff --git a/sbt/src/sbt-test/source-dependencies/pkg-self/pending b/sbt/src/sbt-test/source-dependencies/pkg-self/test similarity index 100% rename from sbt/src/sbt-test/source-dependencies/pkg-self/pending rename to sbt/src/sbt-test/source-dependencies/pkg-self/test