@@ -604,6 +604,21 @@ trait Applications extends Compatibility {
604
604
605
605
inline def tailOf [A ](list : List [A ]): List [A ] = if list.isEmpty then list else list.tail // list.drop(1)
606
606
607
+ def hasDeprecatedName (pname : Name , other : Name , t : Trees .Tree [T ]): Boolean = ! ctx.isAfterTyper &&
608
+ methRef.symbol.paramSymss.flatten.find(_.name == pname).flatMap(_.getAnnotation(defn.DeprecatedNameAnnot )).match
609
+ case Some (annot) =>
610
+ val name = annot.argumentConstantString(0 )
611
+ val version = annot.argumentConstantString(1 ).filter(! _.isEmpty)
612
+ val since = version.map(v => s " (since $v) " ).getOrElse(" " )
613
+ name.map(_.toTermName) match
614
+ case Some (`other`) =>
615
+ report.deprecationWarning(em " the parameter name $other is deprecated $since: use $pname instead " , t.srcPos)
616
+ case Some (`pname`) | None =>
617
+ report.deprecationWarning(em " naming parameter $pname is deprecated $since" , t.srcPos)
618
+ case _ =>
619
+ true
620
+ case _ => false
621
+
607
622
/** Reorder the suffix of named args per a list of required names.
608
623
*
609
624
* @param pnames The list of parameter names that are missing arguments
@@ -619,25 +634,32 @@ trait Applications extends Compatibility {
619
634
*/
620
635
def handleNamed (pnames : List [Name ], args : List [Trees .Tree [T ]],
621
636
nameToArg : Map [Name , Trees .NamedArg [T ]], toDrop : Set [Name ],
622
- missingArgs : Boolean ): List [Trees .Tree [T ]] = pnames match
623
- case pname :: pnames if nameToArg.contains(pname) =>
624
- // there is a named argument for this parameter; pick it
625
- nameToArg(pname) :: handleNamed(pnames, args, nameToArg - pname, toDrop + pname, missingArgs)
637
+ missingArgs : Boolean ): List [Trees .Tree [T ]] =
638
+ pnames match
639
+ case pname :: pnames if nameToArg.contains(pname) => // use the named argument for this parameter
640
+ val arg = nameToArg(pname)
641
+ hasDeprecatedName(pname, nme.NO_NAME , arg)
642
+ arg :: handleNamed(pnames, args, nameToArg - pname, toDrop + pname, missingArgs)
626
643
case _ =>
627
644
args match
628
- case (arg @ NamedArg (aname, _)) :: args1 =>
629
- if toDrop.contains(aname) // named argument is already passed
630
- then handleNamed(pnames, args1, nameToArg, toDrop - aname, missingArgs)
631
- else if nameToArg.contains(aname) && pnames.nonEmpty // argument is missing, pass an empty tree
632
- then genericEmptyTree :: handleNamed(pnames.tail, args, nameToArg, toDrop, missingArgs = true )
645
+ case allArgs @ (arg @ NamedArg (aname, _)) :: args =>
646
+ if toDrop.contains(aname) then // named argument was already picked
647
+ handleNamed(pnames, args, nameToArg, toDrop - aname, missingArgs)
648
+ else if pnames.nonEmpty && nameToArg.contains(aname) then
649
+ val pname = pnames.head
650
+ if hasDeprecatedName(pname, aname, arg) then // name was deprecated alt, so try again with canonical name
651
+ val parg = cpy.NamedArg (arg)(pname, arg.arg).asInstanceOf [Trees .NamedArg [T ]]
652
+ handleNamed(pnames, parg :: args, nameToArg.removed(aname).updated(pname, parg), toDrop, missingArgs)
653
+ else // argument for pname is missing, pass an empty tree
654
+ genericEmptyTree :: handleNamed(pnames.tail, allArgs, nameToArg, toDrop, missingArgs = true )
633
655
else // name not (or no longer) available for named arg
634
656
def msg =
635
657
if methodType.paramNames.contains(aname) then
636
658
em " parameter $aname of $methString is already instantiated "
637
659
else
638
660
em " $methString does not have a parameter $aname"
639
661
fail(msg, arg.asInstanceOf [Arg ])
640
- arg :: handleNamed(tailOf(pnames), args1 , nameToArg, toDrop, missingArgs)
662
+ arg :: handleNamed(tailOf(pnames), args , nameToArg, toDrop, missingArgs)
641
663
case arg :: args =>
642
664
if toDrop.nonEmpty || missingArgs then
643
665
report.error(i " positional after named argument " , arg.srcPos)
@@ -649,8 +671,10 @@ trait Applications extends Compatibility {
649
671
/** Skip prefix of positional args, then handleNamed */
650
672
def handlePositional (pnames : List [Name ], args : List [Trees .Tree [T ]]): List [Trees .Tree [T ]] =
651
673
args match
674
+ case (arg @ NamedArg (name, _)) :: args if ! pnames.isEmpty && pnames.head == name =>
675
+ hasDeprecatedName(name, nme.NO_NAME , arg)
676
+ arg :: handlePositional(pnames.tail, args)
652
677
case (_ : NamedArg ) :: _ =>
653
- // val nameAssocs = for case arg @ NamedArg(name, _) <- args yield (name, arg)
654
678
val nameAssocs = args.collect { case arg @ NamedArg (name, _) => name -> arg }
655
679
handleNamed(pnames, args, nameAssocs.toMap, toDrop = Set .empty, missingArgs = false )
656
680
case arg :: args =>
0 commit comments