@@ -18,32 +18,53 @@ object TokenGrouping {
1818 }
1919
2020 val flatArgs = flatArgs0.toList
21- val keywordArgMap = argSigs
21+ def makeKeywordArgMap ( getNames : ArgSig => Iterable [ String ]) = argSigs
2222 .collect {
2323 case (a, r : TokensReader .Simple [_]) if ! a.positional => a
2424 case (a, r : TokensReader .Flag ) => a
2525 }
26- .flatMap { x => (x.name.map( " -- " + _) ++ x.shortName.map( " - " + _) ).map(_ -> x) }
26+ .flatMap { x => getNames(x ).map(_ -> x) }
2727 .toMap[String , ArgSig ]
2828
29+ lazy val keywordArgMap = makeKeywordArgMap(
30+ x => x.name.map(" --" + _) ++ x.shortName.map(" -" + _)
31+ )
32+
33+ lazy val longKeywordArgMap = makeKeywordArgMap(x => x.name.map(" --" + _))
34+
2935 @ tailrec def rec (
3036 remaining : List [String ],
3137 current : Map [ArgSig , Vector [String ]]
3238 ): Result [TokenGrouping [B ]] = {
3339 remaining match {
3440 case head :: rest =>
41+
42+ def lookupArgMap (k : String , m : Map [String , ArgSig ]): Option [(ArgSig , mainargs.TokensReader [_])] = {
43+ m.get(k).map(a => (a, a.reader))
44+ }
45+
3546 if (head.startsWith(" -" ) && head.exists(_ != '-' )) {
36- keywordArgMap.get(head) match {
37- case Some (cliArg : ArgSig ) if cliArg.reader.isFlag =>
38- rec(rest, Util .appendMap(current, cliArg, " " ))
39- case Some (cliArg : ArgSig ) if ! cliArg.reader.isLeftover =>
40- rest match {
41- case next :: rest2 => rec(rest2, Util .appendMap(current, cliArg, next))
42- case Nil =>
43- Result .Failure .MismatchedArguments (Nil , Nil , Nil , incomplete = Some (cliArg))
47+ head.split(" =" , 2 ) match {
48+ case Array (first, second) =>
49+ lookupArgMap(first, longKeywordArgMap) match {
50+ case Some ((cliArg, _ : TokensReader .Simple [_])) =>
51+ rec(rest, Util .appendMap(current, cliArg, second))
52+
53+ case _ => complete(remaining, current)
4454 }
4555
46- case _ => complete(remaining, current)
56+ case _ =>
57+ lookupArgMap(head, keywordArgMap) match {
58+ case Some ((cliArg, _ : TokensReader .Flag )) =>
59+ rec(rest, Util .appendMap(current, cliArg, " " ))
60+ case Some ((cliArg, _ : TokensReader .Simple [_])) =>
61+ rest match {
62+ case next :: rest2 => rec(rest2, Util .appendMap(current, cliArg, next))
63+ case Nil =>
64+ Result .Failure .MismatchedArguments (Nil , Nil , Nil , incomplete = Some (cliArg))
65+ }
66+ case _ => complete(remaining, current)
67+ }
4768 }
4869 } else {
4970 positionalArgSigs.find(! current.contains(_)) match {
0 commit comments