Skip to content

Commit 0661e97

Browse files
author
Roman Janusz
authored
Merge pull request #438 from AVSystem/generated-fix
fixed `generated` annotation on vals & vars
2 parents 0bf72fe + 82de5f8 commit 0661e97

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.avsystem.commons.annotation.AnnotationAggregate
55
import com.avsystem.commons.meta.{AutoOptionalParams, MacroInstances}
66
import com.avsystem.commons.misc.{AutoNamedEnum, NamedEnumCompanion, TypedKey}
77

8+
import scala.annotation.meta.getter
9+
810
object CodecTestData {
911
def col[T <: JCollection[Int]](col: T): T = {
1012
col.add(1)
@@ -373,4 +375,18 @@ object CodecTestData {
373375
case class LocalStuff()
374376
object LocalStuff extends HasGenCodec[LocalStuff]()(MacroInstances.materialize)
375377
}
378+
379+
trait GeneratorBase {
380+
def value: String
381+
@generated def upper: String = value.toUpperCase
382+
@generated def abstractUpper: String
383+
}
384+
case class Generator(value: String) extends GeneratorBase {
385+
def abstractUpper: String = value.toUpperCase
386+
@generated val valUpper: String = value.toUpperCase
387+
@(generated@getter) val getterUpper: String = value.toUpperCase
388+
@generated var varUpper: String = value.toUpperCase
389+
@generated val lazyValUpper: String = value.toUpperCase
390+
}
391+
object Generator extends HasGenCodec[Generator]
376392
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,4 +384,19 @@ 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+
"getterUpper" -> "V",
397+
"varUpper" -> "V",
398+
"lazyValUpper" -> "V"
399+
)
400+
)
401+
}
387402
}

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
65+
(ts.getter == ts || ts.getter == NoSymbol) && hasAnnotation(ts, GeneratedAnnotType) ||
66+
ts.isGetter && hasAnnotation(ts.accessed, GeneratedAnnotType)
67+
}
6368
}

0 commit comments

Comments
 (0)