From f3dd5dbd7138c66785e7ab61f6aeaa860c0f0935 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 4 May 2025 17:22:08 -0400 Subject: [PATCH] fix: Fix qual lookup **Problem** Nested macro that expands to map or mapN fails to find the qual because the trees end up being different between the record scan and actual replacement. **Solution** First try for equals normally, then compare the show strings. --- .../main/scala/sbt/internal/util/appmacro/Cont.scala | 10 +++++++++- sbt-app/src/sbt-test/project/nested-macro/build.sbt | 11 +++++++++++ sbt-app/src/sbt-test/project/nested-macro/test | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 sbt-app/src/sbt-test/project/nested-macro/build.sbt create mode 100644 sbt-app/src/sbt-test/project/nested-macro/test diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/Cont.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/Cont.scala index 87c21204d..8e773dd54 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/Cont.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/Cont.scala @@ -266,7 +266,15 @@ trait Cont: (name: String, tpe: Type[x], qual: Term, oldTree: Term) => given Type[x] = tpe convert[x](name, qual) transform { (replacement: Term) => - val idx = inputs.indexWhere(input => input.qual == qual) + val idxEq = inputs.indexWhere(input => input.qual == qual) + // use show to compare trees for Def.task comparison + val idx = + if idxEq < 0 then inputs.indexWhere(input => input.qual.show == qual.show) + else idxEq + if idx < 0 then + sys.error( + s"qual (${qual}) not found in ${inputs.map(_.qual)}" + ) applyTuple(p0, br.inputTupleTypeRepr, idx) } val modifiedBody = diff --git a/sbt-app/src/sbt-test/project/nested-macro/build.sbt b/sbt-app/src/sbt-test/project/nested-macro/build.sbt new file mode 100644 index 000000000..a6d00c01d --- /dev/null +++ b/sbt-app/src/sbt-test/project/nested-macro/build.sbt @@ -0,0 +1,11 @@ +lazy val a1 = settingKey[Boolean]("") + +scalaVersion := "3.6.4" +a1 := true + +Compile / sourceGenerators += { + val _ = a1.value + Def.task { + Seq.empty[File] + }.taskValue +} diff --git a/sbt-app/src/sbt-test/project/nested-macro/test b/sbt-app/src/sbt-test/project/nested-macro/test new file mode 100644 index 000000000..5df2af1f3 --- /dev/null +++ b/sbt-app/src/sbt-test/project/nested-macro/test @@ -0,0 +1 @@ +> compile