From 13c1f844566f587e0b7261f730862b8e4a3fb4be Mon Sep 17 00:00:00 2001 From: marc Date: Fri, 31 Mar 2017 08:43:50 -0700 Subject: [PATCH] make record unapply compatible with exhaustiveness checking --- .../courier/generator/RecordGeneratorTest.scala | 14 ++++++++++++++ .../courier/templates/RecordClass.scala.txt | 9 ++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/scala/generator-test/src/test/scala/org/coursera/courier/generator/RecordGeneratorTest.scala b/scala/generator-test/src/test/scala/org/coursera/courier/generator/RecordGeneratorTest.scala index 1901b43a..6bd0492b 100644 --- a/scala/generator-test/src/test/scala/org/coursera/courier/generator/RecordGeneratorTest.scala +++ b/scala/generator-test/src/test/scala/org/coursera/courier/generator/RecordGeneratorTest.scala @@ -26,6 +26,7 @@ import org.coursera.records.test.Empty import org.coursera.records.test.Empty2 import org.coursera.records.test.InlineOptionalRecord import org.coursera.records.test.InlineRecord +import org.coursera.records.test.Message import org.coursera.records.test.Simple import org.coursera.records.test.SimpleMap import org.coursera.records.test.WithComplexTypeDefaults @@ -470,4 +471,17 @@ class RecordGeneratorTest extends GeneratorTest with SchemaFixtures { // Fortunately, nothing should depend solely on hashCode() for determining whether two // records match. } + + @Test + def testUnapplyReturnsSomeType(): Unit = { + // If the unapply method returns Option[X] instead of Some[X], then the scala compiler turns + // off match exhaustivity checking for match statements that use the unapply method. This test + // This test asserts that the unapply method returns Some[X], so that we get better + // exhaustivity checking for match statements involving courier records. + assertCompiles(""" + val record = Message("hello", "hello world") + Message.unapply(record): Some[(String, String)] + """) + } + } diff --git a/scala/generator/src/main/twirl/org/coursera/courier/templates/RecordClass.scala.txt b/scala/generator/src/main/twirl/org/coursera/courier/templates/RecordClass.scala.txt index 4cc3a8bd..5490d3cd 100644 --- a/scala/generator/src/main/twirl/org/coursera/courier/templates/RecordClass.scala.txt +++ b/scala/generator/src/main/twirl/org/coursera/courier/templates/RecordClass.scala.txt @@ -203,13 +203,8 @@ object @(record.scalaType) extends RecordCompanion[@(record.scalaType)] { def unapply(record: @(record.scalaType)): Boolean = true } case i if i <= 22 => { @* Scala tuples only exist up to Tuple22. *@ - def unapply(record: @(record.scalaType)): Option[(@(record.fieldsAsTypeParams))] = { - try { - Some((@(record.prefixedFieldParams("record.")))) - } catch { - case cast: TemplateOutputCastException => None - case notPresent: RequiredFieldNotPresentException => None - } + def unapply(record: @(record.scalaType)): Some[(@(record.fieldsAsTypeParams))] = { + Some((@(record.prefixedFieldParams("record.")))) } } case _ => {