From 37b705e87ddb85df05e704bb89dc5aee7c43acb9 Mon Sep 17 00:00:00 2001 From: Saloni Vithalani Date: Sat, 25 Aug 2018 17:22:06 +0530 Subject: [PATCH 1/3] #5008: Add enum example in documentation and a test for 'case class cannot extend enum' --- .../dotc/reporting/ErrorMessagesTests.scala | 24 +++++++++++++++ docs/docs/reference/enums/enums.md | 29 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala index 1af8513e6739..e5e1e5aae3b8 100644 --- a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala +++ b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala @@ -19,6 +19,30 @@ class ErrorMessagesTests extends ErrorMessagesTest { checkMessagesAfter(FrontEnd.name)("""class Foo""") .expectNoErrors + @Test def caseClassExtendsEnum = + checkMessagesAfter(RefChecks.name) { + """ + | enum Foo {} + | case class Bar() extends Foo + """.stripMargin + } + .expect { (ictx, messages) ⇒ + implicit val ctx: Context = ictx + assertMessageCount(1, messages) + val errorMsg = messages.head + assertEquals("normal case class Bar in package cannot extend an enum", errorMsg.msg) + } + + // FIXME + @Test def enumExtendsAnothorEnum = + checkMessagesAfter(RefChecks.name) { + """ + | enum Foo {} + | enum Bar extends Foo {} + """.stripMargin + } + .expectNoErrors + @Test def typeMismatch = checkMessagesAfter(FrontEnd.name) { """ diff --git a/docs/docs/reference/enums/enums.md b/docs/docs/reference/enums/enums.md index 3868961e3a1f..17a7bb1aa441 100644 --- a/docs/docs/reference/enums/enums.md +++ b/docs/docs/reference/enums/enums.md @@ -88,6 +88,35 @@ object Planet { println(s"Your weight on $p is ${p.surfaceWeight(mass)}") } } +``` +### A specific use case of enum + +Two enums can be combined into a different type as shown below: + +```scala + +trait Animal +object Animal { + def enumValues: Iterable[Animal] = Dog.enumValues ++ Cat.enumValues + def enumValueNamed = Dog.enumValueNamed ++ Cat.enumValueNamed +} + +enum Dog extends Animal { + case GermanShepherd, Labrador, Boxer +} + +enum Cat extends Animal { + case PersianCat, Ragdoll, ScottishFold +} + +object Main { + def main(args: Array[String]): Unit = { + val values: Iterable[Animal] = Animal.enumValues + val boxer_dog: Animal = Animal.enumValueNamed("Boxer") + val ragdoll_cat: Animal = Animal.enumValueNamed("Ragdoll") + } +} + ``` ### Implementation From 97f5dc6076f2411d8ccbb75a887f0c9e5bbafcb6 Mon Sep 17 00:00:00 2001 From: Saloni Vithalani Date: Sat, 25 Aug 2018 18:54:36 +0530 Subject: [PATCH 2/3] Update review changes --- .../tools/dotc/reporting/ErrorMessagesTests.scala | 14 ++------------ tests/pending/neg/i5008 | 2 ++ 2 files changed, 4 insertions(+), 12 deletions(-) create mode 100644 tests/pending/neg/i5008 diff --git a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala index e5e1e5aae3b8..8678a6b2a94b 100644 --- a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala +++ b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala @@ -22,8 +22,8 @@ class ErrorMessagesTests extends ErrorMessagesTest { @Test def caseClassExtendsEnum = checkMessagesAfter(RefChecks.name) { """ - | enum Foo {} - | case class Bar() extends Foo + |enum Foo {} + |case class Bar() extends Foo """.stripMargin } .expect { (ictx, messages) ⇒ @@ -33,16 +33,6 @@ class ErrorMessagesTests extends ErrorMessagesTest { assertEquals("normal case class Bar in package cannot extend an enum", errorMsg.msg) } - // FIXME - @Test def enumExtendsAnothorEnum = - checkMessagesAfter(RefChecks.name) { - """ - | enum Foo {} - | enum Bar extends Foo {} - """.stripMargin - } - .expectNoErrors - @Test def typeMismatch = checkMessagesAfter(FrontEnd.name) { """ diff --git a/tests/pending/neg/i5008 b/tests/pending/neg/i5008 new file mode 100644 index 000000000000..b543c7bfcb11 --- /dev/null +++ b/tests/pending/neg/i5008 @@ -0,0 +1,2 @@ +enum Foo {} +enum Bar extends Foo {} // error \ No newline at end of file From 843e52a89f699ce5de4a55345f046cad561c145d Mon Sep 17 00:00:00 2001 From: Saloni Vithalani Date: Sat, 25 Aug 2018 19:06:03 +0530 Subject: [PATCH 3/3] Add newline at the end of file --- tests/pending/neg/i5008 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pending/neg/i5008 b/tests/pending/neg/i5008 index b543c7bfcb11..2dc75e6b199c 100644 --- a/tests/pending/neg/i5008 +++ b/tests/pending/neg/i5008 @@ -1,2 +1,2 @@ enum Foo {} -enum Bar extends Foo {} // error \ No newline at end of file +enum Bar extends Foo {} // error