@@ -125,23 +125,25 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
125
125
stopAtFirstUnrecognized : Boolean ,
126
126
ignoreUnrecognized : Boolean
127
127
): Either [Error , (T , RemainingArgs )] = {
128
- val (res, _) = scan(args, stopAtFirstUnrecognized, ignoreUnrecognized)
129
- res.left.map(_._1)
128
+ val (res, remArgs, _) = scan(args, stopAtFirstUnrecognized, ignoreUnrecognized)
129
+ res
130
+ .left.map(_._1)
131
+ .map((_, remArgs))
130
132
}
131
133
132
134
final def scan (
133
135
args : Seq [String ],
134
136
stopAtFirstUnrecognized : Boolean ,
135
137
ignoreUnrecognized : Boolean
136
- ): (Either [(Error , Either [D , T ]), ( T , RemainingArgs )] , List [Step ]) = {
138
+ ): (Either [(Error , Either [D , T ]), T ] , RemainingArgs , List [Step ]) = {
137
139
138
140
def runHelper (
139
141
current : D ,
140
142
args : List [String ],
141
143
extraArgsReverse : List [Indexed [String ]],
142
144
reverseSteps : List [Step ],
143
145
index : Int
144
- ): (Either [(Error , Either [D , T ]), ( T , RemainingArgs )] , List [Step ]) =
146
+ ): (Either [(Error , Either [D , T ]), T ] , RemainingArgs , List [Step ]) =
145
147
helper(current, args, extraArgsReverse, reverseSteps, index)
146
148
147
149
@ tailrec
@@ -151,41 +153,40 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
151
153
extraArgsReverse : List [Indexed [String ]],
152
154
reverseSteps : List [Step ],
153
155
index : Int
154
- ): (Either [(Error , Either [D , T ]), ( T , RemainingArgs )] , List [Step ]) = {
156
+ ): (Either [(Error , Either [D , T ]), T ] , RemainingArgs , List [Step ]) = {
155
157
156
158
def done = {
159
+ val remArgs = RemainingArgs (extraArgsReverse.reverse, Nil )
157
160
val res = get(current)
158
161
.left.map((_, Left (current)))
159
- .map((_, RemainingArgs (extraArgsReverse.reverse, Nil )))
160
- (res, reverseSteps.reverse)
162
+ (res, remArgs, reverseSteps.reverse)
161
163
}
162
164
163
165
def stopParsing (tailArgs : List [String ]) = {
166
+ val remArgs =
167
+ if (stopAtFirstUnrecognized)
168
+ // extraArgsReverse should be empty anyway here
169
+ RemainingArgs (extraArgsReverse.reverse ::: Indexed .list(args, index), Nil )
170
+ else
171
+ RemainingArgs (extraArgsReverse.reverse, Indexed .seq(tailArgs, index + 1 ))
164
172
val res = get(current)
165
173
.left.map((_, Left (current)))
166
- .map { t =>
167
- if (stopAtFirstUnrecognized)
168
- // extraArgsReverse should be empty anyway here
169
- (t, RemainingArgs (extraArgsReverse.reverse ::: Indexed .list(args, index), Nil ))
170
- else
171
- (t, RemainingArgs (extraArgsReverse.reverse, Indexed .seq(tailArgs, index + 1 )))
172
- }
173
174
val reverseSteps0 = Step .DoubleDash (index) :: reverseSteps.reverse
174
- (res, reverseSteps0.reverse)
175
+ (res, remArgs, reverseSteps0.reverse)
175
176
}
176
177
177
178
def unrecognized (headArg : String , tailArgs : List [String ]) =
178
179
if (stopAtFirstUnrecognized) {
180
+ // extraArgsReverse should be empty anyway here
181
+ val remArgs = RemainingArgs (extraArgsReverse.reverse ::: Indexed .list(args, index), Nil )
179
182
val res = get(current)
180
183
.left.map((_, Left (current)))
181
- // extraArgsReverse should be empty anyway here
182
- .map((_, RemainingArgs (extraArgsReverse.reverse ::: Indexed .list(args, index), Nil )))
183
184
val reverseSteps0 = Step .FirstUnrecognized (index, isOption = true ) :: reverseSteps
184
- (res, reverseSteps0.reverse)
185
+ (res, remArgs, reverseSteps0.reverse)
185
186
}
186
187
else {
187
188
val err = Error .UnrecognizedArgument (headArg)
188
- val (remaining, steps) = runHelper(
189
+ val (remaining, remArgs, steps) = runHelper(
189
190
current,
190
191
tailArgs,
191
192
extraArgsReverse,
@@ -194,18 +195,18 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
194
195
)
195
196
val res = Left ((
196
197
remaining.fold(t => err.append(t._1), _ => err),
197
- remaining.fold(_._2, t => Right (t._1 ))
198
+ remaining.fold(_._2, Right (_ ))
198
199
))
199
- (res, steps)
200
+ (res, remArgs, steps)
200
201
}
201
202
202
203
def stoppingAtUnrecognized = {
204
+ // extraArgsReverse should be empty anyway here
205
+ val remArgs = RemainingArgs (extraArgsReverse.reverse ::: Indexed .list(args, index), Nil )
203
206
val res = get(current)
204
207
.left.map((_, Left (current)))
205
- // extraArgsReverse should be empty anyway here
206
- .map((_, RemainingArgs (extraArgsReverse.reverse ::: Indexed .list(args, index), Nil )))
207
208
val reverseSteps0 = Step .FirstUnrecognized (index, isOption = false ) :: reverseSteps
208
- (res, reverseSteps0.reverse)
209
+ (res, remArgs, reverseSteps0.reverse)
209
210
}
210
211
211
212
args match {
@@ -257,7 +258,7 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
257
258
case Left ((msg, matchedArg, rem)) =>
258
259
val consumed0 = Parser .consumed(args, rem)
259
260
assert(consumed0 > 0 )
260
- val (remaining, steps) = runHelper(
261
+ val (remaining, remArgs, steps) = runHelper(
261
262
current,
262
263
rem,
263
264
extraArgsReverse,
@@ -266,9 +267,9 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
266
267
)
267
268
val res = Left ((
268
269
remaining.fold(errs => msg.append(errs._1), _ => msg),
269
- remaining.fold(_._2, t => Right (t._1 ))
270
+ remaining.fold(_._2, Right (_ ))
270
271
))
271
- (res, steps)
272
+ (res, remArgs, steps)
272
273
}
273
274
}
274
275
}
@@ -286,11 +287,11 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
286
287
287
288
val args0 = if (index < args.length) args else args ++ Seq .fill(index + 1 - args.length)(" " )
288
289
289
- val (res, steps) = scan(args0, stopAtFirstUnrecognized, ignoreUnrecognized)
290
+ val (res, remArgs, steps) = scan(args0, stopAtFirstUnrecognized, ignoreUnrecognized)
290
291
lazy val stateOpt = res match {
291
292
case Left ((_, Left (state))) => get(state).toOption
292
293
case Left ((_, Right (t))) => Some (t)
293
- case Right ((t, _)) => Some (t)
294
+ case Right (t) => Some (t)
294
295
}
295
296
296
297
assert(index >= 0 )
@@ -305,38 +306,53 @@ trait ParserMethods[+T] { parser: Parser[T @Internal.uncheckedVarianceScala2] =>
305
306
val value = args0(index)
306
307
307
308
stepOpt match {
308
- case None => Nil
309
+ case None =>
310
+ val isAfterDoubleDash = steps.lastOption.exists {
311
+ case Step .DoubleDash (ddIdx) => ddIdx < index
312
+ case _ => false
313
+ }
314
+ if (isAfterDoubleDash)
315
+ completer.postDoubleDash(stateOpt, remArgs)
316
+ .map { completer =>
317
+ if (value.startsWith(" -" ))
318
+ completer.optionName(value, stateOpt, remArgs)
319
+ else
320
+ completer.argument(value, stateOpt, remArgs)
321
+ }
322
+ .getOrElse(Nil )
323
+ else
324
+ Nil
309
325
case Some (step) =>
310
326
val shift = index - step.index
311
327
step match {
312
328
case Step .DoubleDash (_) =>
313
- completer.optionName(value, stateOpt)
329
+ completer.optionName(value, stateOpt, remArgs )
314
330
case Step .ErroredOption (_, _, _, _) if shift == 0 =>
315
- completer.optionName(value, stateOpt)
331
+ completer.optionName(value, stateOpt, remArgs )
316
332
case Step .ErroredOption (_, consumed, arg, _) if consumed == 2 && shift == 1 =>
317
- completer.optionValue(arg, value, stateOpt)
333
+ completer.optionValue(arg, value, stateOpt, remArgs )
318
334
case Step .ErroredOption (_, _, _, _) =>
319
335
// should not happen
320
336
Nil
321
337
case Step .FirstUnrecognized (_, true ) =>
322
- completer.optionName(value, stateOpt)
338
+ completer.optionName(value, stateOpt, remArgs )
323
339
case Step .FirstUnrecognized (_, false ) =>
324
- completer.argument(value, stateOpt)
340
+ completer.argument(value, stateOpt, remArgs )
325
341
case Step .IgnoredUnrecognized (_) =>
326
- completer.optionName(value, stateOpt)
342
+ completer.optionName(value, stateOpt, remArgs )
327
343
case Step .Unrecognized (_, _) =>
328
- completer.optionName(value, stateOpt)
329
- case Step .StandardArgument (idx) if args0(idx) == " -" =>
330
- completer.optionName(value, stateOpt)
344
+ completer.optionName(value, stateOpt, remArgs )
345
+ case Step .StandardArgument (idx) if value == " -" =>
346
+ completer.optionName(value, stateOpt, remArgs )
331
347
case Step .MatchedOption (_, consumed, arg) if shift == 0 =>
332
- completer.optionName(value, stateOpt)
348
+ completer.optionName(value, stateOpt, remArgs )
333
349
case Step .MatchedOption (_, consumed, arg) if consumed == 2 && shift == 1 =>
334
- completer.optionValue(arg, value, stateOpt)
350
+ completer.optionValue(arg, value, stateOpt, remArgs )
335
351
case Step .MatchedOption (_, _, _) =>
336
352
// should not happen
337
353
Nil
338
354
case Step .StandardArgument (_) =>
339
- completer.argument(value, stateOpt)
355
+ completer.argument(value, stateOpt, remArgs )
340
356
}
341
357
}
342
358
}
0 commit comments