From 747aa48c9cd4b75c17f6d3760a75a49c272bf8bb Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Fri, 24 Mar 2017 17:41:12 +0100 Subject: [PATCH] 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