From bd03184cf55133b54ffe82702960c8a8ed417426 Mon Sep 17 00:00:00 2001 From: byteforge Date: Sun, 11 Jan 2026 16:17:26 -0800 Subject: [PATCH] [2.x] Fix ProjectMatrix invalid project ID with CrossVersion.full (#8484) When using `ProjectMatrix` with `CrossVersion.full` and Scala 2 versions like `2.13.18`, the project ID incorrectly became `$1$2_13_18` instead of `foo2_13_18`. **Root cause:** The Scala 3 compiler creates synthetic intermediate vals (e.g., `$1`) during macro expansion. The `enclosingTerm` function in the macros was stopping at these synthetic symbols instead of continuing up the symbol tree to find the actual val name. **Fix:** Added `Flags.Synthetic` check to skip compiler-generated symbols in: - `main-settings/src/main/scala/sbt/std/KeyMacro.scala` - `lm-core/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala` --------- Co-authored-by: byteforge38 --- .../scala/sbt/librarymanagement/ConfigurationExtra.scala | 7 ++++--- main-settings/src/main/scala/sbt/std/KeyMacro.scala | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lm-core/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala b/lm-core/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala index 8f6a4f743..a50ea2c58 100644 --- a/lm-core/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala +++ b/lm-core/src/main/scala/sbt/librarymanagement/ConfigurationExtra.scala @@ -105,9 +105,10 @@ private[sbt] object ConfigurationMacro: @tailrec def enclosingTerm(sym: Symbol): Symbol = sym match - case sym if sym.flags.is(Flags.Macro) => enclosingTerm(sym.owner) - case sym if !sym.isTerm => enclosingTerm(sym.owner) - case _ => sym + case sym if sym.flags.is(Flags.Macro) => enclosingTerm(sym.owner) + case sym if sym.flags.is(Flags.Synthetic) => enclosingTerm(sym.owner) + case sym if !sym.isTerm => enclosingTerm(sym.owner) + case _ => sym val term = enclosingTerm(Symbol.spliceOwner) if !term.isValDef then report.error( diff --git a/main-settings/src/main/scala/sbt/std/KeyMacro.scala b/main-settings/src/main/scala/sbt/std/KeyMacro.scala index b18ced36e..962f66bdb 100644 --- a/main-settings/src/main/scala/sbt/std/KeyMacro.scala +++ b/main-settings/src/main/scala/sbt/std/KeyMacro.scala @@ -72,9 +72,10 @@ private[sbt] object KeyMacro: @tailrec def enclosingTerm0(sym: Symbol): Symbol = sym match - case sym if sym.flags.is(Flags.Macro) => enclosingTerm0(sym.owner) - case sym if !sym.isTerm => enclosingTerm0(sym.owner) - case _ => sym + case sym if sym.flags.is(Flags.Macro) => enclosingTerm0(sym.owner) + case sym if sym.flags.is(Flags.Synthetic) => enclosingTerm0(sym.owner) + case sym if !sym.isTerm => enclosingTerm0(sym.owner) + case _ => sym enclosingTerm0(Symbol.spliceOwner) private def enclosingClass(using Quotes) =