From 9545fe93dfe68974ca4bf2f9e6310216fc914e15 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 21 May 2018 15:05:13 -0700 Subject: Fix camel case subsititution --- shared/src/main/scala/caseFormats.scala | 24 +++++++++++------------- shared/src/test/scala/FieldNameTests.scala | 5 +++++ 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) + } } { -- cgit v1.2.3