Skip to content

Commit eb6e363

Browse files
author
Roman Janusz
committed
fixed generated annotation on vals & vars
1 parent 2b556a6 commit eb6e363

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

core/src/test/scala/com/avsystem/commons/serialization/CodecTestData.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,4 +373,17 @@ object CodecTestData {
373373
case class LocalStuff()
374374
object LocalStuff extends HasGenCodec[LocalStuff]()(MacroInstances.materialize)
375375
}
376+
377+
trait GeneratorBase {
378+
def value: String
379+
@generated def upper: String = value.toUpperCase
380+
@generated def abstractUpper: String
381+
}
382+
case class Generator(value: String) extends GeneratorBase {
383+
@generated def abstractUpper: String = value.toUpperCase
384+
@generated val valUpper: String = value.toUpperCase
385+
@generated var varUpper: String = value.toUpperCase
386+
@generated val lazyValUpper: String = value.toUpperCase
387+
}
388+
object Generator extends HasGenCodec[Generator]
376389
}

core/src/test/scala/com/avsystem/commons/serialization/SimpleGenCodecTest.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,4 +384,18 @@ class SimpleGenCodecTest extends SimpleIOCodecTest {
384384
testWrite[BuildablePojo](BuildablePojo.builder().setStr("foo").setFlags(JList(true, false)).setCool(false).build(),
385385
Map("str" -> "foo", "flags" -> List(true, false), "cool" -> false))
386386
}
387+
388+
test("generated fields") {
389+
testWrite[Generator](
390+
Generator("v"),
391+
Map(
392+
"value" -> "v",
393+
"upper" -> "V",
394+
"abstractUpper" -> "V",
395+
"valUpper" -> "V",
396+
"varUpper" -> "V",
397+
"lazyValUpper" -> "V"
398+
)
399+
)
400+
}
387401
}

macros/src/main/scala/com/avsystem/commons/macros/serialization/CodecMacroCommons.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ abstract class CodecMacroCommons(ctx: blackbox.Context) extends AbstractMacroCom
5858
def isTransparent(sym: Symbol): Boolean =
5959
hasAnnotation(sym, TransparentAnnotType)
6060

61-
def isGenerated(sym: Symbol): Boolean =
62-
hasAnnotation(sym, GeneratedAnnotType)
61+
def isGenerated(sym: Symbol): Boolean = sym.isTerm && {
62+
val ts = sym.asTerm
63+
// do not treat val/var's underlying field as a generated member,
64+
// pretend that the annotation is actually applied on its getter and setter
65+
ts.getter == NoSymbol && hasAnnotation(sym, GeneratedAnnotType) ||
66+
ts.isGetter && hasAnnotation(ts.accessed, GeneratedAnnotType)
67+
}
6368
}

0 commit comments

Comments
 (0)