diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/src/mill/main/Resolve.scala | 44 | ||||
-rw-r--r-- | main/test/src/mill/main/MainTests.scala | 6 |
2 files changed, 32 insertions, 18 deletions
diff --git a/main/src/mill/main/Resolve.scala b/main/src/mill/main/Resolve.scala index bd946be3..01c3dcf3 100644 --- a/main/src/mill/main/Resolve.scala +++ b/main/src/mill/main/Resolve.scala @@ -101,7 +101,7 @@ object ResolveTasks extends Resolve[NamedTask[Any]]{ Resolve.runDefault(obj, Segment.Cross(last), discover, rest).flatten.headOption match{ case None => Left( - "Unable to find default task to evaluate for module " + + "Cannot find default task to evaluate for module " + Segments((Segment.Cross(last) :: revSelectorsSoFar).reverse:_*).render ) case Some(v) => v.map(Seq(_)) @@ -130,6 +130,8 @@ object ResolveTasks extends Resolve[NamedTask[Any]]{ command orElse target orElse Resolve.runDefault(obj, Segment.Label(last), discover, rest).flatten.headOption match { case None => + pprint.log(revSelectorsSoFar) + pprint.log(last) Resolve.errorMsgLabel( singleModuleMeta(obj, discover, revSelectorsSoFar.isEmpty), last, @@ -160,16 +162,17 @@ object Resolve{ dist(s2.length)(s1.length) } - def unableToResolve(last: Segment, revSelectorsSoFar: List[Segment]) = { - "Unable to resolve " + - Segments((last :: revSelectorsSoFar).reverse: _*).render + - "." + def unableToResolve(last: Segment, revSelectorsSoFar: List[Segment]): String = { + unableToResolve(Segments((last :: revSelectorsSoFar).reverse: _*).render) } + def unableToResolve(segments: String): String = "Cannot resolve " + segments + "." + def hintList(last: Segment, revSelectorsSoFar: List[Segment]) = { val search = Segments((last :: revSelectorsSoFar).reverse: _*).render s" Try `mill resolve $search` to see what's available." } + def hintListLabel(revSelectorsSoFar: List[Segment]) = { hintList(Segment.Label("_"), revSelectorsSoFar) } @@ -183,30 +186,41 @@ object Resolve{ revSelectorsSoFar: List[Segment], editSplit: String => String) (strings: T => Seq[String], - segment: T => Segment)= { + render: T => String)= { val last = strings(last0) val similar = direct - .map(strings) - .filter(_.length == last.length) - .map(d => (d, d.zip(last).map{case (a, b) => Resolve.editDistance(editSplit(a), b)}.sum)) + .map(x => (x, strings(x))) + .filter(_._2.length == last.length) + .map{ case (d, s) => (d, s.zip(last).map{case (a, b) => Resolve.editDistance(editSplit(a), b)}.sum)} .filter(_._2 < 3) .sortBy(_._2) val hint = similar match{ case Nil => hintListLabel(revSelectorsSoFar) - case items => " Did you mean " + items.head._1 + "?" + case items => + " Did you mean " + render(items.head._1)+ "?" } - Left(unableToResolve(segment(last0), revSelectorsSoFar) + hint) + pprint.log(direct) + pprint.log(revSelectorsSoFar) + pprint.log(last0) + pprint.log(last) + Left(unableToResolve(render(last0)) + hint) } def errorMsgLabel(direct: Seq[String], last: String, revSelectorsSoFar: List[Segment]) = { - errorMsgBase(direct, last, revSelectorsSoFar, _.split('.').last)(Seq(_), Segment.Label(_)) + errorMsgBase(direct, Segments((Segment.Label(last) :: revSelectorsSoFar).reverse:_*).render, revSelectorsSoFar, _.split('.').last)( + rendered => Seq(rendered.split('.').last), + x => x + ) } def errorMsgCross(crossKeys: Seq[Seq[String]], last: Seq[String], revSelectorsSoFar: List[Segment]) = { - errorMsgBase(crossKeys, last, revSelectorsSoFar, x => x)(x => x, Segment.Cross(_)) + errorMsgBase(crossKeys, last, revSelectorsSoFar, x => x)( + crossKeys => crossKeys, + crossKeys => Segments((Segment.Cross(crossKeys) :: revSelectorsSoFar).reverse:_*).render + ) } def invokeCommand(target: Module, @@ -271,7 +285,7 @@ abstract class Resolve[R: ClassTag] { case head :: tail => val newRevSelectorsSoFar = head :: revSelectorsSoFar - def recurse(searchModules: Seq[Module], resolveFailureMsg: Left[String, Nothing]) = { + def recurse(searchModules: Seq[Module], resolveFailureMsg: => Left[String, Nothing]) = { val matching = searchModules .map(resolve(tail, _, discover, rest, remainingCrossSelectors, newRevSelectorsSoFar)) @@ -315,7 +329,7 @@ abstract class Resolve[R: ClassTag] { Resolve.errorMsgCross( c.items.map(_._1.map(_.toString)), cross.map(_.toString), - revSelectorsSoFar + newRevSelectorsSoFar ) ) case _ => diff --git a/main/test/src/mill/main/MainTests.scala b/main/test/src/mill/main/MainTests.scala index 87b3f7ab..7ad5c00e 100644 --- a/main/test/src/mill/main/MainTests.scala +++ b/main/test/src/mill/main/MainTests.scala @@ -15,7 +15,7 @@ object MainTests extends TestSuite{ val resolved = for{ selectors <- mill.util.ParseArgs(Seq(selectorString), multiSelect = false).map(_._1.head) val crossSelectors = selectors._2.value.map{case Segment.Cross(x) => x.toList.map(_.toString) case _ => Nil} - task <- mill.main.Resolve.resolve( + task <- mill.main.ResolveTasks.resolve( selectors._2.value.toList, module, discover, Nil, crossSelectors.toList, Nil ) } yield task @@ -27,8 +27,8 @@ object MainTests extends TestSuite{ 'single - { val check = MainTests.check(singleton) _ 'pos - check("single", Right(Seq(_.single))) - 'neg1 - check("doesntExist", Left("Cannot resolve doesntExist")) - 'neg2 - check("single.doesntExist", Left("Cannot resolve single")) + 'neg1 - check("doesntExist", Left("Cannot resolve doesntExist. Try `mill resolve _` to see what's available.")) + 'neg2 - check("single.doesntExist", Left("Cannot resolve single. Try `mill resolve _` to see what's available.")) 'neg3 - check("", Left("Selector cannot be empty")) } 'nested - { |