@@ -1570,25 +1570,26 @@ trait Applications extends Compatibility {
1570
1570
def trySelectUnapply (qual : untpd.Tree )(fallBack : (Tree , TyperState ) => Tree ): Tree = {
1571
1571
// try first for non-overloaded, then for overloaded occurrences
1572
1572
def tryWithName (name : TermName )(fallBack : (Tree , TyperState ) => Tree )(using Context ): Tree =
1573
- // `true` if there are type parameters not followed by explicit term parameters.
1574
- def hasTrailingTypeParams (paramss : List [List [Symbol ]], trailingTypeParams : Boolean ): Boolean =
1575
- paramss match
1576
- case params :: paramss =>
1577
- val isTrailingTypeParams =
1573
+ // `true` if there are no type parameters following the first explicit term parameter.
1574
+ def hasOnlyLeadingTypeParams (fun : Symbol ): Boolean =
1575
+ def checkForIt (paramss : List [List [Symbol ]], leading : Int ): Boolean =
1576
+ inline def isLeading = leading > 0
1577
+ paramss match
1578
+ case params :: paramss =>
1578
1579
params match
1579
- case param :: _ if param.isType => true
1580
- case param :: _ if param.isTerm && ! param.isOneOf(GivenOrImplicit ) => false
1581
- case _ => trailingTypeParams
1582
- hasTrailingTypeParams(paramss, isTrailingTypeParams)
1583
- case nil => trailingTypeParams
1580
+ case param :: _ if param.isType && ! isLeading => false
1581
+ case param :: _ if param.isTerm && ! param.isOneOf(GivenOrImplicit ) => checkForIt(paramss, leading - 1 )
1582
+ case _ => checkForIt(paramss, leading)
1583
+ case nil => true
1584
+ checkForIt(fun.paramSymss, leading = if fun.is( Extension ) then 2 else 1 )
1584
1585
1585
1586
def tryWithProto (qual : untpd.Tree , targs : List [Tree ], pt : Type )(using Context ) =
1586
1587
val proto = UnapplyFunProto (pt, this )
1587
1588
val unapp = untpd.Select (qual, name)
1588
1589
val result =
1589
1590
if targs.isEmpty then typedExpr(unapp, proto)
1590
1591
else typedExpr(unapp, PolyProto (targs, proto)).appliedToTypeTrees(targs)
1591
- if result.symbol.exists && hasTrailingTypeParams (result.symbol.paramSymss, trailingTypeParams = false ) then
1592
+ if result.symbol.exists && ! hasOnlyLeadingTypeParams (result.symbol) then
1592
1593
// We don't accept `unapply` or `unapplySeq` methods with type
1593
1594
// parameters after the last explicit term parameter because we
1594
1595
// can't encode them: `UnApply` nodes cannot take type paremeters.
0 commit comments