@@ -1719,7 +1719,7 @@ object desugar {
17191719 */
17201720 def tuple (tree : Tuple , pt : Type )(using Context ): Tree =
17211721 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 )
17231723 val elemValues = elems.mapConserve(stripNamedArg)
17241724 val tup =
17251725 val arity = elems.length
@@ -1759,25 +1759,31 @@ object desugar {
17591759 * - If `elems` are named pattern elements, rearrange them to match `pt`.
17601760 * This requires all names in `elems` to be also present in `pt`.
17611761 */
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 ] =
17631763
17641764 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
17811787
17821788 elems match
17831789 case (first @ NamedArg (_, _)) :: _ => reorderedNamedArgs(first.span.startPos)
0 commit comments