diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-09-20 14:15:50 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-20 14:15:50 +0800 |
commit | d551ee9d751201491a1d64e4da76ab03e3815df6 (patch) | |
tree | 60471609f0957401fa1a7002578ad8c1acd6bc75 /main/src | |
parent | c8fd6bd9e1dc18c24e64147fcd221e0bf91c2d06 (diff) | |
download | mill-d551ee9d751201491a1d64e4da76ab03e3815df6.tar.gz mill-d551ee9d751201491a1d64e4da76ab03e3815df6.tar.bz2 mill-d551ee9d751201491a1d64e4da76ab03e3815df6.zip |
Include scaladoc as part of mill inspect (#435)
Diffstat (limited to 'main/src')
-rw-r--r-- | main/src/mill/main/MainModule.scala | 13 | ||||
-rw-r--r-- | main/src/mill/main/MainRunner.scala | 4 | ||||
-rw-r--r-- | main/src/mill/main/ReplApplyHandler.scala | 24 | ||||
-rw-r--r-- | main/src/mill/main/Resolve.scala | 1 | ||||
-rw-r--r-- | main/src/mill/main/VisualizeModule.scala | 1 | ||||
-rw-r--r-- | main/src/mill/modules/Util.scala | 13 |
6 files changed, 50 insertions, 6 deletions
diff --git a/main/src/mill/main/MainModule.scala b/main/src/mill/main/MainModule.scala index 834d5609..7e326860 100644 --- a/main/src/mill/main/MainModule.scala +++ b/main/src/mill/main/MainModule.scala @@ -135,6 +135,7 @@ trait MainModule extends mill.Module{ */ def inspect(evaluator: Evaluator, targets: String*) = mill.T.command{ MainModule.resolveTasks(evaluator, targets, multiSelect = true){ tasks => + val output = new StringBuilder for{ task <- tasks tree = ReplApplyHandler.pprintTask(task, evaluator) @@ -149,8 +150,10 @@ trait MainModule extends mill.Module{ val truncated = new Truncated(rendered, defaults.defaultWidth, defaults.defaultHeight) str <- truncated ++ Iterator("\n") } { - print(str) + output.append(str) } + println(output) + output.toString } } @@ -222,10 +225,17 @@ trait MainModule extends mill.Module{ } } + + /** + * Renders the dependencies between the given tasks as a SVG for you to look at + */ def visualize(evaluator: Evaluator, targets: String*) = mill.T.command{ visualize0(evaluator, targets, T.ctx(), mill.main.VisualizeModule.worker()) } + /** + * Renders the dependencies between the given tasks, and all their dependencies, as a SVG + */ def visualizePlan(evaluator: Evaluator, targets: String*) = mill.T.command{ plan0(evaluator, targets) match { case Left(err) => Result.Failure(err) @@ -258,5 +268,4 @@ trait MainModule extends mill.Module{ } } } - } diff --git a/main/src/mill/main/MainRunner.scala b/main/src/mill/main/MainRunner.scala index 30a23632..58c47998 100644 --- a/main/src/mill/main/MainRunner.scala +++ b/main/src/mill/main/MainRunner.scala @@ -144,7 +144,9 @@ class MainRunner(val config: ammonite.main.Cli.Config, |$imports |import mill._ |object $wrapName - |extends mill.define.BaseModule(ammonite.ops.Path($literalPath), foreign0 = $external) + |extends mill.define.BaseModule(ammonite.ops.Path($literalPath), foreign0 = $external)( + | implicitly, implicitly, implicitly, implicitly, mill.define.Caller(()) + |) |with $wrapName{ | // Stub to make sure Ammonite has something to call after it evaluates a script, | // even if it does nothing... diff --git a/main/src/mill/main/ReplApplyHandler.scala b/main/src/mill/main/ReplApplyHandler.scala index c40b82c9..59a6780b 100644 --- a/main/src/mill/main/ReplApplyHandler.scala +++ b/main/src/mill/main/ReplApplyHandler.scala @@ -6,6 +6,7 @@ import mill.define.Applicative.ApplyHandler import mill.define.Segment.Label import mill.define._ import mill.eval.{Evaluator, Result} + import mill.util.Strict.Agg import scala.collection.mutable @@ -69,6 +70,11 @@ object ReplApplyHandler{ ) } + + def resolveParents(c: Class[_]): Seq[Class[_]] = { + Seq(c) ++ Option(c.getSuperclass).toSeq.flatMap(resolveParents) ++ c.getInterfaces.flatMap(resolveParents) + } + def pprintTask(t: NamedTask[_], evaluator: Evaluator) = { val seen = mutable.Set.empty[Task[_]] def rec(t: Task[_]): Seq[Segments] = { @@ -81,10 +87,24 @@ object ReplApplyHandler{ t.inputs.flatMap(rec) } } + + val annots = for { + c <- resolveParents(t.ctx.enclosingCls) + m <- c.getMethods + if m.getName == t.ctx.segment.pathSegments.head + a = m.getAnnotation(classOf[mill.moduledefs.Scaladoc]) + if a != null + }yield a + + val allDocs = + for(a <- annots.distinct) + yield mill.modules.Util.cleanupScaladoc(a.value).map("\n " + _).mkString + pprint.Tree.Lazy(ctx => Iterator( - t.toString, "(", t.ctx.fileName.split('/').last, ":", t.ctx.lineNum.toString, ")", - "\n", ctx.applyPrefixColor("Inputs:").toString + ctx.applyPrefixColor(t.toString).toString, "(", t.ctx.fileName.split('/').last, ":", t.ctx.lineNum.toString, ")", + allDocs.mkString("\n"), "\n", + "\n", ctx.applyPrefixColor("Inputs").toString, ":" ) ++ t.inputs.iterator.flatMap(rec).map("\n " + _.render) ) } diff --git a/main/src/mill/main/Resolve.scala b/main/src/mill/main/Resolve.scala index d0a08c87..a2c186ed 100644 --- a/main/src/mill/main/Resolve.scala +++ b/main/src/mill/main/Resolve.scala @@ -219,6 +219,7 @@ object ResolveTasks extends Resolve[NamedTask[Any]]{ } } } + object Resolve{ def minimum(i1: Int, i2: Int, i3: Int)= math.min(math.min(i1, i2), i3) diff --git a/main/src/mill/main/VisualizeModule.scala b/main/src/mill/main/VisualizeModule.scala index 6945cf2f..ea4d46c6 100644 --- a/main/src/mill/main/VisualizeModule.scala +++ b/main/src/mill/main/VisualizeModule.scala @@ -10,7 +10,6 @@ import mill.T import mill.define.{Discover, ExternalModule} import mill.eval.{PathRef, Result} - object VisualizeModule extends ExternalModule with VisualizeModule { def repositories = Seq( Cache.ivy2Local, diff --git a/main/src/mill/modules/Util.scala b/main/src/mill/modules/Util.scala index 2d71c13e..38cd056b 100644 --- a/main/src/mill/modules/Util.scala +++ b/main/src/mill/modules/Util.scala @@ -7,6 +7,19 @@ import mill.eval.PathRef import mill.util.{Ctx, IO, Loose} object Util { + def cleanupScaladoc(v: String) = { + v.lines.map( + _.dropWhile(_.isWhitespace) + .stripPrefix("/**") + .stripPrefix("*/") + .stripPrefix("*") + .dropWhile(_.isWhitespace) + ).toArray + .dropWhile(_.isEmpty) + .reverse + .dropWhile(_.isEmpty) + .reverse + } def download(url: String, dest: RelPath = "download")(implicit ctx: Ctx.Dest) = { val out = ctx.dest / dest |