Skip to content

Commit c560174

Browse files
author
Nadezhda Balashova
committed
Add detailed message for case class missing non-implicit parameter list
1 parent 193f7de commit c560174

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
@@ -459,7 +459,7 @@ object desugar {
459459
ListOfNil
460460
}
461461
else if (isCaseClass && originalVparamss.head.exists(_.mods.isOneOf(GivenOrImplicit))) {
462-
ctx.error("Case classes should have a non-implicit parameter list", namePos)
462+
ctx.error(CaseClassMissingNonImplicitParamList(cdef), namePos)
463463
ListOfNil
464464
}
465465
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
@@ -149,7 +149,8 @@ enum ErrorMessageID extends java.lang.Enum[ErrorMessageID] {
149149
TraitParameterUsedAsParentPrefixID,
150150
UnknownNamedEnclosingClassOrObjectID,
151151
IllegalCyclicTypeReferenceID,
152-
MissingTypeParameterInTypeAppID
152+
MissingTypeParameterInTypeAppID,
153+
CaseClassMissingNonImplicitParamListID
153154

154155
def errorNumber = ordinal - 2
155156
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2381,4 +2381,16 @@ object messages {
23812381
val msg: String = i"illegal cyclic type reference: ${where} ${hl(lastChecked.show)} of $sym refers back to the type itself"
23822382
val explanation: String = ""
23832383
}
2384+
2385+
case class CaseClassMissingNonImplicitParamList(cdef: untpd.TypeDef)(implicit ctx: Context)
2386+
extends Message(CaseClassMissingNonImplicitParamListID) {
2387+
val kind: String = "Syntax"
2388+
val msg: String =
2389+
em"""|A ${hl("case class")} must have at least one non-implicit parameter list"""
2390+
2391+
val explanation: String =
2392+
em"""|${cdef.name} must have at least one non-implicit parameter list,
2393+
| if you're aiming to have a case class parametrized only by implicit ones, you should
2394+
| add an explicit ${hl("()")} as a parameter list to ${cdef.name}.""".stripMargin
2395+
}
23842396
}

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

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

0 commit comments

Comments
 (0)