diff --git a/.mill-jvm-opts b/.mill-jvm-opts new file mode 100644 index 000000000..aa011f683 --- /dev/null +++ b/.mill-jvm-opts @@ -0,0 +1 @@ +-Xss10m diff --git a/bench/src-jvm/Main.scala b/bench/src-jvm/Main.scala index 43aa16bc1..e9a4e3419 100644 --- a/bench/src-jvm/Main.scala +++ b/bench/src-jvm/Main.scala @@ -2,6 +2,7 @@ package upickle import upack.MsgPackWriter +import scala.annotation.nowarn object Main{ import ADTs.ADT0 @@ -53,6 +54,7 @@ object Main{ println() } } + @nowarn("cat=deprecation") def benchParsingRendering(duration: Int, bytes: Boolean, strings: Boolean, streams: Boolean, msgpack: Boolean) = { import java.nio.file.{Files, Paths} import collection.JavaConverters._ @@ -126,7 +128,7 @@ object Main{ def circeJsonAst(duration: Int) = { Common.bench0[String, io.circe.Json](duration, Common.benchmarkSampleJson)( - io.circe.parser.parse(_).right.get, + io.circe.parser.parse(_).getOrElse(???), _.toString() ) } @@ -139,7 +141,7 @@ object Main{ def argonautJsonAst(duration: Int) = { Common.bench0[String, argonaut.Json](duration, Common.benchmarkSampleJson)( - argonaut.Parse.parse(_).right.get, + argonaut.Parse.parse(_).getOrElse(???), _.toString() ) } diff --git a/bench/src/NonNative.scala b/bench/src/NonNative.scala index 32b1299da..0181db0d6 100644 --- a/bench/src/NonNative.scala +++ b/bench/src/NonNative.scala @@ -32,7 +32,7 @@ object NonNative{ implicit def _w9: Encoder[ADT0] = deriveEncoder Common.bench[String](duration)( - decode[Seq[Data]](_).right.get, + decode[Seq[Data]](_).getOrElse(???), implicitly[Encoder[Seq[Data]]].apply(_).toString() ) @@ -92,7 +92,7 @@ object NonNative{ implicit lazy val _w9: Encoder[ADT0] = deriveEncoder Common.bench[String](duration)( - decode[Seq[Data]](_).right.get, + decode[Seq[Data]](_).getOrElse(???), implicitly[Encoder[Seq[Data]]].apply(_).toString() ) } diff --git a/build.sc b/build.sc index 65d64fc07..0642d5243 100644 --- a/build.sc +++ b/build.sc @@ -32,12 +32,7 @@ val scalaJVMVersions = scala2JVMVersions ++ Seq(scala3) ++ dottyCustomVersion val scalaJSVersions = scalaJVMVersions.map((_, scalaJS)) val scalaNativeVersions = scalaJVMVersions.map((_, scalaNative)) -trait CommonModule extends ScalaModule { - override def scalacOptions = T{ - super.scalacOptions() ++ { - if (scalaVersion() == scala212) Seq("-opt:l:method") else Nil - } - } +trait CommonBaseModule extends ScalaModule { def platformSegment: String override def sources = T.sources{ @@ -54,6 +49,19 @@ trait CommonModule extends ScalaModule { } } +trait CommonModule extends CommonBaseModule { + override def scalacOptions = T{ + super.scalacOptions() ++ { + if (scalaVersion() == scala212) Seq("-opt:l:method") else Nil + } ++ Seq( + "-unchecked", + "-deprecation", + "-encoding", "utf8", + "-feature", + "-Xfatal-warnings" + ) + } +} trait CommonPublishModule extends CommonModule with PublishModule with Mima with CrossScalaModule { @@ -100,7 +108,7 @@ trait CommonPublishModule extends CommonModule with PublishModule with Mima with } } -trait CommonTestModule extends CommonModule with TestModule.Utest{ +trait CommonTestModule extends CommonBaseModule with TestModule.Utest{ override def ivyDeps = Agg(ivy"com.lihaoyi::utest::0.8.1") ++ ( if (isScala3(scalaVersion())) Agg.empty[mill.scalalib.Dep] else Agg(ivy"com.lihaoyi:::acyclic:$acyclic") @@ -111,6 +119,11 @@ trait CommonTestModule extends CommonModule with TestModule.Utest{ os.makeDir.all(javadocDir) mill.modules.Jvm.createJar(Agg(javadocDir))(outDir) } + override def scalacOptions = super.scalacOptions() ++ + (if (isScala3(scalaVersion())) Seq( + "-Ximplicit-search-limit", + "200000" + ) else Seq.empty[String]) } trait CommonJvmModule extends CommonPublishModule{ @@ -373,12 +386,6 @@ trait UpickleModule extends CommonPublishModule{ ivy"org.scala-lang:scala-compiler:${scalaVersion()}" ) else Agg.empty[Dep] - override def scalacOptions = super.scalacOptions() ++ Seq( - "-unchecked", - "-deprecation", - "-encoding", "utf8", - "-feature", - ) } @@ -387,7 +394,7 @@ object upickle extends Module{ class JvmModule(val crossScalaVersion: String) extends UpickleModule with CommonJvmModule{ override def moduleDeps = Seq(ujson.jvm(), upack.jvm(), implicits.jvm()) - object test extends Tests with CommonModule{ + object test extends Tests with CommonBaseModule{ override def moduleDeps = { (super.moduleDeps :+ core.jvm().test) ++ ( if (isDotty) Nil else Seq( diff --git a/core/src-2.12/upickle/core/compat/package.scala b/core/src-2.12/upickle/core/compat/package.scala index ccd7db71d..e60f65331 100644 --- a/core/src-2.12/upickle/core/compat/package.scala +++ b/core/src-2.12/upickle/core/compat/package.scala @@ -27,6 +27,10 @@ package object compat { */ type Factory[-A, +C] = CanBuildFrom[Nothing, A, C] + type IterableOnce[T] = TraversableOnce[T] + + def toIterator[T](iterable: IterableOnce[T]): IterableOnce[T] = iterable + implicit class FactoryOps[-A, +C](private val factory: Factory[A, C]) { /** diff --git a/core/src-2.13+/upickle/core/compat/package.scala b/core/src-2.13+/upickle/core/compat/package.scala index d735a4920..3ae3f87f2 100644 --- a/core/src-2.13+/upickle/core/compat/package.scala +++ b/core/src-2.13+/upickle/core/compat/package.scala @@ -4,4 +4,6 @@ package object compat { type Factory[-A, +C] = collection.Factory[A, C] + def toIterator[T](iterable: IterableOnce[T]) = iterable.iterator + } diff --git a/core/src/upickle/core/LinkedHashMap.scala b/core/src/upickle/core/LinkedHashMap.scala index 73ed4797c..40395c8a6 100644 --- a/core/src/upickle/core/LinkedHashMap.scala +++ b/core/src/upickle/core/LinkedHashMap.scala @@ -46,9 +46,9 @@ object LinkedHashMap { def apply[K, V](): LinkedHashMap[K, V] = new LinkedHashMap[K, V](new ju.LinkedHashMap[K, V]) - def apply[K, V](items: TraversableOnce[(K, V)]): LinkedHashMap[K, V] = { + def apply[K, V](items: IterableOnce[(K, V)]): LinkedHashMap[K, V] = { val map = LinkedHashMap[K, V]() - for ((key, value) <- items) { + toIterator(items).foreach { case (key, value) => map._put(key, value) } map diff --git a/core/src/upickle/core/TraceVisitor.scala b/core/src/upickle/core/TraceVisitor.scala index 0fee2f9c4..e5ccc5857 100644 --- a/core/src/upickle/core/TraceVisitor.scala +++ b/core/src/upickle/core/TraceVisitor.scala @@ -3,7 +3,7 @@ package upickle.core import upickle.core.TraceVisitor._ import scala.annotation.tailrec -import scala.util.control.NoStackTrace +import scala.util.control.{NonFatal, NoStackTrace} /** * Adds a JSON Path to exceptions thrown by the delegate Visitor. @@ -19,7 +19,7 @@ object TraceVisitor { else{ val wrapper = new upickle.core.TraceVisitor.Wrapper[T, J]() try f(wrapper.visitor(v)) - catch{case e => throw new upickle.core.TraceVisitor.TraceException(wrapper.lastHasPath.toString, e) } + catch{case NonFatal(e) => throw new upickle.core.TraceVisitor.TraceException(wrapper.lastHasPath.toString, e) } } } @@ -122,7 +122,7 @@ class TraceVisitor[T, J]( objVisitor.visitEnd(index) } - override def pathComponent: Option[String] = Option(key).map("'" + _.replaceAllLiterally("'", "\\'") + "'") + override def pathComponent: Option[String] = Option(key).map("'" + _.replace("'", "\\'") + "'") override def parent: Option[HasPath] = Some(TraceVisitor.this.parentPath) } diff --git a/implicits/src-2/upickle/implicits/MacroImplicits.scala b/implicits/src-2/upickle/implicits/MacroImplicits.scala index e33559e65..92ac78f93 100644 --- a/implicits/src-2/upickle/implicits/MacroImplicits.scala +++ b/implicits/src-2/upickle/implicits/MacroImplicits.scala @@ -1,6 +1,7 @@ package upickle.implicits import language.experimental.macros +import scala.language.higherKinds /** * Stupid hacks to work around scalac not forwarding macro type params properly diff --git a/implicits/src-2/upickle/implicits/internal/Macros.scala b/implicits/src-2/upickle/implicits/internal/Macros.scala index 5423d1675..2a28288c8 100644 --- a/implicits/src-2/upickle/implicits/internal/Macros.scala +++ b/implicits/src-2/upickle/implicits/internal/Macros.scala @@ -1,6 +1,6 @@ package upickle.implicits.internal -import scala.annotation.StaticAnnotation +import scala.annotation.{nowarn, StaticAnnotation} import scala.language.experimental.macros import compat._ import acyclic.file @@ -15,6 +15,7 @@ import language.existentials * directly, since they are called implicitly when trying to read/write * types you don't have a Reader/Writer in scope for. */ +@nowarn("cat=deprecation") object Macros { trait DeriveDefaults[M[_]] { diff --git a/implicits/src-3/upickle/implicits/macros.scala b/implicits/src-3/upickle/implicits/macros.scala index 7e3039c3c..da4fdde64 100644 --- a/implicits/src-3/upickle/implicits/macros.scala +++ b/implicits/src-3/upickle/implicits/macros.scala @@ -218,7 +218,7 @@ def defineEnumVisitorsImpl[T0, T <: Tuple](prefix: Expr[Any], macroX: String)(us def handleType(tpe: TypeRepr, name: String, skipTrait: Boolean): Option[(ValDef, Symbol)] = { - val AppliedType(typePrefix, List(arg)) = tpe + val AppliedType(typePrefix, List(arg)) = tpe: @unchecked if (skipTrait && arg.typeSymbol.flags.is(Flags.Trait)) None else { @@ -231,7 +231,7 @@ def defineEnumVisitorsImpl[T0, T <: Tuple](prefix: Expr[Any], macroX: String)(us ) val macroCall = TypeApply( - Select(prefix.asTerm, prefix.asTerm.tpe.typeSymbol.memberMethod(macroX).head), + Select(prefix.asTerm, prefix.asTerm.tpe.typeSymbol.methodMember(macroX).head), List(TypeTree.of(using arg.asType)) ) diff --git a/implicits/src/upickle/implicits/Readers.scala b/implicits/src/upickle/implicits/Readers.scala index 9cbbd7fca..03a62bb51 100644 --- a/implicits/src/upickle/implicits/Readers.scala +++ b/implicits/src/upickle/implicits/Readers.scala @@ -8,6 +8,7 @@ import upickle.core._ import upickle.core.compat._ import scala.collection.mutable import scala.concurrent.duration.{Duration, FiniteDuration} +import scala.language.higherKinds import scala.reflect.ClassTag trait Readers extends upickle.core.Types @@ -57,8 +58,8 @@ trait Readers extends upickle.core.Types override def expectedMsg = "expected number" override def visitString(s: CharSequence, index: Int) = visitFloat64String(s.toString, index) override def visitInt32(d: Int, index: Int) = d - override def visitInt64(d: Long, index: Int) = d - override def visitUInt64(d: Long, index: Int) = d + override def visitInt64(d: Long, index: Int) = d.toDouble + override def visitUInt64(d: Long, index: Int) = d.toDouble override def visitFloat32(d: Float, index: Int) = d override def visitFloat64(d: Double, index: Int) = d override def visitFloat64StringParts(s: CharSequence, decIndex: Int, expIndex: Int, index: Int) = { diff --git a/implicits/src/upickle/implicits/Writers.scala b/implicits/src/upickle/implicits/Writers.scala index fe002fe0f..bacce9ccc 100644 --- a/implicits/src/upickle/implicits/Writers.scala +++ b/implicits/src/upickle/implicits/Writers.scala @@ -5,6 +5,7 @@ import java.util.UUID import upickle.core.{ Visitor, Annotator } import scala.concurrent.duration.{Duration, FiniteDuration} +import scala.language.higherKinds trait Writers extends upickle.core.Types with TupleReadWriters diff --git a/ujson/play/src/ujson/play/PlayJson.scala b/ujson/play/src/ujson/play/PlayJson.scala index ae71c646a..3a99140e6 100644 --- a/ujson/play/src/ujson/play/PlayJson.scala +++ b/ujson/play/src/ujson/play/PlayJson.scala @@ -9,6 +9,8 @@ import scala.collection.mutable.ArrayBuffer object PlayJson extends ujson.AstTransformer[JsValue] { def transform[T](j: JsValue, f: Visitor[_, T]): T = j match{ case JsArray(xs) => transformArray(f, xs) + case JsFalse => f.visitFalse(-1) + case JsTrue => f.visitTrue(-1) case JsBoolean(b) => if (b) f.visitTrue(-1) else f.visitFalse(-1) case JsNull => f.visitNull(-1) case JsNumber(d) => f.visitFloat64String(d.toString, -1) diff --git a/ujson/src-js/ujson/WebJson.scala b/ujson/src-js/ujson/WebJson.scala index 4fc0cfcff..d9dc19b1c 100644 --- a/ujson/src-js/ujson/WebJson.scala +++ b/ujson/src-js/ujson/WebJson.scala @@ -12,7 +12,7 @@ object WebJson extends ujson.Transformer[js.Any]{ case true => f.visitTrue(-1) case false => f.visitFalse(-1) case null => f.visitNull(-1) - case s: js.Array[js.Any] => + case s: js.Array[js.Any] @unchecked => val ctx = f.visitArray(-1, -1).narrow for(i <- s) ctx.visitValue(transform(i, ctx.subVisitor), -1) ctx.visitEnd(-1) diff --git a/ujson/src/ujson/AstTransformer.scala b/ujson/src/ujson/AstTransformer.scala index 63d41e7b2..336287f86 100644 --- a/ujson/src/ujson/AstTransformer.scala +++ b/ujson/src/ujson/AstTransformer.scala @@ -3,6 +3,8 @@ import upickle.core._ import upickle.core.compat._ +import scala.language.higherKinds + trait AstTransformer[I] extends Transformer[I] with JsVisitor[I, I]{ def apply(t: Readable): I = t.transform(this) @@ -32,7 +34,7 @@ trait AstTransformer[I] extends Transformer[I] with JsVisitor[I, I]{ def visitValue(v: I, index: Int): Unit = vs += (key -> v) - def visitEnd(index: Int) = build(vs.result) + def visitEnd(index: Int) = build(vs.result()) } class AstArrVisitor[T[_]](build: T[I] => I) (implicit factory: Factory[I, T[I]]) extends ArrVisitor[I, I]{ diff --git a/ujson/src/ujson/JsVisitor.scala b/ujson/src/ujson/JsVisitor.scala index 773ea2a15..f49bed4f7 100644 --- a/ujson/src/ujson/JsVisitor.scala +++ b/ujson/src/ujson/JsVisitor.scala @@ -30,11 +30,11 @@ trait JsVisitor[-T, +J] extends Visitor[T, J]{ def visitInt32(i: Int, index: Int): J = visitFloat64(i, index) def visitInt64(i: Long, index: Int): J = { if (math.abs(i) > math.pow(2, 53) || i == -9223372036854775808L) visitString(i.toString, index) - else visitFloat64(i, index) + else visitFloat64(i.toDouble, index) } def visitUInt64(i: Long, index: Int): J = { if (i > math.pow(2, 53) || i < 0) visitString(java.lang.Long.toUnsignedString(i), index) - else visitFloat64(i, index) + else visitFloat64(i.toDouble, index) } def visitFloat64String(s: String, index: Int): J = { diff --git a/ujson/src/ujson/Readable.scala b/ujson/src/ujson/Readable.scala index cd9ccd35e..cbe090e5d 100644 --- a/ujson/src/ujson/Readable.scala +++ b/ujson/src/ujson/Readable.scala @@ -3,6 +3,9 @@ package ujson import java.nio.ByteBuffer import java.nio.channels.ReadableByteChannel import upickle.core.{Visitor, ObjArrVisitor} + +import scala.language.implicitConversions + trait Readable { def transform[T](f: Visitor[_, T]): T } diff --git a/ujson/src/ujson/Value.scala b/ujson/src/ujson/Value.scala index 29355666b..e812da6cc 100644 --- a/ujson/src/ujson/Value.scala +++ b/ujson/src/ujson/Value.scala @@ -3,6 +3,7 @@ package ujson import upickle.core.{LinkedHashMap, ObjArrVisitor, ParseUtils, Visitor} import upickle.core.compat._ +import scala.language.implicitConversions import scala.collection.mutable sealed trait Value extends Readable with geny.Writable{ @@ -139,36 +140,10 @@ object Value extends AstTransformer[Value]{ } } - @deprecated("use ujson.Str") - val Str = ujson.Str - @deprecated("use ujson.Str") - type Str = ujson.Str - @deprecated("use ujson.Obj") - val Obj = ujson.Obj - @deprecated("use ujson.Obj") - type Obj = ujson.Obj - @deprecated("use ujson.Arr") - val Arr = ujson.Arr - @deprecated("use ujson.Arr") - type Arr = ujson.Arr - @deprecated("use ujson.Num") - val Num = ujson.Num - @deprecated("use ujson.Num") - type Num = ujson.Num - @deprecated("use ujson.Bool") - val Bool = ujson.Bool - @deprecated("use ujson.Bool") - type Bool = ujson.Bool - @deprecated("use ujson.True") - val True = ujson.True - @deprecated("use ujson.False") - val False = ujson.False - @deprecated("use ujson.Null") - val Null = ujson.Null - implicit def JsonableSeq[T](items: TraversableOnce[T]) - (implicit f: T => Value): Arr = Arr.from(items.map(f)) - implicit def JsonableDict[T](items: TraversableOnce[(String, T)]) - (implicit f: T => Value): Obj = Obj.from(items.map(x => (x._1, f(x._2)))) + implicit def JsonableSeq[T](items: IterableOnce[T]) + (implicit f: T => Value): Arr = Arr.from(toIterator(items).map(f)) + implicit def JsonableDict[T](items: IterableOnce[(String, T)]) + (implicit f: T => Value): Obj = Obj.from(toIterator(items).map(x => (x._1, f(x._2)))) implicit def JsonableBoolean(i: Boolean): Bool = if (i) ujson.True else ujson.False implicit def JsonableByte(i: Byte): Num = Num(i) implicit def JsonableShort(i: Short): Num = Num(i) @@ -206,7 +181,7 @@ object Value extends AstTransformer[Value]{ override def visitFloat64StringParts(s: CharSequence, decIndex: Int, expIndex: Int, index: Int) = { ujson.Num( if (decIndex != -1 || expIndex != -1) s.toString.toDouble - else ParseUtils.parseIntegralNum(s, decIndex, expIndex, index) + else ParseUtils.parseIntegralNum(s, decIndex, expIndex, index).toDouble ) } @@ -229,7 +204,7 @@ object Value extends AstTransformer[Value]{ case class Str(value: String) extends Value case class Obj(value: LinkedHashMap[String, Value]) extends Value object Obj{ - implicit def from(items: TraversableOnce[(String, Value)]): Obj = { + implicit def from(items: IterableOnce[(String, Value)]): Obj = { Obj(LinkedHashMap(items)) } @@ -249,9 +224,9 @@ object Obj{ case class Arr(value: mutable.ArrayBuffer[Value]) extends Value object Arr{ - implicit def from[T](items: TraversableOnce[T])(implicit conv: T => Value): Arr = { + implicit def from[T](items: IterableOnce[T])(implicit conv: T => Value): Arr = { val buf = new mutable.ArrayBuffer[Value]() - items.foreach{ item => + toIterator(items).foreach{ item => buf += (conv(item): Value) } Arr(buf) diff --git a/ujson/templates/ElemParser.scala b/ujson/templates/ElemParser.scala index d739f7f23..30afcd85a 100644 --- a/ujson/templates/ElemParser.scala +++ b/ujson/templates/ElemParser.scala @@ -1,10 +1,11 @@ package ujson + import java.io.StringWriter import upickle.core.{Abort, AbortException, ObjArrVisitor, ObjVisitor, Visitor} +import java.nio.CharBuffer import java.nio.charset.Charset - import scala.annotation.{switch, tailrec} /** @@ -77,7 +78,7 @@ abstract class ElemParser[J] extends upickle.core.BufferingElemParser{ upickle.core.RenderUtils.escapeElem( new upickle.core.CharBuilder(), out, - new ArrayCharSequence(Array(elemOps.toInt(getElemSafe(i)).toChar)), + CharBuffer.wrap(Array(elemOps.toInt(getElemSafe(i)).toChar)), unicode = false, true ) diff --git a/ujson/test/src-2/ujson/Scala2JsonTests.scala b/ujson/test/src-2/ujson/Scala2JsonTests.scala index 0395059a4..9dc1851f8 100644 --- a/ujson/test/src-2/ujson/Scala2JsonTests.scala +++ b/ujson/test/src-2/ujson/Scala2JsonTests.scala @@ -7,14 +7,14 @@ import utest._ object Scala2JsonTests extends TestSuite { val tests = Tests { test { - val unparsed = """"\\\uCAFE"""" + val unparsed = """"\\쫾"""" val fromString = ujson.read(unparsed) val fromBytes = ujson.read(unparsed.getBytes) assert(fromString == fromBytes) } test { - val unparsed = """"\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"""" + val unparsed = """"\/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"""" val fromString = ujson.read(unparsed) val fromBytes = ujson.read(unparsed.getBytes) assert(fromString == fromBytes) diff --git a/ujson/test/src/ujson/JsonTests.scala b/ujson/test/src/ujson/JsonTests.scala index ffe8c8e41..827fe0122 100644 --- a/ujson/test/src/ujson/JsonTests.scala +++ b/ujson/test/src/ujson/JsonTests.scala @@ -35,7 +35,7 @@ object JsonTests extends TestSuite { | "digit": "0123456789", | "0123456789": "digit", | "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", - | "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + | "hex": "ģ䕧覫췯ꯍ", | "true": true, | "false": false, | "null": null, @@ -51,8 +51,8 @@ object JsonTests extends TestSuite { | |4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], | "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", - | "quotes": "" \u005Cu0022 %22 0x22 034 "", - | "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" + | "quotes": "" \""".stripMargin + "\\" + """u0022 %22 0x22 034 "", + | "\/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" |: "A key can be any string" | }, | 0.5 ,98.6 diff --git a/ujson/test/src/ujson/SmallJsonTests.scala b/ujson/test/src/ujson/SmallJsonTests.scala index bc5597fd2..11fd25eaa 100644 --- a/ujson/test/src/ujson/SmallJsonTests.scala +++ b/ujson/test/src/ujson/SmallJsonTests.scala @@ -49,7 +49,7 @@ object SmallJsonTests extends TestSuite { | "members_50": 4, | "activity_expert_groups": "none", | "other_code_of_conduct": null, - | "head_office_town": "K\u00f8benhavn V" + | "head_office_town": "København V" | } | | diff --git a/upack/src/upack/Readable.scala b/upack/src/upack/Readable.scala index 5364dbf8a..7defafd54 100644 --- a/upack/src/upack/Readable.scala +++ b/upack/src/upack/Readable.scala @@ -2,6 +2,8 @@ package upack import upickle.core.Visitor +import scala.language.implicitConversions + trait Readable { def transform[T](f: Visitor[_, T]): T } diff --git a/upickle/test/src/upickle/JsonTests.scala b/upickle/test/src/upickle/JsonTests.scala index bc7cc6684..7c667e744 100644 --- a/upickle/test/src/upickle/JsonTests.scala +++ b/upickle/test/src/upickle/JsonTests.scala @@ -33,7 +33,7 @@ object JsonTests extends TestSuite { | "digit": "0123456789", | "0123456789": "digit", | "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", - | "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + | "hex": "ģ䕧覫췯ꯍ", | "true": true, | "false": false, | "null": null, @@ -49,8 +49,8 @@ object JsonTests extends TestSuite { | |4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], | "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", - | "quotes": "" \u005Cu0022 %22 0x22 034 "", - | "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" + | "quotes": "" \""".stripMargin + "\\" + """u0022 %22 0x22 034 "", + | "\/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" |: "A key can be any string" | }, | 0.5 ,98.6 @@ -155,7 +155,7 @@ object JsonTests extends TestSuite { | "members_50": 4, | "activity_expert_groups": "none", | "other_code_of_conduct": null, - | "head_office_town": "K\u00f8benhavn V" + | "head_office_town": "København V" | } | | diff --git a/upickle/test/src/upickle/LegacyTests.scala b/upickle/test/src/upickle/LegacyTests.scala index bf4c057ff..48768294e 100644 --- a/upickle/test/src/upickle/LegacyTests.scala +++ b/upickle/test/src/upickle/LegacyTests.scala @@ -37,7 +37,7 @@ object LegacyTests extends TestSuite { ) val chunks = for (i <- 1 to 18) yield { val rhs = if (i % 2 == 1) "1" else "\"1\"" - val lhs = '"' + s"t$i" + '"' + val lhs = s""""t$i"""" s"$lhs:$rhs" } diff --git a/upickle/test/src/upickle/MacroTests.scala b/upickle/test/src/upickle/MacroTests.scala index 8b84290d3..e06a3b14b 100644 --- a/upickle/test/src/upickle/MacroTests.scala +++ b/upickle/test/src/upickle/MacroTests.scala @@ -30,7 +30,7 @@ object Custom { abstract class ThingBaseCompanion[T <: ThingBase](f: (Int, String) => T){ implicit val thing2Writer: RW[T] = upickle.default.readwriter[String].bimap[T]( - t => t.i + " " + t.s, + t => s"${t.i} ${t.s}", str => { val Array(i, s) = str.toString.split(" ", 2) f(i.toInt, s) @@ -169,7 +169,7 @@ object MacroTests extends TestSuite { ) val chunks = for (i <- 1 to 18) yield { val rhs = if (i % 2 == 1) "1" else "\"1\"" - val lhs = '"' + s"t$i" + '"' + val lhs = s""""t$i"""" s"$lhs:$rhs" } diff --git a/upickle/test/src/upickle/example/ExampleTests.scala b/upickle/test/src/upickle/example/ExampleTests.scala index 0566afedd..1079fe536 100644 --- a/upickle/test/src/upickle/example/ExampleTests.scala +++ b/upickle/test/src/upickle/example/ExampleTests.scala @@ -70,7 +70,7 @@ object Custom2{ class CustomThing2(val i: Int, val s: String) object CustomThing2 { implicit val rw: RW[CustomThing2] = upickle.default.readwriter[String].bimap[CustomThing2]( - x => x.i + " " + x.s, + x => s"${x.i} ${x.s}", str => { val Array(i, s) = str.split(" ", 2) new CustomThing2(i.toInt, s) @@ -293,8 +293,8 @@ object ExampleTests extends TestSuite { s.replaceAll("([A-Z])","#$1").split('#').map(_.toLowerCase).mkString("_") } def snakeToCamel(s: String) = { - val res = s.split("_", -1).map(x => x(0).toUpper + x.drop(1)).mkString - s(0).toLower + res.drop(1) + val res = s.split("_", -1).map(x => s"${x(0).toUpper}${x.drop(1)}").mkString + s"${s(0).toLower}${res.drop(1)}" } override def objectAttributeKeyReadMap(s: CharSequence) = diff --git a/upickle/test/src/upickle/example/OptionsAsNullTests.scala b/upickle/test/src/upickle/example/OptionsAsNullTests.scala index 0d5bb2764..7d35f51cf 100644 --- a/upickle/test/src/upickle/example/OptionsAsNullTests.scala +++ b/upickle/test/src/upickle/example/OptionsAsNullTests.scala @@ -82,7 +82,7 @@ object OptionsAsNullTests extends TestSuite { object CustomThing2 { implicit val rw: OptionPickler.ReadWriter[CustomThing2] = /*upickle.default*/ OptionPickler.readwriter[String].bimap[CustomThing2]( - x => x.i + " " + x.s, + x => s"${x.i} ${x.s}", str => { val Array(i, s) = str.split(" ", 2) new CustomThing2(i.toInt, s)