aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2018-05-21 15:05:13 -0700
committerJakob Odersky <jakob@odersky.com>2018-05-21 15:05:13 -0700
commit9545fe93dfe68974ca4bf2f9e6310216fc914e15 (patch)
tree740a0794f15fd36f63fee657a5c20272937fec13
parent138091d73cb1bc8fca128a895f13e9d578f122be (diff)
downloadspray-json-derivation-0.4.5.tar.gz
spray-json-derivation-0.4.5.tar.bz2
spray-json-derivation-0.4.5.zip
Fix camel case subsititutionv0.4.5
-rw-r--r--shared/src/main/scala/caseFormats.scala24
-rw-r--r--shared/src/test/scala/FieldNameTests.scala5
2 files changed, 16 insertions, 13 deletions
diff --git a/shared/src/main/scala/caseFormats.scala b/shared/src/main/scala/caseFormats.scala
index 909e357..f4cc871 100644
--- a/shared/src/main/scala/caseFormats.scala
+++ b/shared/src/main/scala/caseFormats.scala
@@ -15,7 +15,12 @@ trait KebabCase { self: DerivedFormats =>
object FieldNaming {
@inline final private def isLower(ch: Char): Boolean =
- ((ch & 0x20) != 0) || (ch == '_')
+ ((ch & 0x20) != 0) && (ch != '_')
+ @inline final private def isUpper(ch: Char): Boolean =
+ ((ch & 0x20) == 0) && (ch != '_')
+
+ @inline final private def toLower(ch: Char): Char =
+ if (ch == '_') '_' else (ch | 0x20).toChar
@inline final def substituteCamel(paramName: String, substitute: Char) = {
val length = paramName.length
@@ -23,21 +28,14 @@ object FieldNaming {
var i = 0
while (i < length) {
val cur = paramName(i)
- val lower = isLower(cur)
- if (lower) {
- builder.append(cur)
- } else {
- builder.append((cur ^ 0x20).toChar)
- }
- if (lower && i + 1 < length) {
+ builder.append(toLower(cur))
+ if (isLower(cur) && (i + 1 < length)) {
val next = paramName(i + 1)
- if (!isLower(next)) {
+ if (isUpper(next)) {
builder.append(substitute)
- builder.append((next ^ 0x20).toChar)
- } else {
- builder.append(next)
+ builder.append(toLower(next))
+ i += 1
}
- i += 1
}
i += 1
}
diff --git a/shared/src/test/scala/FieldNameTests.scala b/shared/src/test/scala/FieldNameTests.scala
index 885dfb6..ef4064d 100644
--- a/shared/src/test/scala/FieldNameTests.scala
+++ b/shared/src/test/scala/FieldNameTests.scala
@@ -6,9 +6,11 @@ class FieldNameTests extends FlatSpec with FormatTests {
case class A(camelCASE: String, `__a_aB__`: Int, `a-a_B`: Int)
case class B(camelCaseA: A)
+ case class C(abA: String)
trait All extends DefaultJsonProtocol with DerivedFormats {
implicit val bFormat = jsonFormat[B]
+ implicit val cFormat = jsonFormat[C]
}
{
@@ -18,6 +20,9 @@ class FieldNameTests extends FlatSpec with FormatTests {
B(A("helloWorld", 0, 0)),
"""{"camel_case_a":{"camel_case":"helloWorld","__a_a_b__":0,"a-a_b":0}}"""
)
+ "abA" should "serialize correctly" in {
+ assert(C("test").toJson === """{"ab_a":"test"}""".parseJson)
+ }
}
{