Skip to content

Commit 322ac98

Browse files
committed
Improved logic & error message.
1 parent efdd41e commit 322ac98

File tree

4 files changed

+16
-13
lines changed

4 files changed

+16
-13
lines changed

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,13 +1762,14 @@ object desugar {
17621762
def adaptPatternArgs(elems: List[Tree], pt: Type)(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-
if selNames.isEmpty then {
1769-
report.error(NamedElementsNotDefined(pt), elems.head.srcPos)
1765+
val isCaseClass = pt.classSymbol.is(CaseClass) && !defn.isTupleClass(pt.classSymbol)
1766+
if !pt.isNamedTupleType && !isCaseClass then
1767+
report.error(NamedPatternNotApplicable(pt), elems.head.srcPos)
17701768
Nil
1771-
} else {
1769+
else
1770+
var selNames = pt.namedTupleElementTypes(false).map(_(0))
1771+
if selNames.isEmpty && isCaseClass then
1772+
selNames = pt.classSymbol.caseAccessors.map(_.name.asTermName)
17721773
val nameToIdx = selNames.zipWithIndex.toMap
17731774
val reordered = Array.fill[untpd.Tree](selNames.length):
17741775
untpd.Ident(nme.WILDCARD).withSpan(wildcardSpan)
@@ -1782,7 +1783,7 @@ object desugar {
17821783
case _ =>
17831784
report.error(em"No element named `$name` is defined in selector type $pt", arg.srcPos)
17841785
reordered.toList
1785-
}
1786+
end if
17861787

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

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +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
231+
case NamedPatternNotApplicableID // errorNumber: 215
232232

233233
def errorNumber = ordinal - 1
234234

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3523,10 +3523,8 @@ final class IllegalContextBounds(using Context) extends SyntaxMsg(IllegalContext
35233523

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

3526-
final class NamedElementsNotDefined(selectorType: Type)(using Context) extends PatternMatchMsg(NamedElementsNotDefinedID):
3526+
final class NamedPatternNotApplicable(selectorType: Type)(using Context) extends PatternMatchMsg(NamedPatternNotApplicableID):
35273527
override protected def msg(using Context): String =
3528-
i"Selector type $selectorType does not define any named elements"
3528+
i"Named patterns cannot be used with $selectorType, because it is not a named tuple or case class"
35293529

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
3530+
override protected def explain(using Context): String = ""

tests/neg/named-tuples.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,7 @@ object Test:
5858
// conversion to (name: Int, age: Int). This one would be harder to guard against.
5959

6060
val typo: (name: ?, age: ?) = (name = "he", ag = 1) // error
61+
62+
val unnamedTuple: (String, Int) = ("text", 10)
63+
unnamedTuple match
64+
case (name = n, age = a) => // error

0 commit comments

Comments
 (0)