From 10f98e6c01539f20431c2aaf60548c4c5dcb9ee2 Mon Sep 17 00:00:00 2001 From: Rikito Taniguchi Date: Thu, 25 Jun 2026 10:22:11 +0900 Subject: [PATCH] [2.x] Fix macro expand for HKT type arguments (#9377) Def.setting and Def.task macro expansion looks for internal wrapper call generated for .value. It visits all function calls in the macro. If the block contains functions call whose type parameter is HKT, macro expansion crashed. Macro expansion tries to match IO against '[a], and failed with MatchError. This commit adds wildcard pattern, and leave unmatched type arguments unchanged. --- .../sbt/internal/util/appmacro/Convert.scala | 2 ++ .../src/test/scala/sbt/std/UsageTest.scala | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala index 2c869081e..f4b359371 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala @@ -64,6 +64,8 @@ trait Convert[C <: Quotes & Singleton] extends ContextUtil[C]: report.errorAndAbort(message, position) case _ => super.transformTerm(tree)(owner) + case _ => + super.transformTerm(tree)(owner) case _ => super.transformTerm(tree)(owner) end appTransformer diff --git a/main-settings/src/test/scala/sbt/std/UsageTest.scala b/main-settings/src/test/scala/sbt/std/UsageTest.scala index bba768016..eee200def 100644 --- a/main-settings/src/test/scala/sbt/std/UsageTest.scala +++ b/main-settings/src/test/scala/sbt/std/UsageTest.scala @@ -29,6 +29,30 @@ object UseTask: } end UseTask +// https://github.com/sbt/sbt/issues/9375 +object UseHktTypeArgument: + final class IO[A] + + object Builder: + def apply[F[_]](value: String): String = value + + val settingWithHktTypeArgument: Def.Initialize[String] = Def.setting { + Builder[IO]("setting") + } + + val taskWithHktTypeArgument: Def.Initialize[Task[String]] = Def.task { + Builder[IO]("task") + } + + val name = Def.settingKey[String]("name") + val key = Def.taskKey[String]("key") + val settings = Seq( + key := Def.uncached { + Builder[IO](name.value) + } + ) +end UseHktTypeArgument + object Assign { import java.io.File