diff --git a/main-settings/src/main/scala/sbt/std/TaskMacro.scala b/main-settings/src/main/scala/sbt/std/TaskMacro.scala index c482e284b..6ac3f8793 100644 --- a/main-settings/src/main/scala/sbt/std/TaskMacro.scala +++ b/main-settings/src/main/scala/sbt/std/TaskMacro.scala @@ -128,7 +128,13 @@ object TaskMacro: val cached = ContextUtil.isTaskCacheByDefault && !isUncacheApplied && cl.nonEmpty t match case '{ if $cond then $thenp else $elsep } => taskIfImpl[A1](t, cached) - case _ => + case '{ InputWrapper.`wrapInitTask_\u2603\u2603`[A1]($in) } + if in.isExprOf[Initialize[Task[A1]]] => + if in.isExprOf[Scoped] then + val convert1 = new FullConvert(qctx, 0) + convert1.contMapN[A1, F, Id](t, convert1.appExpr, None) + else in.asExprOf[Initialize[Task[A1]]] + case _ => val convert1 = new FullConvert(qctx, 0) validateTaskReferences(convert1, t) if cached then diff --git a/sbt-app/src/sbt-test/cache/identity-map/build.sbt b/sbt-app/src/sbt-test/cache/identity-map/build.sbt new file mode 100644 index 000000000..29db41c9e --- /dev/null +++ b/sbt-app/src/sbt-test/cache/identity-map/build.sbt @@ -0,0 +1,21 @@ +val example = taskKey[Uncacheable]("example") +val alias = taskKey[Uncacheable]("alias") +val both = taskKey[Unit]("both") +val check = taskKey[Unit]("check") + +example := Def.taskDyn { + Def.task { + Uncacheable.counter.incrementAndGet() + new Uncacheable() + } +}.value + +alias := example.value + +both := Def.uncached { + val a = example.value + val b = alias.value + assert(a eq b) +} + +check := assert(Uncacheable.counter.get == 1, s"counter = ${Uncacheable.counter.get}") diff --git a/sbt-app/src/sbt-test/cache/identity-map/project/Uncacheable.scala b/sbt-app/src/sbt-test/cache/identity-map/project/Uncacheable.scala new file mode 100644 index 000000000..3208382f1 --- /dev/null +++ b/sbt-app/src/sbt-test/cache/identity-map/project/Uncacheable.scala @@ -0,0 +1,7 @@ +import java.util.concurrent.atomic.AtomicInteger + +class Uncacheable: + override def toString: String = "Uncacheable" + +object Uncacheable: + val counter = new AtomicInteger(0) diff --git a/sbt-app/src/sbt-test/cache/identity-map/test b/sbt-app/src/sbt-test/cache/identity-map/test new file mode 100644 index 000000000..5ac9be29e --- /dev/null +++ b/sbt-app/src/sbt-test/cache/identity-map/test @@ -0,0 +1,2 @@ +> both +> check