Skip to content

Commit d24ae5f

Browse files
authored
Fix using of fieldName annotations to rename fields (not aliasing) (#773)
1 parent 8e1c5fa commit d24ae5f

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

zio-schema-derivation/shared/src/main/scala-3/zio/schema/DeriveSchema.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ private case class DeriveSchema()(using val ctx: Quotes) {
256256
tpe.asType
257257
}
258258
val annotations = paramAnns.getOrElse(label, List.empty)
259-
val nameExpr = annotations.collectFirst {
259+
val nameExpr = annotations.reverse.collectFirst {
260260
case ann if ann.isExprOf[fieldName] =>
261261
val fieldNameAnn = ann.asExprOf[fieldName]
262262
'{${fieldNameAnn}.name}
@@ -291,7 +291,7 @@ private case class DeriveSchema()(using val ctx: Quotes) {
291291
tpe.asType
292292
}
293293
val annotations = paramAnns.getOrElse(label, List.empty)
294-
val nameExpr = annotations.collectFirst {
294+
val nameExpr = annotations.reverse.collectFirst {
295295
case ann if ann.isExprOf[fieldName] =>
296296
val fieldNameAnn = ann.asExprOf[fieldName]
297297
'{${fieldNameAnn}.name}
@@ -478,7 +478,7 @@ private case class DeriveSchema()(using val ctx: Quotes) {
478478
val chunk = '{ zio.Chunk.fromIterable(${ Expr.ofSeq(anns.reverse) }) }
479479

480480
if (anns.nonEmpty) {
481-
val (newName, newNameValue) = anns.collectFirst {
481+
val (newName, newNameValue) = anns.reverse.collectFirst {
482482
case ann if ann.isExprOf[fieldName] =>
483483
val fieldNameAnn = ann.asExprOf[fieldName]
484484
('{${fieldNameAnn}.name}, extractFieldNameValue(fieldNameAnn))
@@ -529,7 +529,7 @@ private case class DeriveSchema()(using val ctx: Quotes) {
529529
val chunk = '{ zio.Chunk.fromIterable(${ Expr.ofSeq(anns.reverse) }) }
530530

531531
if (anns.nonEmpty) {
532-
val newName = anns.collectFirst {
532+
val newName = anns.reverse.collectFirst {
533533
case ann if ann.isExprOf[fieldName] => '{${ann.asExprOf[fieldName]}.name}
534534
}.getOrElse(Expr(name))
535535

zio-schema-derivation/shared/src/test/scala/zio/schema/DeriveSchemaSpec.scala

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,10 @@ object DeriveSchemaSpec extends ZIOSpecDefault with VersionSpecificDeriveSchemaS
235235
implicit lazy val schema: Schema.EnumN[Enum23, CaseSet.Aux[Enum23]] = DeriveSchema.gen[Enum23]
236236
}
237237

238-
case class RenamedField(@fieldName("renamed") name: String, @fieldName("number") num: Int)
238+
case class RenamedField(
239+
@fieldName("renamed") @fieldName("ignored_rename") name: String,
240+
@fieldName("number") num: Int
241+
)
239242

240243
object RenamedField {
241244
implicit lazy val schema: Schema[RenamedField] = DeriveSchema.gen[RenamedField]
@@ -445,15 +448,17 @@ object DeriveSchemaSpec extends ZIOSpecDefault with VersionSpecificDeriveSchemaS
445448
assert(Schema[ContainsSchema].toString)(not(containsString("null")) && not(equalTo("$Lazy$")))
446449
},
447450
test("correctly derives renaming field when fieldName annotation is present") {
448-
val derived = DeriveSchema.gen[RenamedField]
451+
val derived = DeriveSchema.gen[RenamedField]
452+
val derivedField1 = derived.asInstanceOf[Schema.CaseClass2[String, Int, RenamedField]].field1
453+
val derivedField2 = derived.asInstanceOf[Schema.CaseClass2[String, Int, RenamedField]].field2
449454

450455
val expected: Schema[RenamedField] = {
451456
Schema.CaseClass2(
452457
TypeId.parse("zio.schema.DeriveSchemaSpec.RenamedField"),
453458
field01 = Schema.Field(
454459
"renamed",
455460
Schema.Primitive(StandardType.StringType),
456-
Chunk(fieldName("renamed")),
461+
Chunk(fieldName("renamed"), fieldName("ignored_rename")),
457462
get0 = _.name,
458463
set0 = (a, b: String) => a.copy(name = b)
459464
),
@@ -467,6 +472,10 @@ object DeriveSchemaSpec extends ZIOSpecDefault with VersionSpecificDeriveSchemaS
467472
RenamedField.apply
468473
)
469474
}
475+
assert(derivedField1.fieldName)(equalTo("renamed")) &&
476+
assert(derivedField1.nameAndAliases)(equalTo(Set("renamed"))) &&
477+
assert(derivedField2.fieldName)(equalTo("number")) &&
478+
assert(derivedField2.nameAndAliases)(equalTo(Set("number"))) &&
470479
assert(derived)(hasSameSchema(expected)) &&
471480
assert(verifyFieldName[derived.Field1]("renamed"))(isTrue)
472481
},

zio-schema/shared/src/main/scala/zio/schema/Schema.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -432,16 +432,18 @@ object Schema extends SchemaPlatformSpecific with SchemaEquality {
432432
val transient: Boolean =
433433
annotations.exists(_.isInstanceOf[transientField])
434434

435-
val nameAndAliases: scala.collection.immutable.Set[String] =
436-
annotations.collect {
437-
case aliases: fieldNameAliases => aliases.aliases
438-
case f: fieldName => Seq(f.name)
439-
}.flatten.toSet + name
440-
441435
val fieldName: String = annotations.collectFirst {
442436
case f: fieldName => f.name
443437
}.getOrElse(name)
444438

439+
val nameAndAliases: scala.collection.immutable.Set[String] =
440+
annotations.foldLeft(scala.collection.immutable.Set(fieldName)) { (acc, annotation) =>
441+
annotation match {
442+
case aliases: fieldNameAliases => acc ++ aliases.aliases
443+
case _ => acc
444+
}
445+
}
446+
445447
override def toString: String = s"Field($name,$schema)"
446448
}
447449

0 commit comments

Comments
 (0)