diff --git a/build.sbt b/build.sbt index c08b7a214..5c41d937c 100644 --- a/build.sbt +++ b/build.sbt @@ -17,6 +17,8 @@ def commonSettings: Seq[Setting[_]] = Seq( scalacOptions ++= Seq("-Ywarn-unused", "-Ywarn-unused-import"), scalacOptions --= // scalac 2.10 rejects some HK types under -Xfuture it seems.. (CrossVersion partialVersion scalaVersion.value collect { case (2, 10) => List("-Xfuture", "-Ywarn-unused", "-Ywarn-unused-import") }).toList.flatten, + scalacOptions in console in Compile -= "-Ywarn-unused-import", + scalacOptions in console in Test -= "-Ywarn-unused-import", previousArtifact := None, // Some(organization.value %% moduleName.value % "1.0.0"), publishArtifact in Compile := true, publishArtifact in Test := false diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala index 78e6e301c..00bb6beaa 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala @@ -4,3 +4,4 @@ import sjsonnew.BasicJsonProtocol object CacheImplicits extends BasicCacheImplicits with BasicJsonProtocol + with HListFormat diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala b/internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala new file mode 100644 index 000000000..82ecf9ba3 --- /dev/null +++ b/internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala @@ -0,0 +1,37 @@ +package sbt.internal.util + +import sjsonnew._ +import Types.:+: + +trait HListFormat { + implicit val lnilFormat1: JsonFormat[HNil] = forHNil(HNil) + implicit val lnilFormat2: JsonFormat[HNil.type] = forHNil(HNil) + + private def forHNil[A <: HNil](hnil: A): JsonFormat[A] = new JsonFormat[A] { + def write[J](x: A, builder: Builder[J]): Unit = { + if (builder.state != BuilderState.InArray) builder.beginArray() + builder.endArray() + } + + def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): A = { + if (unbuilder.state == UnbuilderState.InArray) unbuilder.endArray() + hnil + } + } + + implicit def hconsFormat[H, T <: HList](implicit hf: JsonFormat[H], tf: JsonFormat[T]): JsonFormat[H :+: T] = + new JsonFormat[H :+: T] { + def write[J](hcons: H :+: T, builder: Builder[J]) = { + if (builder.state != BuilderState.InArray) builder.beginArray() + hf.write(hcons.head, builder) + tf.write(hcons.tail, builder) + } + + def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]) = jsOpt match { + case None => HCons(hf.read(None, unbuilder), tf.read(None, unbuilder)) + case Some(js) => + if (unbuilder.state != UnbuilderState.InArray) unbuilder.beginArray(js) + HCons(hf.read(Some(unbuilder.nextElement), unbuilder), tf.read(Some(js), unbuilder)) + } + } +} diff --git a/internal/util-cache/src/test/scala/HListFormatSpec.scala b/internal/util-cache/src/test/scala/HListFormatSpec.scala new file mode 100644 index 000000000..23e4cde0f --- /dev/null +++ b/internal/util-cache/src/test/scala/HListFormatSpec.scala @@ -0,0 +1,26 @@ +package sbt.internal.util + +import scala.json.ast.unsafe._ +import sjsonnew._, support.scalajson.unsafe._ +import CacheImplicits._ + +class HListFormatSpec extends UnitSpec { + val quux = 23 :+: "quux" :+: true :+: HNil + + it should "round trip quux" in assertRoundTrip(quux) + it should "round trip hnil" in assertRoundTrip(HNil) + + it should "have a flat structure for quux" in assertJsonString(quux, """[23,"quux",true]""") + it should "have a flat structure for hnil" in assertJsonString(HNil, "[]") + + def assertRoundTrip[A: JsonWriter: JsonReader](x: A) = { + val jsonString: String = toJsonString(x) + val jValue: JValue = Parser.parseUnsafe(jsonString) + val y: A = Converter.fromJson[A](jValue).get + assert(x === y) + } + + def assertJsonString[A: JsonWriter](x: A, s: String) = assert(toJsonString(x) === s) + + def toJsonString[A: JsonWriter](x: A): String = CompactPrinter(Converter.toJson(x).get) +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 8e9f07b08..7ebe4c8ed 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -36,7 +36,7 @@ object Dependencies { lazy val parserCombinator211 = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4" - lazy val sjsonnewVersion = "0.4.2" + lazy val sjsonnewVersion = "0.5.1" lazy val sjsonnew = "com.eed3si9n" %% "sjson-new-core" % sjsonnewVersion lazy val sjsonnewScalaJson = "com.eed3si9n" %% "sjson-new-scalajson" % sjsonnewVersion }