diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-12-19 19:04:55 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-12-19 19:04:55 +0800 |
commit | 497f044545d8a8299c963e8e3dd5241882270362 (patch) | |
tree | d4e2fa124983377df9c2f8631ee4804a97cd74db /main/core/src/define/Ctx.scala | |
parent | b44fe2753c62349b3b133d1da0e41a19178233a1 (diff) | |
parent | de175e69977082e35539097a54d381e465dddf8e (diff) | |
download | mill-497f044545d8a8299c963e8e3dd5241882270362.tar.gz mill-497f044545d8a8299c963e8e3dd5241882270362.tar.bz2 mill-497f044545d8a8299c963e8e3dd5241882270362.zip |
Merge branch 'master' into bump-zinc
Diffstat (limited to 'main/core/src/define/Ctx.scala')
-rw-r--r-- | main/core/src/define/Ctx.scala | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/main/core/src/define/Ctx.scala b/main/core/src/define/Ctx.scala new file mode 100644 index 00000000..c21e53b4 --- /dev/null +++ b/main/core/src/define/Ctx.scala @@ -0,0 +1,100 @@ +package mill.define + + +import scala.annotation.implicitNotFound + +sealed trait Segment{ + def pathSegments: Seq[String] = this match{ + case Segment.Label(s) => List(s) + case Segment.Cross(vs) => vs.map(_.toString) + } +} +object Segment{ + case class Label(value: String) extends Segment{ + assert(!value.contains('.')) + } + case class Cross(value: Seq[Any]) extends Segment +} + +case class BasePath(value: os.Path) + + +/** + * Models a path with the Mill build hierarchy, e.g. + * + * amm.util[2.11].test.compile + * + * .-separated segments are [[Segment.Label]]s, while []-delimited + * segments are [[Segment.Cross]]s + */ +case class Segments(value: Segment*){ + def ++(other: Seq[Segment]): Segments = Segments(value ++ other:_*) + def ++(other: Segments): Segments = Segments(value ++ other.value:_*) + def parts = value.toList match { + case Nil => Nil + case Segment.Label(head) :: rest => + val stringSegments = rest.flatMap{ + case Segment.Label(s) => Seq(s) + case Segment.Cross(vs) => vs.map(_.toString) + } + head +: stringSegments + } + def last : Segments = Segments(value.last) + def render = value.toList match { + case Nil => "" + case Segment.Label(head) :: rest => + val stringSegments = rest.map{ + case Segment.Label(s) => "." + s + case Segment.Cross(vs) => "[" + vs.mkString(",") + "]" + } + head + stringSegments.mkString + } +} + +object Segments { + + def labels(values : String*) : Segments = + Segments(values.map(Segment.Label):_*) + +} + +@implicitNotFound("Modules, Targets and Commands can only be defined within a mill Module") +case class Ctx(enclosing: String, + lineNum: Int, + segment: Segment, + millSourcePath: os.Path, + segments: Segments, + overrides: Int, + external: Boolean, + foreign: Boolean, + fileName: String, + enclosingCls: Class[_]){ +} + +object Ctx{ + case class External(value: Boolean) + case class Foreign(value : Boolean) + implicit def make(implicit millModuleEnclosing0: sourcecode.Enclosing, + millModuleLine0: sourcecode.Line, + millName0: sourcecode.Name, + millModuleBasePath0: BasePath, + segments0: Segments, + overrides0: mill.util.Router.Overrides, + external0: External, + foreign0: Foreign, + fileName: sourcecode.File, + enclosing: Caller): Ctx = { + Ctx( + millModuleEnclosing0.value, + millModuleLine0.value, + Segment.Label(millName0.value), + millModuleBasePath0.value, + segments0, + overrides0.value, + external0.value, + foreign0.value, + fileName.value, + enclosing.value.getClass + ) + } +} |