Skip to content

Commit 4b9333a

Browse files
Merge pull request #7729 from EpamLifeSciencesTeam/issue-1589-error-mes-case-class-missing-non-implicit-param-list
Add detailed message for case class missing non-implicit parameter list
2 parents 3e08142 + d3cf3a3 commit 4b9333a

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
@@ -151,7 +151,8 @@ enum ErrorMessageID extends java.lang.Enum[ErrorMessageID] {
151151
IllegalCyclicTypeReferenceID,
152152
MissingTypeParameterInTypeAppID,
153153
ImplicitTypesCanOnlyBeFunctionTypesID,
154-
ErasedTypesCanOnlyBeFunctionTypesID
154+
ErasedTypesCanOnlyBeFunctionTypesID,
155+
CaseClassMissingNonImplicitParamListID
155156

156157
def errorNumber = ordinal - 2
157158
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,4 +2395,16 @@ object messages {
23952395
val msg: String = "Types with erased keyword can only be function types `erased (...) => ...`"
23962396
val explanation: String = ""
23972397
}
2398+
2399+
case class CaseClassMissingNonImplicitParamList(cdef: untpd.TypeDef)(implicit ctx: Context)
2400+
extends Message(CaseClassMissingNonImplicitParamListID) {
2401+
val kind: String = "Syntax"
2402+
val msg: String =
2403+
em"""|A ${hl("case class")} must have at least one non-implicit parameter list"""
2404+
2405+
val explanation: String =
2406+
em"""|${cdef.name} must have at least one non-implicit parameter list,
2407+
| if you're aiming to have a case class parametrized only by implicit ones, you should
2408+
| add an explicit ${hl("()")} as a parameter list to ${cdef.name}.""".stripMargin
2409+
}
23982410
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1710,4 +1710,32 @@ class ErrorMessagesTests extends ErrorMessagesTest {
17101710
val ErasedTypesCanOnlyBeFunctionTypes() :: Nil = messages
17111711
assertEquals("Types with erased keyword can only be function types `erased (...) => ...`", messages.head.msg)
17121712
}
1713+
1714+
@Test def caseClassMissingParamListSuccessful =
1715+
checkMessagesAfter(FrontEnd.name) ("case class Test()")
1716+
.expectNoErrors
1717+
1718+
@Test def caseClassMissingParamListFailed =
1719+
checkMessagesAfter(FrontEnd.name) ("case class Test")
1720+
.expect {
1721+
(ictx, messages) =>
1722+
implicit val ctx: Context = ictx
1723+
assertMessageCount(1, messages)
1724+
val CaseClassMissingParamList(tpe) :: Nil = messages
1725+
assertEquals("A case class must have at least one parameter list", messages.head.msg)
1726+
}
1727+
1728+
@Test def caseClassMissingNonImplicitParamListSuccessful =
1729+
checkMessagesAfter(FrontEnd.name) ("case class Test()(given foo: String)")
1730+
.expectNoErrors
1731+
1732+
@Test def caseClassMissingNonImplicitParamListFailed =
1733+
checkMessagesAfter(FrontEnd.name) ("case class Test(given foo: String)")
1734+
.expect {
1735+
(ictx, messages) =>
1736+
implicit val ctx: Context = ictx
1737+
assertMessageCount(1, messages)
1738+
val CaseClassMissingNonImplicitParamList(tpe) :: Nil = messages
1739+
assertEquals("A case class must have at least one non-implicit parameter list", messages.head.msg)
1740+
}
17131741
}

0 commit comments

Comments
 (0)