File tree 4 files changed +43
-2
lines changed
test/dotty/tools/dotc/reporting
4 files changed +43
-2
lines changed Original file line number Diff line number Diff line change @@ -459,7 +459,7 @@ object desugar {
459
459
ListOfNil
460
460
}
461
461
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)
463
463
ListOfNil
464
464
}
465
465
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] {
151
151
IllegalCyclicTypeReferenceID ,
152
152
MissingTypeParameterInTypeAppID ,
153
153
ImplicitTypesCanOnlyBeFunctionTypesID ,
154
- ErasedTypesCanOnlyBeFunctionTypesID
154
+ ErasedTypesCanOnlyBeFunctionTypesID ,
155
+ CaseClassMissingNonImplicitParamListID
155
156
156
157
def errorNumber = ordinal - 2
157
158
}
Original file line number Diff line number Diff line change @@ -2395,4 +2395,16 @@ object messages {
2395
2395
val msg : String = " Types with erased keyword can only be function types `erased (...) => ...`"
2396
2396
val explanation : String = " "
2397
2397
}
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
+ }
2398
2410
}
Original file line number Diff line number Diff line change @@ -1710,4 +1710,32 @@ class ErrorMessagesTests extends ErrorMessagesTest {
1710
1710
val ErasedTypesCanOnlyBeFunctionTypes () :: Nil = messages
1711
1711
assertEquals(" Types with erased keyword can only be function types `erased (...) => ...`" , messages.head.msg)
1712
1712
}
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
+ }
1713
1741
}
You can’t perform that action at this time.
0 commit comments