@@ -1719,7 +1719,7 @@ object desugar {
1719
1719
*/
1720
1720
def tuple (tree : Tuple , pt : Type )(using Context ): Tree =
1721
1721
var elems = checkWellFormedTupleElems(tree.trees)
1722
- if ctx.mode.is(Mode .Pattern ) then elems = adaptPatternArgs(elems, pt)
1722
+ if ctx.mode.is(Mode .Pattern ) then elems = adaptPatternArgs(elems, pt, tree.srcPos )
1723
1723
val elemValues = elems.mapConserve(stripNamedArg)
1724
1724
val tup =
1725
1725
val arity = elems.length
@@ -1759,25 +1759,31 @@ object desugar {
1759
1759
* - If `elems` are named pattern elements, rearrange them to match `pt`.
1760
1760
* This requires all names in `elems` to be also present in `pt`.
1761
1761
*/
1762
- def adaptPatternArgs (elems : List [Tree ], pt : Type )(using Context ): List [Tree ] =
1762
+ def adaptPatternArgs (elems : List [Tree ], pt : Type , pos : SrcPos )(using Context ): List [Tree ] =
1763
1763
1764
1764
def reorderedNamedArgs (wildcardSpan : Span ): List [untpd.Tree ] =
1765
- var selNames = pt.namedTupleElementTypes(false ).map(_(0 ))
1766
- if selNames.isEmpty && pt.classSymbol.is(CaseClass ) then
1767
- selNames = pt.classSymbol.caseAccessors.map(_.name.asTermName)
1768
- val nameToIdx = selNames.zipWithIndex.toMap
1769
- val reordered = Array .fill[untpd.Tree ](selNames.length):
1770
- untpd.Ident (nme.WILDCARD ).withSpan(wildcardSpan)
1771
- for case arg @ NamedArg (name : TermName , _) <- elems do
1772
- nameToIdx.get(name) match
1773
- case Some (idx) =>
1774
- if reordered(idx).isInstanceOf [Ident ] then
1775
- reordered(idx) = arg
1776
- else
1777
- report.error(em " Duplicate named pattern " , arg.srcPos)
1778
- case _ =>
1779
- report.error(em " No element named ` $name` is defined in selector type $pt" , arg.srcPos)
1780
- reordered.toList
1765
+ inline def isCaseClass = pt.classSymbol.is(CaseClass ) && ! defn.isTupleClass(pt.classSymbol)
1766
+ if ! isCaseClass && ! pt.isNamedTupleType then
1767
+ report.error(NamedPatternNotApplicable (pt), pos)
1768
+ Nil
1769
+ else
1770
+ var selNames = pt.namedTupleElementTypes(false ).map(_(0 ))
1771
+ if isCaseClass && selNames.isEmpty then
1772
+ selNames = pt.classSymbol.caseAccessors.map(_.name.asTermName)
1773
+ val nameToIdx = selNames.zipWithIndex.toMap
1774
+ val reordered = Array .fill[untpd.Tree ](selNames.length):
1775
+ untpd.Ident (nme.WILDCARD ).withSpan(wildcardSpan)
1776
+ for case arg @ NamedArg (name : TermName , _) <- elems do
1777
+ nameToIdx.get(name) match
1778
+ case Some (idx) =>
1779
+ if reordered(idx).isInstanceOf [Ident ] then
1780
+ reordered(idx) = arg
1781
+ else
1782
+ report.error(em " Duplicate named pattern " , arg.srcPos)
1783
+ case _ =>
1784
+ report.error(em " No element named ` $name` is defined in selector type $pt" , arg.srcPos)
1785
+ reordered.toList
1786
+ end if
1781
1787
1782
1788
elems match
1783
1789
case (first @ NamedArg (_, _)) :: _ => reorderedNamedArgs(first.span.startPos)
0 commit comments