Skip to content

Commit add60bb

Browse files
committed
Fix support of empty generic and named tuples + clean up of tests
1 parent decf7c2 commit add60bb

File tree

3 files changed

+30
-32
lines changed

3 files changed

+30
-32
lines changed

jsoniter-scala-macros/shared/src/main/scala-3/com/github/plokhotnyuk/jsoniter_scala/macros/JsonCodecMaker.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ object JsonCodecMaker {
775775

776776
def isGenericTuple(tpe: TypeRepr): Boolean = tpe match {
777777
case AppliedType(tTpe, _) if tTpe =:= TypeRepr.of[*:] => true
778-
case _ => false
778+
case _ => tpe =:= TypeRepr.of[EmptyTuple]
779779
}
780780

781781
def isNamedTuple(tpe: TypeRepr): Boolean = tpe match {
@@ -992,7 +992,7 @@ object JsonCodecMaker {
992992
val typeArgs = tupleTypeArgs(tTpe.asType)
993993
val size = typeArgs.size
994994
val tupleTpe =
995-
if (size <= 22) defn.TupleClass(size).typeRef.appliedTo(typeArgs)
995+
if (size > 0 && size <= 22) defn.TupleClass(size).typeRef.appliedTo(typeArgs)
996996
else typeArgs.foldRight(TypeRepr.of[EmptyTuple]) {
997997
val tupleCons = TypeRepr.of[*:]
998998
(curr, acc) => tupleCons.appliedTo(curr :: acc :: Nil)
@@ -2698,7 +2698,8 @@ object JsonCodecMaker {
26982698
val readCreateBlock = Block(valDefs, '{
26992699
if ($in.isNextToken(']')) ${
27002700
if (isGeneric) {
2701-
Expr.ofTupleFromSeq(valDefs.map(x => Ref(x.symbol).asExprOf[Any]))
2701+
if (indexedTypes.isEmpty) Expr(EmptyTuple)
2702+
else Expr.ofTupleFromSeq(valDefs.map(x => Ref(x.symbol).asExprOf[Any]))
27022703
} else {
27032704
Apply(TypeApply(Select.unique(New(Inferred(tpe)), "<init>"),
27042705
indexedTypes.map(x => Inferred(x))), valDefs.map(x => Ref(x.symbol))).asExpr
@@ -3176,7 +3177,6 @@ object JsonCodecMaker {
31763177
} else Select.unique(x.asTerm, "_" + i).asExprOf[t]
31773178
genWriteVal(select, te :: types, isStringified, None, out).asTerm
31783179
}
3179-
if (writeFields.isEmpty) fail(s"Expected that ${tpe.show} should be an applied type")
31803180
Block('{ $out.writeArrayStart() }.asTerm :: writeFields, '{ $out.writeArrayEnd() }.asTerm).asExprOf[Unit]
31813181
} else if (isEnumOrModuleValue(tpe) && !(cfg.alwaysEmitDiscriminator && hasSealedParent(tpe))) withEncoderFor(methodKey, m, out) { (out, x) =>
31823182
'{

jsoniter-scala-macros/shared/src/test/scala-3/com/github/plokhotnyuk/jsoniter_scala/macros/JsonCodecMakerNewTypeSpec.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ class JsonCodecMakerNewTypeSpec extends VerifyingSpec {
6363
"""[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,"24"]""")
6464
}
6565
"serialize and deserialize Scala 3 generic tuples" in {
66-
verifySerDeser(make[Byte *: Short *: Int *: Long *: EmptyTuple],
67-
(1: Byte) *: (2: Short) *: 3 *: 4L *: EmptyTuple, """[1,2,3,4]""")
68-
verifySerDeser(make[Byte *: Short *: Tuple2[Int, Long]],
69-
(1: Byte) *: (2: Short) *: (3, 4L), """[1,2,3,4]""")
70-
verifySerDeser(make[Tuple.Concat[(Byte, Short), (Int, Long)]], (1: Byte, 2: Short, 3, 4L), """[1,2,3,4]""")
66+
verifySerDeser(make[EmptyTuple], EmptyTuple, "[]")
67+
verifySerDeser(make[Tuple.Drop[(Long, Int, String), 3]], EmptyTuple, "[]")
68+
verifySerDeser(make[Byte *: Short *: Int *: Long *: EmptyTuple], (1: Byte) *: (2: Short) *: 3 *: 4L *: EmptyTuple, "[1,2,3,4]")
69+
verifySerDeser(make[Byte *: Short *: Tuple2[Int, Long]], (1: Byte) *: (2: Short) *: (3, 4L), "[1,2,3,4]")
70+
verifySerDeser(make[Tuple.Concat[(Byte, Short), (Int, Long)]], (1: Byte, 2: Short, 3, 4L), "[1,2,3,4]")
7171
verifySerDeser(make[Tuple.Drop[(Long, Int, String), 1]], (1, "VVV"), """[1,"VVV"]""")
7272
verifySerDeser(make[Tuple.Take[(Int, String, Long), 2]], (1, "VVV"), """[1,"VVV"]""")
7373
}

jsoniter-scala-next-tests/shared/src/test/scala-3/com/github/plokhotnyuk/jsoniter_scala/macros/JsonCodecMakerNamedTupleSpec.scala

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,69 +5,67 @@ import com.github.plokhotnyuk.jsoniter_scala.macros.JsonCodecMaker._
55

66
class JsonCodecMakerNamedTupleSpec extends VerifyingSpec {
77
"JsonCodecMaker.make generate codecs which" should {
8-
"serialize and deserialize Scala 3 named tuples" in {
8+
"serialize and deserialize named tuples" in {
9+
verifySerDeser(make[NamedTuple.Empty], EmptyTuple, """{}""")
10+
verifySerDeser(make[(i: Int)], (i = 1), """{"i":1}""")
911
verifySerDeser(make[(i: Int, s: String)], (i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
1012
verifySerDeser(make[NamedTuple.Reverse[(i: Int, s: String)]], (s = "VVV", i = 1), """{"s":"VVV","i":1}""")
1113
verifySerDeser(make[NamedTuple.Concat[(i: Int), (s: String)]], (i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
1214
verifySerDeser(make[NamedTuple.Tail[(l: Long, i: Int, s: String)]], (i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
1315
verifySerDeser(make[NamedTuple.Init[(i: Int, s: String, l: Long)]], (i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
1416
verifySerDeser(make[NamedTuple.Drop[(l: Long, i: Int, s: String), 1]], (i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
1517
verifySerDeser(make[NamedTuple.Take[(i: Int, s: String, l: Long), 2]], (i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
16-
verifySerDeser(make[NamedTuple.Split[(i: Int, s: String, l: Long), 2]], ((i = 1, s = "VVV"), (l = 2L)),
17-
"""[{"i":1,"s":"VVV"},{"l":2}]""")
18-
verifySerDeser(make[NamedTuple.Zip[(i: Int, s: String), (i: Long, s: String)]], (i = (1, 2L), s = ("VVV", "WWW")),
19-
"""{"i":[1,2],"s":["VVV","WWW"]}""")
20-
}
21-
"serialize and deserialize Scala 3 tuples derived from named tuples" in {
22-
verifySerDeser(make[NamedTuple.DropNames[(i: Int, s: String)]], (1, "VVV"), """[1,"VVV"]""")
23-
}
24-
"serialize and deserialize Scala 3 tuples derived from tuples" in {
25-
verifySerDeser(make[Tuple.Reverse[(Long, Int, Short, Byte)]], (1: Byte, 2: Short, 3, 4L), """[1,2,3,4]""")
26-
}
27-
"serialize and deserialize Scala 3 named tuples with generic tuple for names" in {
28-
verifySerDeser(make[NamedTuple.NamedTuple["i" *: "s" *: EmptyTuple, (Int, String)]],
18+
verifySerDeser(make[NamedTuple.NamedTuple["i" *: "s" *: EmptyTuple, (Int, String)]],
2919
(i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
3020
verifySerDeser(make[NamedTuple.NamedTuple["i" *: ("s", "l"), (Int, String, Long)]],
3121
(i = 1, s = "VVV", l = 2L), """{"i":1,"s":"VVV","l":2}""")
32-
}
33-
"serialize and deserialize Scala 3 named tuples with generic tuple for value types" in {
3422
verifySerDeser(make[NamedTuple.NamedTuple[("i", "s"), Int *: String *: EmptyTuple]],
3523
(i = 1, s = "VVV"), """{"i":1,"s":"VVV"}""")
3624
verifySerDeser(make[NamedTuple.NamedTuple[("i", "s", "l"), Int *: Tuple2[String, Long]]],
3725
(i = 1, s = "VVV", l = 2L), """{"i":1,"s":"VVV","l":2}""")
26+
verifySerDeser(make[NamedTuple.Split[(i: Int, s: String, l: Long), 2]],
27+
((i = 1, s = "VVV"), (l = 2L)), """[{"i":1,"s":"VVV"},{"l":2}]""")
28+
verifySerDeser(make[NamedTuple.Zip[(i: Int, s: String), (i: Long, s: String)]],
29+
(i = (1, 2L), s = ("VVV", "WWW")), """{"i":[1,2],"s":["VVV","WWW"]}""")
30+
}
31+
"serialize and deserialize tuples derived from named tuples" in {
32+
verifySerDeser(make[NamedTuple.DropNames[(i: Int, s: String)]], (1, "VVV"), """[1,"VVV"]""")
33+
}
34+
"serialize and deserialize tuples derived from tuples" in {
35+
verifySerDeser(make[Tuple.Reverse[(Long, Int, Short, Byte)]], (1: Byte, 2: Short, 3, 4L), """[1,2,3,4]""")
3836
}
39-
"serialize and deserialize generic Scala 3 named tuples" in {
37+
"serialize and deserialize generic named tuples" in {
4038
type GenericNamedTuple[A, B] = (a: A, b: B)
4139

4240
verifySerDeser(make[GenericNamedTuple[Option[Int], List[String]]], (a = Some(1), b = List("VVV")),
4341
"""{"a":1,"b":["VVV"]}""")
4442
}
45-
"serialize and deserialize higher-kind Scala 3 named tuples" in {
43+
"serialize and deserialize higher-kind named tuples" in {
4644
type HKNamedTuple[F[_], G[_]] = (i: F[Int], s: G[String])
4745

4846
verifySerDeser(make[HKNamedTuple[Option, List]], (i = Some(1), s = List("VVV")),
4947
"""{"i":1,"s":["VVV"]}""")
5048
}
51-
"serialize and deserialize nested Scala 3 named tuples" in {
49+
"serialize and deserialize nested named tuples" in {
5250
verifySerDeser(make[(i: Int, t: (d: Double, s: String))], (i = 1, t = (d = 2.0, s = "VVV")),
5351
"""{"i":1,"t":{"d":2.0,"s":"VVV"}}""")
5452
}
55-
"serialize and deserialize Scala 3 named tuples using field name mapping" in {
53+
"serialize and deserialize named tuples using field name mapping" in {
5654
verifySerDeser(make[(intField: Int, strField: String)](CodecMakerConfig.withFieldNameMapper(JsonCodecMaker.enforce_snake_case)),
5755
(intField = 1, strField = "VVV"), """{"int_field":1,"str_field":"VVV"}""")
5856
}
59-
"serialize and deserialize Scala 3 named tuples with more than 22 arity" in {
57+
"serialize and deserialize named tuples with more than 22 arity" in {
6058
verifySerDeser(make[(i1: Int, i2: Int, i3: Int, i4: Int, i5: Int, i6: Int, i7: Int, i8: Int, i9: Int, i10: Int, i11: Int, i12: Int, i13: Int, i14: Int, i15: Int, i16: Int, i17: Int, i18: Int, i19: Int, i20: Int, i21: Int, i22: Int, i23: Int)],
6159
(i1 = 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5, i6 = 6, i7 = 7, i8 = 8, i9 = 9, i10 = 10, i11 = 11, i12 = 12, i13 = 13, i14 = 14, i15 = 15, i16 = 16, i17 = 17, i18 = 18, i19 = 19, i20 = 20, i21 = 21, i22 = 22, i23 = 23),
6260
"""{"i1":1,"i2":2,"i3":3,"i4":4,"i5":5,"i6":6,"i7":7,"i8":8,"i9":9,"i10":10,"i11":11,"i12":12,"i13":13,"i14":14,"i15":15,"i16":16,"i17":17,"i18":18,"i19":19,"i20":20,"i21":21,"i22":22,"i23":23}""")
6361
}
64-
"serialize and deserialize a case class with fields that are Scala 3 named tuples" in {
62+
"serialize and deserialize a case class with fields that are named tuples" in {
6563
case class NamedTupleFields(f1: (i: Int, s: String), f2: (d: Double, s: String))
6664

6765
verifySerDeser(make[NamedTupleFields], NamedTupleFields((i = 1, s = "VVV"), (d = 2.0, s = "WWW")),
6866
"""{"f1":{"i":1,"s":"VVV"},"f2":{"d":2.0,"s":"WWW"}}""")
6967
}
70-
"serialize and deserialize a collection with fields that are Scala 3 named tuples" in {
68+
"serialize and deserialize a collection with fields that are named tuples" in {
7169
verifySerDeser(make[List[(i: Int, s: String)]], List((i = 1, s = "VVV"), (i = 2, s = "WWW")),
7270
"""[{"i":1,"s":"VVV"},{"i":2,"s":"WWW"}]""")
7371
}

0 commit comments

Comments
 (0)