summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/mill/define/BaseModule.scala50
-rw-r--r--core/src/mill/main/MainRunner.scala1
-rw-r--r--core/src/mill/main/Resolve.scala13
-rw-r--r--core/src/mill/main/Scopt.scala19
4 files changed, 66 insertions, 17 deletions
diff --git a/core/src/mill/define/BaseModule.scala b/core/src/mill/define/BaseModule.scala
index 9cefeeae..a449a6a0 100644
--- a/core/src/mill/define/BaseModule.scala
+++ b/core/src/mill/define/BaseModule.scala
@@ -2,14 +2,16 @@ package mill.define
import ammonite.main.Router.Overrides
import ammonite.ops.Path
+import mill.main.ParseArgs
object BaseModule{
case class Implicit(value: BaseModule)
}
-class BaseModule(millSourcePath0: Path, external0: Boolean = false)
- (implicit millModuleEnclosing0: sourcecode.Enclosing,
- millModuleLine0: sourcecode.Line,
- millName0: sourcecode.Name)
+
+abstract class BaseModule(millSourcePath0: Path, external0: Boolean = false)
+ (implicit millModuleEnclosing0: sourcecode.Enclosing,
+ millModuleLine0: sourcecode.Line,
+ millName0: sourcecode.Name)
extends Module()(
mill.define.Ctx.make(
implicitly,
@@ -28,6 +30,13 @@ class BaseModule(millSourcePath0: Path, external0: Boolean = false)
override def millSourcePath = millOuterCtx.millSourcePath
override implicit def millModuleBasePath: BasePath = BasePath(millSourcePath)
implicit def millImplicitBaseModule: BaseModule.Implicit = BaseModule.Implicit(this)
+ def millDiscover: Discover[this.type]
+// implicit def millScoptModuleReads[T <: mill.Module] = new mill.main.ModuleScopt[T, this.type](
+// this, millDiscover
+// )
+ implicit def millScoptTargetReads[T] = new TargetScopt[T, this.type](
+ this, millDiscover
+ )
}
@@ -35,7 +44,7 @@ abstract class ExternalModule(implicit millModuleEnclosing0: sourcecode.Enclosin
millModuleLine0: sourcecode.Line,
millName0: sourcecode.Name)
extends BaseModule(ammonite.ops.pwd, external0 = true){
- def millDiscover: Discover[_]
+
implicit def millDiscoverImplicit: Discover[_] = millDiscover
assert(
!" #".exists(millModuleEnclosing0.value.contains(_)),
@@ -44,4 +53,33 @@ abstract class ExternalModule(implicit millModuleEnclosing0: sourcecode.Enclosin
override implicit def millModuleSegments = {
Segments(millModuleEnclosing0.value.split('.').map(Segment.Label):_*)
}
-} \ No newline at end of file
+}
+
+class TargetScopt[T, M <: BaseModule](rootModule: M, d: => Discover[M])
+ extends scopt.Read[Seq[mill.define.Target[T]]]{
+ def arity = 1
+ def reads = s => {
+ val (expanded, Nil) = ParseArgs(Seq(s)).fold(e => throw new Exception(e), identity)
+ val resolved = expanded.map{
+ case (Some(scoping), segments) =>
+ val moduleCls = rootModule.getClass.getClassLoader.loadClass(scoping.render + "$")
+ val externalRootModule = moduleCls.getField("MODULE$").get(moduleCls).asInstanceOf[ExternalModule]
+ val crossSelectors = segments.value.map {
+ case mill.define.Segment.Cross(x) => x.toList.map(_.toString)
+ case _ => Nil
+ }
+ mill.main.Resolve.resolve(segments.value.toList, externalRootModule, d, Nil, crossSelectors.toList, Nil)
+ case (None, segments) =>
+ rootModule.millInternal.segmentsToModules(segments).asInstanceOf[T]
+ val crossSelectors = segments.value.map {
+ case mill.define.Segment.Cross(x) => x.toList.map(_.toString)
+ case _ => Nil
+ }
+ mill.main.Resolve.resolve(segments.value.toList, rootModule, d, Nil, crossSelectors.toList, Nil)
+ }
+ mill.util.EitherOps.sequence(resolved) match{
+ case Left(s) => throw new Exception(s)
+ case Right(ts) => ts.flatten.collect{case t: mill.define.Target[T] => t}
+ }
+ }
+}
diff --git a/core/src/mill/main/MainRunner.scala b/core/src/mill/main/MainRunner.scala
index e3820e3d..e312aa7a 100644
--- a/core/src/mill/main/MainRunner.scala
+++ b/core/src/mill/main/MainRunner.scala
@@ -99,6 +99,7 @@ class MainRunner(config: ammonite.main.Cli.Config,
| // even if it does nothing...
| def $$main() = Iterator[String]()
|
+ | implicit def millScoptReads = new mill.main.ModuleScopt(this, millDiscover)
| implicit def millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type]
| // Need to wrap the returned Module in Some(...) to make sure it
| // doesn't get picked up during reflective child-module discovery
diff --git a/core/src/mill/main/Resolve.scala b/core/src/mill/main/Resolve.scala
index f4eeb8fe..a83e3552 100644
--- a/core/src/mill/main/Resolve.scala
+++ b/core/src/mill/main/Resolve.scala
@@ -69,19 +69,10 @@ object Resolve {
val newRevSelectorsSoFar = head :: revSelectorsSoFar
head match{
case Segment.Label(singleLabel) =>
- if (singleLabel == "__"){
- val matching =
- obj.millInternal
- .modules
- .map(resolve(tail, _, discover, rest, remainingCrossSelectors, newRevSelectorsSoFar))
- .collect{case Right(vs) => vs}.flatten
+ if (singleLabel == "_") {
- if (matching.nonEmpty) Right(matching.toSeq)
- else Left("Cannot resolve module " + Segments(newRevSelectorsSoFar.reverse:_*).render)
- }else if (singleLabel == "_") {
val matching =
- obj.millInternal
- .reflectNestedObjects[mill.Module]
+ obj.millInternal.modules
.map(resolve(tail, _, discover, rest, remainingCrossSelectors, newRevSelectorsSoFar))
.collect{case Right(vs) => vs}.flatten
diff --git a/core/src/mill/main/Scopt.scala b/core/src/mill/main/Scopt.scala
new file mode 100644
index 00000000..57d6529d
--- /dev/null
+++ b/core/src/mill/main/Scopt.scala
@@ -0,0 +1,19 @@
+//package mill.main
+//
+//import mill.define.{BaseModule, Discover, ExternalModule}
+//
+////class ModuleScopt[T <: mill.Module, M <: BaseModule](rootModule: M, d: => Discover[M])
+//// extends scopt.Read[Seq[T]]{
+//// def arity = 1
+//// def reads = s => {
+//// val (expanded, Nil) = ParseArgs(Seq(s)).fold(e => throw new Exception(e), identity)
+//// expanded.map{
+//// case (Some(scoping), segments) =>
+//// val moduleCls = rootModule.getClass.getClassLoader.loadClass(scoping.render + "$")
+//// val externalRootModule = moduleCls.getField("MODULE$").get(moduleCls).asInstanceOf[ExternalModule]
+//// externalRootModule.millInternal.segmentsToModules(segments).asInstanceOf[T]
+//// case (None, segments) =>
+//// rootModule.millInternal.segmentsToModules(segments).asInstanceOf[T]
+//// }
+//// }
+////}