File tree Expand file tree Collapse file tree 4 files changed +43
-2
lines changed
test/dotty/tools/dotc/reporting Expand file tree Collapse file tree 4 files changed +43
-2
lines changed Original file line number Diff line number Diff 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 ))
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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}
You can’t perform that action at this time.
0 commit comments