@@ -260,37 +260,46 @@ trait Applications extends Compatibility { self: Typer with Dynamic =>
260
260
* 1. `(args diff toDrop)` can be reordered to match `pnames`
261
261
* 2. For every `(name -> arg)` in `nameToArg`, `arg` is an element of `args`
262
262
*/
263
- def recur (pnames : List [Name ], args : List [Trees .Tree [T ]],
264
- nameToArg : Map [Name , Trees .NamedArg [T ]], toDrop : Set [Name ]): List [Trees .Tree [T ]] = pnames match {
263
+ def handleNamed (pnames : List [Name ], args : List [Trees .Tree [T ]],
264
+ nameToArg : Map [Name , Trees .NamedArg [T ]], toDrop : Set [Name ]): List [Trees .Tree [T ]] = pnames match {
265
265
case pname :: pnames1 if nameToArg contains pname =>
266
266
// there is a named argument for this parameter; pick it
267
- nameToArg(pname) :: recur (pnames1, args, nameToArg - pname, toDrop + pname)
267
+ nameToArg(pname) :: handleNamed (pnames1, args, nameToArg - pname, toDrop + pname)
268
268
case _ =>
269
269
def pnamesRest = if (pnames.isEmpty) pnames else pnames.tail
270
270
args match {
271
271
case (arg @ NamedArg (aname, _)) :: args1 =>
272
272
if (toDrop contains aname) // argument is already passed
273
- recur (pnames, args1, nameToArg, toDrop - aname)
273
+ handleNamed (pnames, args1, nameToArg, toDrop - aname)
274
274
else if ((nameToArg contains aname) && pnames.nonEmpty) // argument is missing, pass an empty tree
275
- genericEmptyTree :: recur (pnames.tail, args, nameToArg, toDrop)
275
+ genericEmptyTree :: handleNamed (pnames.tail, args, nameToArg, toDrop)
276
276
else { // name not (or no longer) available for named arg
277
277
def msg =
278
278
if (methodType.paramNames contains aname)
279
279
s " parameter $aname of $methString is already instantiated "
280
280
else
281
281
s " $methString does not have a parameter $aname"
282
282
fail(msg, arg.asInstanceOf [Arg ])
283
- arg :: recur (pnamesRest, args1, nameToArg, toDrop)
283
+ arg :: handleNamed (pnamesRest, args1, nameToArg, toDrop)
284
284
}
285
285
case arg :: args1 =>
286
- arg :: recur (pnamesRest, args1, nameToArg, toDrop) // unnamed argument; pick it
286
+ arg :: handleNamed (pnamesRest, args1, nameToArg, toDrop) // unnamed argument; pick it
287
287
case Nil => // no more args, continue to pick up any preceding named args
288
288
if (pnames.isEmpty) Nil
289
- else recur (pnamesRest, args, nameToArg, toDrop)
289
+ else handleNamed (pnamesRest, args, nameToArg, toDrop)
290
290
}
291
291
}
292
- val nameAssocs = for (arg @ NamedArg (name, _) <- args) yield (name, arg)
293
- recur(methodType.paramNames, args, nameAssocs.toMap, Set ())
292
+
293
+ def handlePositional (pnames : List [Name ], args : List [Trees .Tree [T ]]): List [Trees .Tree [T ]] =
294
+ args match {
295
+ case (arg : NamedArg ) :: _ =>
296
+ val nameAssocs = for (arg @ NamedArg (name, _) <- args) yield (name, arg)
297
+ handleNamed(pnames, args, nameAssocs.toMap, Set ())
298
+ case arg :: args1 => arg :: handlePositional(pnames.tail, args1)
299
+ case Nil => Nil
300
+ }
301
+
302
+ handlePositional(methodType.paramNames, args)
294
303
}
295
304
296
305
/** Splice new method reference into existing application */
0 commit comments