Skip to content

Commit 2cb499b

Browse files
committed
Code clean up
1 parent a1c4fe9 commit 2cb499b

File tree

2 files changed

+37
-29
lines changed

2 files changed

+37
-29
lines changed

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

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -673,9 +673,17 @@ object JsonCodecMaker {
673673

674674
def warn(msg: String): Unit = c.warning(c.enclosingPosition, msg)
675675

676-
def typeArg1(tpe: Type): Type = tpe.typeArgs.head.dealias
676+
def typeArgs(tpe: Type): List[Type] = tpe.typeArgs.map(_.dealias)
677677

678-
def typeArg2(tpe: Type): Type = tpe.typeArgs(1).dealias
678+
def typeArg1(tpe: Type): Type = tpe.typeArgs match {
679+
case typeArg1 :: _ => typeArg1.dealias
680+
case _ => fail(s"Cannot get 1st type argument in '$tpe'")
681+
}
682+
683+
def typeArg2(tpe: Type): Type = tpe.typeArgs match {
684+
case _ :: typeArg2 :: _ => typeArg2.dealias
685+
case _ => fail(s"Cannot get 2nd type argument in '$tpe'")
686+
}
679687

680688
val tupleSymbols: Set[Symbol] = definitions.TupleClass.seq.toSet
681689

@@ -690,7 +698,7 @@ object JsonCodecMaker {
690698
if (tpe.typeSymbol.isClass) tpe.typeSymbol.asClass.typeParams
691699
else Nil
692700
if (tpeTypeParams.isEmpty) mtpe
693-
else mtpe.substituteTypes(tpeTypeParams, tpe.typeArgs)
701+
else mtpe.substituteTypes(tpeTypeParams, typeArgs(tpe))
694702
}
695703

696704
def valueClassValueSymbol(tpe: Type): MethodSymbol = tpe.decls.head.asMethod
@@ -957,11 +965,10 @@ object JsonCodecMaker {
957965
val subTpe =
958966
if (typeParams.isEmpty) classSymbol.toType
959967
else {
960-
val typeParamsAndArgs = tpeClass.typeParams.map(_.toString).zip(tpe.typeArgs).toMap
961-
val typeArgs = typeParams.map(s => typeParamsAndArgs.getOrElse(s.toString, fail {
968+
val typeParamsAndArgs = tpeClass.typeParams.map(_.toString).zip(typeArgs(tpe)).toMap
969+
classSymbol.toType.substituteTypes(typeParams, typeParams.map(tp => typeParamsAndArgs.getOrElse(tp.toString, fail {
962970
s"Cannot resolve generic type(s) for `${classSymbol.toType}`. Please provide a custom implicitly accessible codec for it."
963-
}))
964-
classSymbol.toType.substituteTypes(typeParams, typeArgs)
971+
})))
965972
}
966973
if (isSealedClass(subTpe)) collectRecursively(subTpe)
967974
else if (isValueClass(subTpe)) {
@@ -1687,8 +1694,9 @@ object JsonCodecMaker {
16871694
else if (tpe <:< typeOf[Array[_]] || isImmutableArraySeq(tpe) ||
16881695
isMutableArraySeq(tpe)) withDecoderFor(methodKey, default) {
16891696
val tpe1 = typeArg1(tpe)
1697+
val requiresArrayCopy = tpe1.typeArgs.nonEmpty || isValueClass(tpe1)
16901698
val growArray =
1691-
if (tpe1.typeArgs.nonEmpty || isValueClass(tpe1)) {
1699+
if (requiresArrayCopy) {
16921700
q"""l <<= 1
16931701
val x1 = new Array[$tpe1](l)
16941702
_root_.java.lang.System.arraycopy(x, 0, x1, 0, i)
@@ -1698,7 +1706,7 @@ object JsonCodecMaker {
16981706
_root_.java.util.Arrays.copyOf(x, l)"""
16991707
}
17001708
val shrinkArray =
1701-
if (tpe1.typeArgs.nonEmpty || isValueClass(tpe1)) {
1709+
if (requiresArrayCopy) {
17021710
q"""val x1 = new Array[$tpe1](i)
17031711
_root_.java.lang.System.arraycopy(x, 0, x1, 0, i)
17041712
x1"""
@@ -1895,19 +1903,17 @@ object JsonCodecMaker {
18951903
${genReadEnumValue(javaEnumValues(tpe), q"in.enumValueError(l)")}
18961904
} else in.readNullOrTokenError(default, '"')"""
18971905
} else if (isTuple(tpe)) withDecoderFor(methodKey, default) {
1898-
val indexedTypes = tpe.typeArgs
1899-
val readFields = indexedTypes.tail.foldLeft[Tree] {
1900-
val t = typeArg1(tpe)
1901-
q"val _1: $t = ${genReadVal(t :: types, genNullValue(t :: types), isStringified, EmptyTree)}"
1902-
}{
1903-
var i = 1
1904-
(acc, ta) =>
1906+
val indexedTypes = typeArgs(tpe)
1907+
val readFields = indexedTypes.map {
1908+
var i = 0
1909+
t =>
19051910
i += 1
1906-
val t = ta.dealias
1907-
q"""..$acc
1908-
val ${TermName("_" + i)}: $t =
1909-
if (in.isNextToken(',')) ${genReadVal(t :: types, genNullValue(t :: types), isStringified, EmptyTree)}
1910-
else in.commaError()"""
1911+
if (i == 1) q"val _1: $t = ${genReadVal(t :: types, genNullValue(t :: types), isStringified, EmptyTree)}"
1912+
else {
1913+
q"""val ${TermName("_" + i)}: $t =
1914+
if (in.isNextToken(',')) ${genReadVal(t :: types, genNullValue(t :: types), isStringified, EmptyTree)}
1915+
else in.commaError()"""
1916+
}
19111917
}
19121918
val params = (1 to indexedTypes.length).map(i => TermName("_" + i))
19131919
q"""if (in.isNextToken('[')) {
@@ -2257,11 +2263,11 @@ object JsonCodecMaker {
22572263
else q"out.writeNonEscapedAsciiVal(x.name)"
22582264
}
22592265
} else if (isTuple(tpe)) withEncoderFor(methodKey, m) {
2260-
val writeFields = tpe.typeArgs.map {
2266+
val writeFields = typeArgs(tpe).map {
22612267
var i = 0
2262-
ta =>
2268+
t =>
22632269
i += 1
2264-
genWriteVal(q"x.${TermName("_" + i)}", ta.dealias :: types, isStringified, EmptyTree)
2270+
genWriteVal(q"x.${TermName("_" + i)}", t :: types, isStringified, EmptyTree)
22652271
}
22662272
q"""out.writeArrayStart()
22672273
..$writeFields

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -755,11 +755,13 @@ object JsonCodecMaker {
755755
case AppliedType(_, typeArgs) => typeArgs.map(_.dealias)
756756
case _ => Nil
757757

758-
def typeArg1(tpe: TypeRepr): TypeRepr =
759-
typeArgs(tpe).headOption.getOrElse(fail(s"Cannot get 1st type argument in '${tpe.show}'"))
758+
def typeArg1(tpe: TypeRepr): TypeRepr = tpe match
759+
case AppliedType(_, typeArg1 :: _) => typeArg1.dealias
760+
case _ => fail(s"Cannot get 1st type argument in '${tpe.show}'")
760761

761-
def typeArg2(tpe: TypeRepr): TypeRepr =
762-
typeArgs(tpe).tail.headOption.getOrElse(fail(s"Cannot get 2nd type argument in '${tpe.show}'"))
762+
def typeArg2(tpe: TypeRepr): TypeRepr = tpe match
763+
case AppliedType(_, _ :: typeArg2 :: _) => typeArg2.dealias
764+
case _ => fail(s"Cannot get 2nd type argument in '${tpe.show}'")
763765

764766
def isTuple(tpe: TypeRepr): Boolean = tpe <:< TypeRepr.of[Tuple]
765767

@@ -1097,7 +1099,7 @@ object JsonCodecMaker {
10971099

10981100
def resolveParentTypeArgs(child: Symbol, nudeChildParentTags: List[TypeRepr], parentTags: List[TypeRepr],
10991101
binding: Map[String, TypeRepr]): Map[String, TypeRepr] =
1100-
nudeChildParentTags.zip(parentTags).foldLeft(binding)((s, e) => resolveParentTypeArg(child, e._1, e._2, s))
1102+
nudeChildParentTags.zip(parentTags).foldLeft(binding)((b, e) => resolveParentTypeArg(child, e._1, e._2, b))
11011103

11021104
tpe.typeSymbol.children.map { sym =>
11031105
if (sym.isType) {

0 commit comments

Comments
 (0)