Skip to content

Commit efdd41e

Browse files
committed
Our progress from the scala-compiler spree:
- Added an error message when named matching was tried, while element is not a case class or named tuple.
1 parent 49286a9 commit efdd41e

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,19 +1765,24 @@ object desugar {
17651765
var selNames = pt.namedTupleElementTypes(false).map(_(0))
17661766
if selNames.isEmpty && pt.classSymbol.is(CaseClass) then
17671767
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
1768+
if selNames.isEmpty then {
1769+
report.error(NamedElementsNotDefined(pt), elems.head.srcPos)
1770+
Nil
1771+
} else {
1772+
val nameToIdx = selNames.zipWithIndex.toMap
1773+
val reordered = Array.fill[untpd.Tree](selNames.length):
1774+
untpd.Ident(nme.WILDCARD).withSpan(wildcardSpan)
1775+
for case arg@NamedArg(name: TermName, _) <- elems do
1776+
nameToIdx.get(name) match
1777+
case Some(idx) =>
1778+
if reordered(idx).isInstanceOf[Ident] then
1779+
reordered(idx) = arg
1780+
else
1781+
report.error(em"Duplicate named pattern", arg.srcPos)
1782+
case _ =>
1783+
report.error(em"No element named `$name` is defined in selector type $pt", arg.srcPos)
1784+
reordered.toList
1785+
}
17811786

17821787
elems match
17831788
case (first @ NamedArg(_, _)) :: _ => reorderedNamedArgs(first.span.startPos)

compiler/src/dotty/tools/dotc/reporting/ErrorMessageID.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ enum ErrorMessageID(val isActive: Boolean = true) extends java.lang.Enum[ErrorMe
228228
case OnlyFullyDependentAppliedConstructorTypeID // errorNumber: 212
229229
case PointlessAppliedConstructorTypeID // errorNumber: 213
230230
case IllegalContextBoundsID // errorNumber: 214
231+
case NamedElementsNotDefinedID // errorNumber: 215
231232

232233
def errorNumber = ordinal - 1
233234

compiler/src/dotty/tools/dotc/reporting/messages.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3523,4 +3523,10 @@ final class IllegalContextBounds(using Context) extends SyntaxMsg(IllegalContext
35233523

35243524
override protected def explain(using Context): String = ""
35253525

3526-
end IllegalContextBounds
3526+
final class NamedElementsNotDefined(selectorType: Type)(using Context) extends PatternMatchMsg(NamedElementsNotDefinedID):
3527+
override protected def msg(using Context): String =
3528+
i"Selector type $selectorType does not define any named elements"
3529+
3530+
override protected def explain(using Context): String =
3531+
i"""|$selectorType is not a valid selector type for the use with named patterns.
3532+
|Only named tuples and case classes can be used with named patterns.""".stripMargin

0 commit comments

Comments
 (0)