From 1415b2efa45df914db82494e8d00f3c8da8bd3be Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Mon, 31 Mar 2025 22:22:27 -0400 Subject: [PATCH] fix: Fix incremental test with companion objects [merge-skip] **Problem** Incremental test (aka testQuick) has a bug when companion objects depends on others since at some point it's failing to look up relationship from Zinc analysis. **Solution** This fixes the lookup. --- main/src/main/scala/sbt/Defaults.scala | 32 ++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index dbbbe84b1..9ee85e286 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -1485,26 +1485,34 @@ object Defaults extends BuildCommon { if (stamps.isEmpty) Long.MinValue else stamps.max } - def intlStamp(c: String, analysis: Analysis, s: Set[String]): Long = { - if (s contains c) Long.MinValue + def intlStamp0(javaClassName: String, analysis: Analysis, alreadySeen: Set[String])( + className: String + ): Set[Long] = { + import analysis.{ apis, relations } + relations + .internalClassDeps(className) + .map(intlStamp(_, analysis, alreadySeen + javaClassName)) ++ + relations.externalDeps(className).map(stamp) ++ + apis.internal.get(javaClassName).toSeq.map(_.compilationTimestamp) ++ + apis.internal.get(className).toSeq.map(_.compilationTimestamp) + } + def intlStamp(javaClassName: String, analysis: Analysis, alreadySeen: Set[String]): Long = + if (alreadySeen contains javaClassName) Long.MinValue else stamps.getOrElse( - c, { - val x = { - import analysis.{ apis, relations => rel } - rel.internalClassDeps(c).map(intlStamp(_, analysis, s + c)) ++ - rel.externalDeps(c).map(stamp) ++ - rel.productClassName.reverse(c).flatMap { pc => - apis.internal.get(pc).map(_.compilationTimestamp) - } + Long.MinValue + javaClassName, { + val x: Long = { + val classNames = analysis.relations.productClassName.reverse(javaClassName).toSeq + classNames.flatMap(intlStamp0(javaClassName, analysis, alreadySeen)) ++ Seq( + Long.MinValue + ) }.max if (x != Long.MinValue) { - stamps(c) = x + stamps(javaClassName) = x } x } ) - } def noSuccessYet(test: String) = succeeded.get(test) match { case None => true case Some(ts) => stamps.synchronized(stamp(test)) > ts