From 747aa48c9cd4b75c17f6d3760a75a49c272bf8bb Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Fri, 24 Mar 2017 17:41:12 +0100 Subject: [PATCH 1/2] Fix inputTaskDyn not working This fixes the following error when trying to use inputTaskDyn in a build: [error] /tmp/sbt_8316130f/input-task-dyn/build.sbt:11: error: Macro expansion contains free type variable T defined by wrap in InputConvert.scala:76:20. Have you forgotten to use c.WeakTypeTag annotation for this type parameter? If you have troubles tracking free type variables, consider using -Xlog-free-types (out-1) [error] runFoo := Def.inputTaskDyn { (out-1) [error] ^ (out-1) [info] [error] sbt.compiler.EvalException: Type error in expression (out-3) (out-1) I have no idea what the error means, I just implemented the suggested fix. --- .../src/main/scala/sbt/std/InputConvert.scala | 2 +- .../sbt-test/actions/input-task-dyn/Bar.scala | 5 +++++ .../sbt-test/actions/input-task-dyn/Foo.scala | 5 +++++ .../sbt-test/actions/input-task-dyn/build.sbt | 18 ++++++++++++++++++ sbt/src/sbt-test/actions/input-task-dyn/test | 1 + 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 sbt/src/sbt-test/actions/input-task-dyn/Bar.scala create mode 100644 sbt/src/sbt-test/actions/input-task-dyn/Foo.scala create mode 100644 sbt/src/sbt-test/actions/input-task-dyn/build.sbt create mode 100644 sbt/src/sbt-test/actions/input-task-dyn/test diff --git a/main-settings/src/main/scala/sbt/std/InputConvert.scala b/main-settings/src/main/scala/sbt/std/InputConvert.scala index 9b185c3c0..ca0ec290c 100644 --- a/main-settings/src/main/scala/sbt/std/InputConvert.scala +++ b/main-settings/src/main/scala/sbt/std/InputConvert.scala @@ -73,7 +73,7 @@ object InitParserConvert extends Convert { case _ => Converted.NotApplicable[c.type] } - private def wrap[T](c: blackbox.Context)(tree: c.Tree): Converted[c.type] = { + private def wrap[T: c.WeakTypeTag](c: blackbox.Context)(tree: c.Tree): Converted[c.type] = { val e = c.Expr[State => Parser[T]](tree) val t = c.universe.reify { Def.valueStrict[State => Parser[T]](e.splice) } Converted.Success[c.type](t.tree) diff --git a/sbt/src/sbt-test/actions/input-task-dyn/Bar.scala b/sbt/src/sbt-test/actions/input-task-dyn/Bar.scala new file mode 100644 index 000000000..75d1e1195 --- /dev/null +++ b/sbt/src/sbt-test/actions/input-task-dyn/Bar.scala @@ -0,0 +1,5 @@ +object Bar { + def main(args: Array[String]): Unit = { + println("Bar: " + args.toList.toString) + } +} diff --git a/sbt/src/sbt-test/actions/input-task-dyn/Foo.scala b/sbt/src/sbt-test/actions/input-task-dyn/Foo.scala new file mode 100644 index 000000000..e7c14d665 --- /dev/null +++ b/sbt/src/sbt-test/actions/input-task-dyn/Foo.scala @@ -0,0 +1,5 @@ +object Foo { + def main(args: Array[String]): Unit = { + println("Foo: " + args.toList.toString) + } +} diff --git a/sbt/src/sbt-test/actions/input-task-dyn/build.sbt b/sbt/src/sbt-test/actions/input-task-dyn/build.sbt new file mode 100644 index 000000000..8ceb394d3 --- /dev/null +++ b/sbt/src/sbt-test/actions/input-task-dyn/build.sbt @@ -0,0 +1,18 @@ +import complete.Parser + +// http://www.scala-sbt.org/0.13/docs/Input-Tasks.html + +val runFoo = inputKey[Unit]("Runs Foo with passed arguments") +val check = taskKey[Unit]("") + +lazy val root = (project in file(".")). + settings( + name := "run-test", + runFoo := Def.inputTaskDyn { + val args = Def.spaceDelimited().parsed + (runMain in Compile).toTask(s" Foo " + args.mkString(" ")) + }.evaluated, + check := { + val x = runFoo.toTask(" hi ho").value + } + ) diff --git a/sbt/src/sbt-test/actions/input-task-dyn/test b/sbt/src/sbt-test/actions/input-task-dyn/test new file mode 100644 index 000000000..15675b169 --- /dev/null +++ b/sbt/src/sbt-test/actions/input-task-dyn/test @@ -0,0 +1 @@ +> check From 2bc5ba02f3023aa718ef6775b60d04ba80c48909 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Mon, 27 Mar 2017 14:20:20 +0100 Subject: [PATCH 2/2] Add three more missing WeakTypeTags .. accidentally removed in 12c2734052a2e15f1830eb21cd9fa68209270116 --- main-settings/src/main/scala/sbt/std/InputConvert.scala | 4 ++-- main-settings/src/main/scala/sbt/std/SettingMacro.scala | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main-settings/src/main/scala/sbt/std/InputConvert.scala b/main-settings/src/main/scala/sbt/std/InputConvert.scala index ca0ec290c..e27bde995 100644 --- a/main-settings/src/main/scala/sbt/std/InputConvert.scala +++ b/main-settings/src/main/scala/sbt/std/InputConvert.scala @@ -48,13 +48,13 @@ object FullConvert extends Convert { case _ => Converted.NotApplicable[c.type] } - private def wrapInit[T](c: blackbox.Context)(tree: c.Tree): Converted[c.type] = { + private def wrapInit[T: c.WeakTypeTag](c: blackbox.Context)(tree: c.Tree): Converted[c.type] = { val i = c.Expr[Initialize[T]](tree) val t = c.universe.reify(Def.toITask(i.splice)).tree Converted.Success[c.type](t) } - private def wrapTask[T](c: blackbox.Context)(tree: c.Tree): Converted[c.type] = { + private def wrapTask[T: c.WeakTypeTag](c: blackbox.Context)(tree: c.Tree): Converted[c.type] = { val i = c.Expr[Task[T]](tree) val t = c.universe.reify(Def.valueStrict[Task[T]](i.splice)).tree Converted.Success[c.type](t) diff --git a/main-settings/src/main/scala/sbt/std/SettingMacro.scala b/main-settings/src/main/scala/sbt/std/SettingMacro.scala index 1fc0dda4a..a45e22699 100644 --- a/main-settings/src/main/scala/sbt/std/SettingMacro.scala +++ b/main-settings/src/main/scala/sbt/std/SettingMacro.scala @@ -25,7 +25,7 @@ object InitializeConvert extends Convert { case _ => Converted.NotApplicable } - private def convert[T](c: blackbox.Context)(in: c.Tree): Converted[c.type] = + private def convert[T: c.WeakTypeTag](c: blackbox.Context)(in: c.Tree): Converted[c.type] = { val i = c.Expr[Initialize[T]](in) val t = c.universe.reify(i.splice).tree