diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-02-19 14:44:15 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-02-19 14:44:24 -0800 |
commit | fb8c75c01f86f41a62e549eb03953789658f7cae (patch) | |
tree | b91a7448157def5cdf1d0e04705916d04e39f2c9 /core | |
parent | 790c21c976e5c2944ba7f729e0c5762de8f51baf (diff) | |
download | mill-fb8c75c01f86f41a62e549eb03953789658f7cae.tar.gz mill-fb8c75c01f86f41a62e549eb03953789658f7cae.tar.bz2 mill-fb8c75c01f86f41a62e549eb03953789658f7cae.zip |
Improve error reporting for NamedTasks with the wrong number of parameters
Diffstat (limited to 'core')
-rw-r--r-- | core/src/mill/define/Discover.scala | 26 | ||||
-rw-r--r-- | core/src/mill/define/Task.scala | 2 |
2 files changed, 25 insertions, 3 deletions
diff --git a/core/src/mill/define/Discover.scala b/core/src/mill/define/Discover.scala index 1b6b002a..f0c668e6 100644 --- a/core/src/mill/define/Discover.scala +++ b/core/src/mill/define/Discover.scala @@ -42,22 +42,44 @@ object Discover { } rec(weakTypeOf[T]) + def assertParamListCounts(methods: Iterable[router.c.universe.MethodSymbol], + cases: (c.Type, Int, String)*) = { + for (m <- methods.toList){ + for ((tt, n, label) <- cases){ + if (m.returnType <:< tt.asInstanceOf[router.c.Type] && + m.paramLists.length != n){ + c.abort( + m.pos.asInstanceOf[c.Position], + s"$label definitions must have $n parameter list" + (if (n == 1) "" else "s") + ) + } + } + } + } val router = new mill.util.Router(c) val mapping = for{ discoveredModuleType <- seen val curCls = discoveredModuleType.asInstanceOf[router.c.Type] val methods = router.getValsOrMeths(curCls) val overridesRoutes = { + assertParamListCounts( + methods, + (weakTypeOf[mill.define.Sources], 0, "`T.sources`"), + (weakTypeOf[mill.define.Input[_]], 0, "`T.input`"), + (weakTypeOf[mill.define.Persistent[_]], 0, "`T.persistent`"), + (weakTypeOf[mill.define.Target[_]], 0, "`T{...}`"), + (weakTypeOf[mill.define.Command[_]], 1, "`T.command`") + ) + for{ m <- methods.toList if m.returnType <:< weakTypeOf[mill.define.Command[_]].asInstanceOf[router.c.Type] } yield (m.overrides.length, router.extractMethod(m, curCls).asInstanceOf[c.Tree]) + } if overridesRoutes.nonEmpty } yield { - val (overrides, routes) = overridesRoutes.unzip val lhs = q"classOf[${discoveredModuleType.typeSymbol.asClass}]" - val clsType = discoveredModuleType.typeSymbol.asClass val rhs = q"scala.Seq[(Int, mill.util.Router.EntryPoint[_])](..$overridesRoutes)" q"$lhs -> $rhs" } diff --git a/core/src/mill/define/Task.scala b/core/src/mill/define/Task.scala index 33f94453..17be54fe 100644 --- a/core/src/mill/define/Task.scala +++ b/core/src/mill/define/Task.scala @@ -231,7 +231,7 @@ object Target extends TargetGenerated with Applicative.Applyer[Task, Task, Resul def persistent[T](t: Result[T])(implicit r: R[T], w: W[T], - ctx: mill.define.Ctx): Target[T] = macro persistentImpl[T] + ctx: mill.define.Ctx): Persistent[T] = macro persistentImpl[T] def persistentImpl[T: c.WeakTypeTag](c: Context) (t: c.Expr[T]) |