Skip to content

Commit f0b4abb

Browse files
committed
Code clean up
1 parent 5bc2442 commit f0b4abb

File tree

2 files changed

+10
-21
lines changed

2 files changed

+10
-21
lines changed

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

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,25 +1106,14 @@ object JsonCodecMaker {
11061106
val annotationOption = annotations.get(name)
11071107
val mappedName = annotationOption.flatMap(_.partiallyMappedName)
11081108
.getOrElse(cfg.fieldNameMapper(name).getOrElse(name))
1109-
val field = tpeClassSym.fieldMember(name)
1110-
val getterOrField =
1111-
if (field.exists) {
1112-
if (field.flags.is(Flags.PrivateLocal)) fail(s"Field '$name' in class '${tpe.show}' is private. " +
1113-
"It should be defined as 'val' or 'var' in the primary constructor.")
1114-
field
1115-
} else {
1116-
val getters = tpeClassSym.methodMember(name)
1117-
.filter(_.flags.is(Flags.CaseAccessor | Flags.FieldAccessor | Flags.ParamAccessor))
1118-
if (getters.isEmpty) { // Scala3 doesn't set FieldAccess flag for val parameters of constructor
1119-
tpeClassSym.methodMember(name).find(_.paramSymss.isEmpty) match
1120-
case None => fail(s"Field and getter not found: '$name' parameter of '${tpe.show}' " +
1121-
s"should be defined as 'val' or 'var' in the primary constructor.")
1122-
case Some(firstNamedMember) =>
1123-
if (firstNamedMember.privateWithin.isDefined) fail(s"Getter is private: '$name' paramter of " +
1124-
s"'${tpe.show}' should be defined as 'val' or 'var' in the primary constructor.")
1125-
firstNamedMember
1126-
} else getters.head // TODO: check length ? when we have both reader and writer getters.filter(_.paramSymss == List(List()))
1127-
}
1109+
var getterOrField = tpeClassSym.fieldMember(name)
1110+
if (!getterOrField.exists) { // workaround for older Scala 3 versions
1111+
val flags = Flags.FieldAccessor | Flags.ParamAccessor
1112+
getterOrField = tpeClassSym.methodMember(name).filter(_.flags.is(flags)).headOption.getOrElse(Symbol.noSymbol)
1113+
}
1114+
if (!getterOrField.exists || getterOrField.flags.is(Flags.PrivateLocal)) {
1115+
fail(s"Getter or field '$name' of '${tpe.show}' is private. It should be defined as 'val' or 'var' in the primary constructor.")
1116+
}
11281117
val defaultValue =
11291118
if (!cfg.requireDefaultFields && symbol.flags.is(Flags.HasDefault)) {
11301119
val dvMembers = tpe.typeSymbol.companionClass.methodMember("$lessinit$greater$default$" + i)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3181,7 +3181,7 @@ class JsonCodecMakerSpec extends VerifyingSpec {
31813181
|JsonCodecMaker.make[MultiListOfArgsWithNonPublicParam]""".stripMargin
31823182
}).getMessage.contains {
31833183
if (ScalaVersionCheck.isScala2) "'l' parameter of 'MultiListOfArgsWithNonPublicParam' should be defined as 'val' or 'var' in the primary constructor."
3184-
else "Field 'l' in class 'MultiListOfArgsWithNonPublicParam' is private. It should be defined as 'val' or 'var' in the primary constructor."
3184+
else "'l' of 'MultiListOfArgsWithNonPublicParam' is private. It should be defined as 'val' or 'var' in the primary constructor."
31853185
})
31863186
}
31873187
"don't generate codecs for classes with parameters in a primary constructor that have no accessor for read" in {
@@ -3191,7 +3191,7 @@ class JsonCodecMakerSpec extends VerifyingSpec {
31913191
|JsonCodecMaker.make[ParamHasNoAccessor]""".stripMargin
31923192
}).getMessage.contains {
31933193
if (ScalaVersionCheck.isScala2) "'a' parameter of 'ParamHasNoAccessor' should be defined as 'val' or 'var' in the primary constructor."
3194-
else "Field 'a' in class 'ParamHasNoAccessor' is private. It should be defined as 'val' or 'var' in the primary constructor."
3194+
else "'a' of 'ParamHasNoAccessor' is private. It should be defined as 'val' or 'var' in the primary constructor."
31953195
})
31963196
}
31973197
"don't generate codecs when all generic type parameters cannot be resolved" in {

0 commit comments

Comments
 (0)