diff --git a/main-settings/src/main/scala/sbt/Def.scala b/main-settings/src/main/scala/sbt/Def.scala index dd1a616dd..57ad05852 100644 --- a/main-settings/src/main/scala/sbt/Def.scala +++ b/main-settings/src/main/scala/sbt/Def.scala @@ -221,6 +221,7 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits { inputTaskDynMacroImpl, inputTaskMacroImpl, taskDynMacroImpl, + taskIfMacroImpl, taskMacroImpl } import std._ @@ -234,6 +235,7 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits { def inputTask[T](t: T): Def.Initialize[InputTask[T]] = macro inputTaskMacroImpl[T] def inputTaskDyn[T](t: Def.Initialize[Task[T]]): Def.Initialize[InputTask[T]] = macro inputTaskDynMacroImpl[T] + def taskIf[T](a: Def.Initialize[Task[T]]): Def.Initialize[Task[T]] = macro taskIfMacroImpl[T] private[sbt] def selectITask[A, B]( fab: Initialize[Task[Either[A, B]]], diff --git a/main-settings/src/main/scala/sbt/std/TaskMacro.scala b/main-settings/src/main/scala/sbt/std/TaskMacro.scala index 13690ceb9..4d17f916d 100644 --- a/main-settings/src/main/scala/sbt/std/TaskMacro.scala +++ b/main-settings/src/main/scala/sbt/std/TaskMacro.scala @@ -118,6 +118,21 @@ object TaskMacro { Instance.idTransform[c.type] ) + def taskIfMacroImpl[A: c.WeakTypeTag]( + c: blackbox.Context + )(a: c.Expr[Initialize[Task[A]]]): c.Expr[Initialize[Task[A]]] = { + import c.universe._ + def mkIfS(cond: Tree, thenp: Tree, elsep: Tree): Tree = + q"""Def.ifS(Def.task($cond))($thenp)($elsep)""" + a.tree match { + case Block(stat, If(cond, thenp, elsep)) => + c.Expr[Initialize[Task[A]]](mkIfS(Block(stat, cond), thenp, elsep)) + case If(cond, thenp, elsep) => + c.Expr[Initialize[Task[A]]](mkIfS(cond, thenp, elsep)) + case x => ContextUtil.unexpectedTree(x) + } + } + /** Implementation of := macro for settings. */ def settingAssignMacroImpl[T: c.WeakTypeTag]( c: blackbox.Context diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 7e09c5c71..034d55cb2 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2128,9 +2128,10 @@ object Defaults extends BuildCommon { ) def dependencyResolutionTask: Def.Initialize[Task[DependencyResolution]] = - Def.ifS(useCoursier.toTask)(Def.task { CoursierDependencyResolution(csrConfiguration.value) })( - Def.task { IvyDependencyResolution(ivyConfiguration.value, CustomHttp.okhttpClient.value) } - ) + Def.taskIf { + if (useCoursier.value) Def.task { CoursierDependencyResolution(csrConfiguration.value) } else + Def.task { IvyDependencyResolution(ivyConfiguration.value, CustomHttp.okhttpClient.value) } + } } object Classpaths { @@ -2947,14 +2948,18 @@ object Classpaths { publishTask(config) def publishTask(config: TaskKey[PublishConfiguration]): Initialize[Task[Unit]] = - Def.ifS((publish / skip).toTask)(Def.task { - val s = streams.value - val ref = thisProjectRef.value - s.log.debug(s"Skipping publish* for ${ref.project}") - })(Def.task { - val s = streams.value - IvyActions.publish(ivyModule.value, config.value, s.log) - }) tag (Tags.Publish, Tags.Network) + Def.taskIf { + if ((publish / skip).value) + Def.task { + val s = streams.value + val ref = thisProjectRef.value + s.log.debug(s"Skipping publish* for ${ref.project}") + } else + Def.task { + val s = streams.value + IvyActions.publish(ivyModule.value, config.value, s.log) + } + } tag (Tags.Publish, Tags.Network) val moduleIdJsonKeyFormat: sjsonnew.JsonKeyFormat[ModuleID] = new sjsonnew.JsonKeyFormat[ModuleID] { diff --git a/sbt/src/sbt-test/actions/ifs/build.sbt b/sbt/src/sbt-test/actions/ifs/build.sbt index c3758e0e0..31eca6c2d 100644 --- a/sbt/src/sbt-test/actions/ifs/build.sbt +++ b/sbt/src/sbt-test/actions/ifs/build.sbt @@ -11,7 +11,10 @@ lazy val root = (project in file(".")) condition := true, trueAction := { IO.write(output.value, s"true\n", append = true) }, falseAction := { IO.write(output.value, s"false\n", append = true) }, - foo := (Def.ifS(condition)(trueAction)(falseAction)).value, + foo := (Def.taskIf { + if (condition.value) trueAction + else falseAction + }).value, TaskKey[Unit]("check") := { val lines = IO.read(output.value).linesIterator.toList assert(lines == List("true"))