Skip to content

Commit 340ef80

Browse files
author
Nadezhda Balashova
committed
Add detailed message for case class missing non-implicit parameter list
1 parent 4c76479 commit 340ef80

File tree

4 files changed

+43
-2
lines changed

4 files changed

+43
-2
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ object desugar {
454454
ListOfNil
455455
}
456456
else if (isCaseClass && originalVparamss.head.exists(_.mods.isOneOf(GivenOrImplicit))) {
457-
ctx.error("Case classes should have a non-implicit parameter list", namePos)
457+
ctx.error(CaseClassMissingNonImplicitParamList(cdef), namePos)
458458
ListOfNil
459459
}
460460
else originalVparamss.nestedMap(toDefParam(_, keepAnnotations = false))

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ enum ErrorMessageID extends java.lang.Enum[ErrorMessageID] {
148148
IllegalSuperAccessorID,
149149
TraitParameterUsedAsParentPrefixID,
150150
UnknownNamedEnclosingClassOrObjectID,
151-
IllegalCyclicTypeReferenceID
151+
IllegalCyclicTypeReferenceID,
152+
CaseClassMissingNonImplicitParamListID
152153

153154
def errorNumber = ordinal - 2
154155
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,4 +2396,16 @@ object messages {
23962396
val msg: String = i"illegal cyclic type reference: ${where} ${hl(lastChecked.show)} of $sym refers back to the type itself"
23972397
val explanation: String = ""
23982398
}
2399+
2400+
case class CaseClassMissingNonImplicitParamList(cdef: untpd.TypeDef)(implicit ctx: Context)
2401+
extends Message(CaseClassMissingNonImplicitParamListID) {
2402+
val kind: String = "Syntax"
2403+
val msg: String =
2404+
em"""|A ${hl("case class")} must have at least one non-implicit parameter list"""
2405+
2406+
val explanation: String =
2407+
em"""|${cdef.name} must have at least one non-implicit parameter list,
2408+
| if you're aiming to have a case class parametrized only by implicit ones, you should
2409+
| add an explicit ${hl("()")} as a parameter list to ${cdef.name}.""".stripMargin
2410+
}
23992411
}

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,4 +1687,32 @@ class ErrorMessagesTests extends ErrorMessagesTest {
16871687
assertEquals("alias", where)
16881688
assertEquals("List[X]", lastChecked.show)
16891689
}
1690+
1691+
@Test def caseClassMissingParamListSuccessful =
1692+
checkMessagesAfter(FrontEnd.name) ("case class Test()")
1693+
.expectNoErrors
1694+
1695+
@Test def caseClassMissingParamListFailed =
1696+
checkMessagesAfter(FrontEnd.name) ("case class Test")
1697+
.expect {
1698+
(ictx, messages) =>
1699+
implicit val ctx: Context = ictx
1700+
assertMessageCount(1, messages)
1701+
val CaseClassMissingParamList(tpe) :: Nil = messages
1702+
assertEquals("A case class must have at least one parameter list", messages.head.msg)
1703+
}
1704+
1705+
@Test def caseClassMissingNonImplicitParamListSuccessful =
1706+
checkMessagesAfter(FrontEnd.name) ("case class Test()(given foo: String)")
1707+
.expectNoErrors
1708+
1709+
@Test def caseClassMissingNonImplicitParamListFailed =
1710+
checkMessagesAfter(FrontEnd.name) ("case class Test(given foo: String)")
1711+
.expect {
1712+
(ictx, messages) =>
1713+
implicit val ctx: Context = ictx
1714+
assertMessageCount(1, messages)
1715+
val CaseClassMissingNonImplicitParamList(tpe) :: Nil = messages
1716+
assertEquals("A case class must have at least one non-implicit parameter list", messages.head.msg)
1717+
}
16901718
}

0 commit comments

Comments
 (0)