From de8fe6e2a19f8f9d7e3e37e1d63210302cd58f5f Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Wed, 9 Nov 2016 14:02:18 +0000 Subject: [PATCH] Add multi-line support to toString support --- library/src/main/scala/CodecCodeGen.scala | 2 +- library/src/main/scala/JavaCodeGen.scala | 6 +++--- library/src/main/scala/ScalaCodeGen.scala | 6 +++--- library/src/main/scala/SchemaData.scala | 8 ++++---- library/src/test/scala/SchemaSpec.scala | 16 ++++++++-------- notes/0.2.8/multiline-toString.markdown | 7 +++++++ 6 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 notes/0.2.8/multiline-toString.markdown diff --git a/library/src/main/scala/CodecCodeGen.scala b/library/src/main/scala/CodecCodeGen.scala index 6125bf6..26124c9 100644 --- a/library/src/main/scala/CodecCodeGen.scala +++ b/library/src/main/scala/CodecCodeGen.scala @@ -284,7 +284,7 @@ class CodecCodeGen(codecParents: List[String], s"""${genPackage(s)} |trait $name $parents |object $name extends $name""".stripMargin - val syntheticDefinition = Interface(name, "Scala", None, VersionNumber("0.0.0"), Nil, Nil, Nil, Nil, Nil, None, Nil, Nil, Nil) + val syntheticDefinition = Interface(name, "Scala", None, VersionNumber("0.0.0"), Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil) ListMap(new File(genFile(s, syntheticDefinition).getParentFile, s"$name.scala") -> code) } diff --git a/library/src/main/scala/JavaCodeGen.scala b/library/src/main/scala/JavaCodeGen.scala index 4c34e88..91223e4 100644 --- a/library/src/main/scala/JavaCodeGen.scala +++ b/library/src/main/scala/JavaCodeGen.scala @@ -250,8 +250,8 @@ class JavaCodeGen(lazyInterface: String, optionalInterface: String) extends Code |}""".stripMargin } - private def genToString(cl: ClassLike, superFields: List[Field], toString: Option[String]) = { - val body = toString getOrElse { + private def genToString(cl: ClassLike, superFields: List[Field], toString: List[String]) = { + val body = if (toString.isEmpty) { val allFields = superFields ++ cl.fields if (allFields exists (_.tpe.lzy)) { "return super.toString(); // Avoid evaluating lazy members in toString to avoid circularity." @@ -260,7 +260,7 @@ class JavaCodeGen(lazyInterface: String, optionalInterface: String) extends Code s""" + "${f.name}: " + ${f.name}()""" }.mkString(s"""return "${cl.name}(" """, " + \", \"", " + \")\";") } - } + } else toString mkString s"$EOL " s"""public String toString() { | $body diff --git a/library/src/main/scala/ScalaCodeGen.scala b/library/src/main/scala/ScalaCodeGen.scala index fee6ad7..1264d4a 100644 --- a/library/src/main/scala/ScalaCodeGen.scala +++ b/library/src/main/scala/ScalaCodeGen.scala @@ -186,8 +186,8 @@ class ScalaCodeGen(scalaArray: String, genFile: Definition => File, sealProtocol |}""".stripMargin } - private def genToString(cl: ClassLike, superFields: List[Field], toString: Option[String]) = { - val body = toString getOrElse { + private def genToString(cl: ClassLike, superFields: List[Field], toString: List[String]) = { + val body = if (toString.isEmpty) { val allFields = superFields ++ cl.fields if (allFields exists (_.tpe.lzy)) { s"super.toString // Avoid evaluating lazy members in toString to avoid circularity." @@ -197,7 +197,7 @@ class ScalaCodeGen(scalaArray: String, genFile: Definition => File, sealProtocol val fieldsToString = allFields.map(f => bq(f.name)).mkString(" + ", """ + ", " + """, " + ") s""""${cl.name}("$fieldsToString")"""" } - } + } else toString mkString s"$EOL " s"""override def toString: String = { | $body diff --git a/library/src/main/scala/SchemaData.scala b/library/src/main/scala/SchemaData.scala index fd43c6f..a16a3c7 100644 --- a/library/src/main/scala/SchemaData.scala +++ b/library/src/main/scala/SchemaData.scala @@ -123,7 +123,7 @@ case class Interface(name: String, messages: List[Message], children: List[Definition], extra: List[String], - toStringBody: Option[String], + toStringBody: List[String], extraCompanion: List[String], parents: List[String], parentsCompanion: List[String]) extends ClassLike @@ -139,7 +139,7 @@ object Interface extends Parser[Interface] { json ->* "messages" map Message.parse, json ->* "types" map Definition.parse, json multiLineOpt "extra" getOrElse Nil, - json ->? "toString", + json multiLineOpt "toString" getOrElse Nil, json multiLineOpt "extraCompanion" getOrElse Nil, json multiLineOpt "parents" getOrElse Nil, json multiLineOpt "parentsCompanion" getOrElse Nil) @@ -162,7 +162,7 @@ case class Record(name: String, doc: List[String], fields: List[Field], extra: List[String], - toStringImpl: Option[String], + toStringImpl: List[String], extraCompanion: List[String], parents: List[String], parentsCompanion: List[String]) extends ClassLike @@ -176,7 +176,7 @@ object Record extends Parser[Record] { json multiLineOpt "doc" getOrElse Nil, json ->* "fields" map Field.parse, json multiLineOpt "extra" getOrElse Nil, - json ->? "toString", + json multiLineOpt "toString" getOrElse Nil, json multiLineOpt "extraCompanion" getOrElse Nil, json multiLineOpt "parents" getOrElse Nil, json multiLineOpt "parentsCompanion" getOrElse Nil) diff --git a/library/src/test/scala/SchemaSpec.scala b/library/src/test/scala/SchemaSpec.scala index 27f4a13..238f6f8 100644 --- a/library/src/test/scala/SchemaSpec.scala +++ b/library/src/test/scala/SchemaSpec.scala @@ -29,7 +29,7 @@ class SchemaSpec extends FlatSpec { (abstractMethods.size === 0) && (children.size === 0) && (extra === List()) && - (toString === None) && + (toString === Nil) && (extraCompanion === Nil) && (parents === Nil) && (parentsCompanion === Nil)) @@ -46,7 +46,7 @@ class SchemaSpec extends FlatSpec { (doc === List()) && (fields.size === 0) && (extra === List()) && - (toString === None) && + (toString === Nil) && (extraCompanion === Nil) && (parents === Nil) && (parentsCompanion === Nil)) @@ -85,7 +85,7 @@ class SchemaSpec extends FlatSpec { (abstractMethods.size === 0) && (children.size === 0) && (extra === List("// Some extra code...")) && - (toString === Some("return \"custom\";")) && + (toString === List("return \"custom\";")) && (extraCompanion === List("// Some extra companion code...")) && (parents === List("Interface1", "Interface2")) && (parentsCompanion === List("CompanionInterface1", "CompanionInterface2"))) @@ -104,9 +104,9 @@ class SchemaSpec extends FlatSpec { (abstractMethods.size === 0) && (children.size === 1) && (children(0) === Record("childRecord", "Scala", None, VersionNumber("0.0.0"), Nil, - Field("x", Nil, TpeRef("int", false, false, false), Field.emptyVersion, None) :: Nil, Nil, None, Nil, Nil, Nil)) && + Field("x", Nil, TpeRef("int", false, false, false), Field.emptyVersion, None) :: Nil, Nil, Nil, Nil, Nil, Nil)) && (extra === List()) && - (toString === None) && + (toString === Nil) && (extraCompanion === Nil) && (parents === Nil) && (parentsCompanion === Nil)) @@ -122,9 +122,9 @@ class SchemaSpec extends FlatSpec { (fields.size === 0) && (abstractMethods.size === 0) && (children.size === 1) && - (children(0) === Interface("nestedProtocol", "Scala", None, VersionNumber("0.0.0"), Nil, Nil, Nil, Nil, Nil, None, Nil, Nil, Nil)) && + (children(0) === Interface("nestedProtocol", "Scala", None, VersionNumber("0.0.0"), Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil)) && (extra === List()) && - (toString === None) && + (toString === Nil) && (extraCompanion === Nil) && (parents === Nil) && (parentsCompanion === Nil)) @@ -141,7 +141,7 @@ class SchemaSpec extends FlatSpec { (fields.size === 1) && (fields(0) === Field("field", Nil, TpeRef("java.net.URL", false, false, false), Field.emptyVersion, None)) && (extra === List("// Some extra code...")) && - (toString === None) && + (toString === Nil) && (extraCompanion === Nil) && (parents === Nil) && (parentsCompanion === Nil)) diff --git a/notes/0.2.8/multiline-toString.markdown b/notes/0.2.8/multiline-toString.markdown new file mode 100644 index 0000000..00671e6 --- /dev/null +++ b/notes/0.2.8/multiline-toString.markdown @@ -0,0 +1,7 @@ + +### enhancements + +- Adds multi-line support to the custom toString support. [#47][47] by [@dwijnand][@dwijnand] + + [47]: https://github.com/sbt/sbt-datatype/pull/47 + [@dwijnand]: http://github.com/dwijnand