@@ -33,14 +33,43 @@ class IRs[U <: Universe with Singleton](val uni: U) {
33
33
private type C = ClassIR
34
34
35
35
// TODO: minimal versus verbose PickleFormat. i.e. someone might want all concrete inherited fields in their pickle
36
+
37
+ def notMarkedTransient (sym : TermSymbol ): Boolean = {
38
+ // println(s"checking annots of ${sym.toString}...")
39
+ val tr = scala.util.Try {
40
+ if (sym.accessed != NoSymbol ) {
41
+ val overall = sym.accessed.annotations.forall { a =>
42
+ val res = (a.tpe =:= typeOf[scala.transient])
43
+ ! res
44
+ }
45
+ overall
46
+ } else true // if there is no backing field, then it cannot be marked transient
47
+ }
48
+ if (tr.isFailure) {
49
+ }
50
+ tr.isFailure || tr.get
51
+ }
52
+
53
+ /** Creates FieldIRs for the given type, tp.
54
+ */
36
55
private def fields (tp : Type ): Q = {
37
56
val ctor = tp.declaration(nme.CONSTRUCTOR ) match {
38
57
case overloaded : TermSymbol => overloaded.alternatives.head.asMethod // NOTE: primary ctor is always the first in the list
39
58
case primaryCtor : MethodSymbol => primaryCtor
40
59
case NoSymbol => NoSymbol
41
60
}
42
- val ctorParams = if (ctor != NoSymbol ) ctor.asMethod.paramss.flatten.map(_.asTerm) else Nil
43
- val allAccessors = tp.declarations.collect{ case meth : MethodSymbol if meth.isAccessor || meth.isParamAccessor => meth }
61
+
62
+ val allAccessors = tp.declarations.collect { case meth : MethodSymbol if meth.isAccessor || meth.isParamAccessor => meth }
63
+
64
+ val (filteredAccessors, transientAccessors) = allAccessors.partition(notMarkedTransient)
65
+
66
+ val ctorParams = if (ctor != NoSymbol ) ctor.asMethod.paramss.flatten.flatMap { sym =>
67
+ if (transientAccessors.exists(acc => acc.name.toString == sym.name.toString)) {
68
+ // println(s"found a BAD accessor: $sym")
69
+ List ()
70
+ } else List (sym.asTerm)
71
+ } else Nil
72
+
44
73
val (paramAccessors, otherAccessors) = allAccessors.partition(_.isParamAccessor)
45
74
46
75
def mkFieldIR (sym : TermSymbol , param : Option [TermSymbol ], accessor : Option [MethodSymbol ]) = {
@@ -54,15 +83,16 @@ class IRs[U <: Universe with Singleton](val uni: U) {
54
83
val varGetters = otherAccessors.collect{ case meth if meth.isGetter && meth.accessed != NoSymbol && meth.accessed.asTerm.isVar => meth }
55
84
val varFields = varGetters.map(sym => mkFieldIR(sym, None , Some (sym)))
56
85
57
- paramFields ++ varFields
86
+ val res = paramFields ++ varFields
87
+ res
58
88
}
59
89
60
90
private def composition (f1 : (Q , Q ) => Q , f2 : (C , C ) => C , f3 : C => List [C ]) =
61
91
(c : C ) => f3(c).reverse.reduce[C ](f2)
62
92
63
93
private val f1 = (q1 : Q , q2 : Q ) => q1 ++ q2
64
94
65
- private val f2 = (c1 : C , c2 : C ) => ClassIR (c2.tpe, c1, fields(c2.tpe))
95
+ private val f2 = (c1 : C , c2 : C ) => ClassIR (c2.tpe, c1, /* fields(c2.tpe)*/ c2.fields) // here: fields is called a 2nd time.
66
96
67
97
private val f3 = (c : C ) =>
68
98
c.tpe.baseClasses
0 commit comments