Skip to content

Commit 87c6b6b

Browse files
committed
Code clean up
1 parent 1411f12 commit 87c6b6b

File tree

2 files changed

+30
-46
lines changed

2 files changed

+30
-46
lines changed

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

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -778,15 +778,17 @@ object JsonCodecMaker {
778778
case _ => tpe =:= TypeRepr.of[EmptyTuple]
779779
}
780780

781+
// Borrowed from an amazing work of Aleksander Rainko:
781782
// https://github.com/arainko/ducktape/blob/8d779f0303c23fd45815d3574467ffc321a8db2b/ducktape/src/main/scala/io/github/arainko/ducktape/internal/Structure.scala#L253-L270
782783
def tupleTypeArgs(t: Type[?]): List[TypeRepr] = t match {
783784
case '[head *: tail] => TypeRepr.of[head].dealias :: tupleTypeArgs(Type.of[tail])
784785
case _ => Nil
785786
}
786787

788+
// Borrowed from an amazing work of Aleksander Rainko:
787789
// https://github.com/arainko/ducktape/blob/8d779f0303c23fd45815d3574467ffc321a8db2b/ducktape/src/main/scala/io/github/arainko/ducktape/internal/Structure.scala#L277-L295
788790
def toTuple(typeArgs: List[TypeRepr]): TypeRepr = {
789-
val size = typeArgs.size
791+
val size = typeArgs.size
790792
if (size > 0 && size <= 22) defn.TupleClass(size).typeRef.appliedTo(typeArgs)
791793
else {
792794
typeArgs.foldRight(TypeRepr.of[EmptyTuple]) {
@@ -879,7 +881,7 @@ object JsonCodecMaker {
879881
case '[t] =>
880882
val sym = symbol("ct" + classTags.size, TypeRepr.of[ClassTag[t]])
881883
val ct = Expr.summon[ClassTag[t]].fold(fail(s"Can't summon ClassTag[${tpe.show}]"))(_.asTerm)
882-
ValDef(sym, Some(ct.changeOwner(sym)))
884+
ValDef(sym, Some(ct))
883885
}).symbol)
884886

885887
def inferImplicitValue[T: Type](typeToSearch: TypeRepr): Option[Expr[T]] = Implicits.search(typeToSearch) match
@@ -928,15 +930,15 @@ object JsonCodecMaker {
928930
else if (precision == MathContext.UNLIMITED.getPrecision) '{ (MathContext.UNLIMITED: java.math.MathContext) }
929931
else Ref(mathContexts.getOrElseUpdate(precision, {
930932
val sym = symbol("mc" + mathContexts.size, TypeRepr.of[MathContext])
931-
ValDef(sym, Some('{ new MathContext(${Expr(cfg.bigDecimalPrecision)}, java.math.RoundingMode.HALF_EVEN) }.asTerm.changeOwner(sym)))
933+
ValDef(sym, Some('{ new MathContext(${Expr(cfg.bigDecimalPrecision)}, java.math.RoundingMode.HALF_EVEN) }.asTerm))
932934
}).symbol).asExprOf[MathContext]
933935

934936
val scalaEnumCaches = new mutable.LinkedHashMap[TypeRepr, ValDef]
935937

936938
def withScalaEnumCacheFor[K: Type, T: Type](tpe: TypeRepr)(using Quotes): Expr[ConcurrentHashMap[K, T]] =
937939
Ref(scalaEnumCaches.getOrElseUpdate(tpe, {
938940
val sym = symbol("ec" + scalaEnumCaches.size, TypeRepr.of[ConcurrentHashMap[K, T]])
939-
ValDef(sym, Some('{ new ConcurrentHashMap[K, T] }.asTerm.changeOwner(sym)))
941+
ValDef(sym, Some('{ new ConcurrentHashMap[K, T] }.asTerm))
940942
}).symbol).asExprOf[ConcurrentHashMap[K, T]]
941943

942944
case class JavaEnumValueInfo(value: Symbol, name: String, transformed: Boolean)
@@ -996,7 +998,10 @@ object JsonCodecMaker {
996998
def genNew(argss: List[List[Term]]): Term = {
997999
val args = argss.flatten
9981000
if (isGeneric) Expr.ofTupleFromSeq(args.map(_.asExpr)).asTerm
999-
else Apply(TypeApply(Select.unique(New(Inferred(tupleTpe)), "<init>"), typeArgs.map(x => Inferred(x))), args)
1001+
else {
1002+
val constructorNoTypes = Select(New(Inferred(tupleTpe)), tupleTpe.typeSymbol.primaryConstructor)
1003+
Apply(TypeApply(constructorNoTypes, typeArgs.map(Inferred(_))), args)
1004+
}
10001005
}
10011006
}
10021007

@@ -1644,10 +1649,7 @@ object JsonCodecMaker {
16441649
val nullValues = new mutable.LinkedHashMap[TypeRepr, ValDef]
16451650

16461651
def withNullValueFor[T: Type](tpe: TypeRepr)(f: => Expr[T]): Expr[T] =
1647-
Ref(nullValues.getOrElseUpdate(tpe, {
1648-
val sym = symbol("c" + nullValues.size, tpe)
1649-
ValDef(sym, Some(f.asTerm.changeOwner(sym)))
1650-
}).symbol).asExprOf[T]
1652+
Ref(nullValues.getOrElseUpdate(tpe, ValDef(symbol("c" + nullValues.size, tpe), Some(f.asTerm))).symbol).asExprOf[T]
16511653

16521654
val fieldIndexAccessors = new mutable.LinkedHashMap[TypeRepr, DefDef]
16531655

@@ -1663,7 +1665,7 @@ object JsonCodecMaker {
16631665
i += 1
16641666
CaseDef(Literal(IntConstant(i)), None, Literal(StringConstant(n)))
16651667
}
1666-
Some(Match(param.asExprOf[Int].asTerm, cases).changeOwner(sym))
1668+
Some(Match(param.asExprOf[Int].asTerm, cases))
16671669
})
16681670
}).symbol)
16691671

@@ -1898,10 +1900,7 @@ object JsonCodecMaker {
18981900
def genReadLeafClass[T: Type](subTpe: TypeRepr)(using Quotes): Expr[T] =
18991901
val useDiscriminator = cfg.discriminatorFieldName.isDefined
19001902
if (subTpe =:= tpe) {
1901-
val typeInfo =
1902-
if (isNamedTuple(tpe)) getNamedTupleInfo(tpe)
1903-
else getClassInfo(tpe)
1904-
genReadNonAbstractScalaClass(typeInfo, types, useDiscriminator, in, genNullValue[T](types))
1903+
genReadNonAbstractScalaClass(getClassInfo(tpe), types, useDiscriminator, in, genNullValue[T](types))
19051904
} else genReadVal(subTpe :: types, genNullValue[T](subTpe :: types), isStringified, useDiscriminator, in)
19061905

19071906
def genReadCollisions[T: Type](subTpes: collection.Seq[TypeRepr], l: Expr[Int])(using Quotes): Expr[T] =
@@ -2122,7 +2121,7 @@ object JsonCodecMaker {
21222121
cfg.discriminatorFieldName.map { fieldName =>
21232122
if (cfg.checkFieldDuplication) {
21242123
val sym = symbol("pd", TypeRepr.of[Boolean], Flags.Mutable)
2125-
ReadDiscriminator(Some(ValDef(sym, Some(Literal(BooleanConstant(true)).changeOwner(sym)))))
2124+
ReadDiscriminator(Some(ValDef(sym, Some(Literal(BooleanConstant(true))))))
21262125
} else ReadDiscriminator(None)
21272126
}
21282127
} else None
@@ -2142,7 +2141,6 @@ object JsonCodecMaker {
21422141

21432142
def blockWithVars(next: Term): Term =
21442143
Block(readVars ++ paramVars.toList ++ optDiscriminatorVar.toList, next.changeOwner(Symbol.spliceOwner))
2145-
.changeOwner(Symbol.spliceOwner) // All owners should be from top Symbol.spliceOwner because vals are created with this owner
21462144

21472145
val readNonEmpty = blockWithVars('{
21482146
if (!$in.isNextToken('}')) {
@@ -2154,10 +2152,10 @@ object JsonCodecMaker {
21542152
}
21552153
if (!$in.isCurrentToken('}')) $in.objectEndOrCommaError()
21562154
}
2157-
${Block(checkReqVars, construct).changeOwner(Symbol.spliceOwner).asExprOf[T]}
2155+
${Block(checkReqVars, construct).asExprOf[T]}
21582156
}.asTerm)
2159-
If('{ $in.isNextToken('{') }.asTerm.changeOwner(Symbol.spliceOwner), readNonEmpty,
2160-
'{ $in.readNullOrTokenError($default, '{') }.asTerm.changeOwner(Symbol.spliceOwner)).asExprOf[T]
2157+
If('{ $in.isNextToken('{') }.asTerm, readNonEmpty,
2158+
'{ $in.readNullOrTokenError($default, '{') }.asTerm).asExprOf[T]
21612159
}
21622160

21632161
def genReadConstType[T: Type](tpe: TypeRepr, isStringified: Boolean, in: Expr[JsonReader])(using Quotes): Expr[T] = tpe match
@@ -2694,7 +2692,6 @@ object JsonCodecMaker {
26942692
i += 1
26952693
te.asType match
26962694
case '[t] =>
2697-
val sym = symbol("_r" + i, te)
26982695
val nullVal = genNullValue[t](te :: types)
26992696
val rhs =
27002697
if (i == 1) genReadVal(te :: types, nullVal, isStringified, false, in)
@@ -2703,19 +2700,19 @@ object JsonCodecMaker {
27032700
${genReadVal(te :: types, nullVal, isStringified, false, in)}
27042701
} else $in.commaError()
27052702
}
2706-
ValDef(sym, Some(rhs.asTerm.changeOwner(sym)))
2703+
ValDef(symbol("_r" + i, te), Some(rhs.asTerm))
27072704
}
27082705
val readCreateBlock = Block(valDefs, '{
27092706
if ($in.isNextToken(']')) ${
27102707
val size = indexedTypes.size
27112708
if (size == 0) Expr(EmptyTuple)
27122709
else if (size > 22) Expr.ofTupleFromSeq(valDefs.map(x => Ref(x.symbol).asExprOf[Any]))
27132710
else {
2714-
Apply(TypeApply(Select.unique(New(Inferred(tTpe)), "<init>"),
2715-
indexedTypes.map(x => Inferred(x))), valDefs.map(x => Ref(x.symbol))).asExpr
2711+
val constructorNoTypes = Select(New(Inferred(tTpe)), tTpe.typeSymbol.primaryConstructor)
2712+
Apply(TypeApply(constructorNoTypes, indexedTypes.map(Inferred(_))), valDefs.map(x => Ref(x.symbol))).asExpr
27162713
}
27172714
} else $in.arrayEndError()
2718-
}.asTerm)
2715+
}.asTerm.changeOwner(Symbol.spliceOwner))
27192716
'{
27202717
if ($in.isNextToken('[')) ${readCreateBlock.asExprOf[T]}
27212718
else $in.readNullOrTokenError($default, '[')
@@ -2900,8 +2897,8 @@ object JsonCodecMaker {
29002897
}
29012898
val allWriteFields = optDiscriminator.fold(writeFields)(_.write(out) :: writeFields)
29022899
Block(valDefs,
2903-
Block('{ $out.writeObjectStart() }.asTerm :: allWriteFields.map(_.asTerm.changeOwner(Symbol.spliceOwner)),
2904-
'{ $out.writeObjectEnd() }.asTerm)
2900+
Block('{ $out.writeObjectStart() }.asTerm :: allWriteFields.map(_.asTerm),
2901+
'{ $out.writeObjectEnd() }.asTerm).changeOwner(Symbol.spliceOwner)
29052902
).asExprOf[Unit]
29062903

29072904
def getWriteConstType(tpe: TypeRepr, isStringified: Boolean, out: Expr[JsonWriter])(using Quotes): Expr[Unit] =
@@ -3192,23 +3189,23 @@ object JsonCodecMaker {
31923189
val indexedTypes =
31933190
if (isGenericTuple(tpe)) tupleTypeArgs(tpe.asType)
31943191
else typeArgs(tpe)
3195-
val size = indexedTypes.size
31963192
val tTpe = toTuple(indexedTypes)
31973193
val xTerm =
31983194
tTpe.asType match
31993195
case '[tt] => '{ $x.asInstanceOf[tt & Tuple] }.asTerm
32003196
val writeFields = indexedTypes.map {
3197+
val isGeneric = indexedTypes.size > 22
32013198
var i = 0
32023199
te =>
32033200
i += 1
32043201
te.asType match
32053202
case '[t] =>
3206-
val select =
3207-
if (size > 22) {
3208-
val getter = Select.unique(xTerm, "productElement").appliedTo(Literal(IntConstant(i - 1))).asExprOf[Any]
3209-
'{ $getter.asInstanceOf[t] }.asExprOf[t]
3203+
val getter =
3204+
if (isGeneric) {
3205+
val select = Select.unique(xTerm, "productElement").appliedTo(Literal(IntConstant(i - 1))).asExprOf[Any]
3206+
'{ $select.asInstanceOf[t] }.asExprOf[t]
32103207
} else Select.unique(xTerm, "_" + i).asExprOf[t]
3211-
genWriteVal(select, te :: types, isStringified, None, out).asTerm
3208+
genWriteVal(getter, te :: types, isStringified, None, out).asTerm
32123209
}
32133210
Block('{ $out.writeArrayStart() }.asTerm :: writeFields, '{ $out.writeArrayEnd() }.asTerm).asExprOf[Unit]
32143211
} else if (isEnumOrModuleValue(tpe) && !(cfg.alwaysEmitDiscriminator && hasSealedParent(tpe))) withEncoderFor(methodKey, m, out) { (out, x) =>
@@ -3222,10 +3219,7 @@ object JsonCodecMaker {
32223219
subTpe.asType match
32233220
case '[st] =>
32243221
if (subTpe =:= tpe) {
3225-
val typeInfo =
3226-
if (isNamedTuple(tpe)) getNamedTupleInfo(tpe)
3227-
else getClassInfo(tpe)
3228-
genWriteNonAbstractScalaClass(vx.asExprOf[st], typeInfo, types, discriminator, out)
3222+
genWriteNonAbstractScalaClass(vx.asExprOf[st], getClassInfo(tpe), types, discriminator, out)
32293223
} else genWriteVal(vx.asExprOf[st], subTpe :: types, isStringified, discriminator, out)
32303224

32313225
val leafClasses = adtLeafClasses(tpe)

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
11
package com.github.plokhotnyuk.jsoniter_scala.macros
22

3-
import java.nio.charset.StandardCharsets.UTF_8
4-
import java.time._
5-
import java.util.{LinkedHashMap, Objects, UUID}
63
import com.github.plokhotnyuk.jsoniter_scala.core._
74
import com.github.plokhotnyuk.jsoniter_scala.macros.JsonCodecMaker._
8-
import org.scalatest.exceptions.TestFailedException
9-
import scala.annotation.switch
10-
import scala.collection.mutable
11-
import scala.compiletime.{error, requireConst}
12-
import scala.jdk.CollectionConverters._
13-
import scala.language.implicitConversions
14-
import scala.util.hashing.MurmurHash3
155

166
class JsonCodecMakerGenericTuplesSpec extends VerifyingSpec {
177
"JsonCodecMaker.make generate codecs which" should {

0 commit comments

Comments
 (0)