@@ -50,6 +50,7 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
50
50
private def excludedAccessorOrFieldByFlags (statSym : Symbol ): Boolean = statSym hasFlag LAZY | PRESUPER
51
51
52
52
// used for internal communication between info and tree transform of this phase -- not pickled, not in initialflags
53
+ // TODO: reuse TRANS_FLAG for NEEDS_TREES
53
54
override def phaseNewFlags : Long = NEEDS_TREES | OVERRIDDEN_TRAIT_SETTER
54
55
55
56
final val TRAIT_SETTER_FLAGS = NEEDS_TREES | DEFERRED
@@ -78,6 +79,15 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
78
79
)
79
80
80
81
82
+ def checkAndClearOverridden (setter : Symbol ) = checkAndClear(OVERRIDDEN_TRAIT_SETTER )(setter)
83
+ def checkAndClearNeedsTrees (setter : Symbol ) = checkAndClear(NEEDS_TREES )(setter)
84
+ def checkAndClear (flag : Long )(sym : Symbol ) =
85
+ sym.hasFlag(flag) match {
86
+ case overridden =>
87
+ sym resetFlag flag
88
+ overridden
89
+ }
90
+
81
91
82
92
private def isOverriddenAccessor (member : Symbol , site : Symbol ): Boolean = {
83
93
val pre = site.thisType
@@ -175,6 +185,7 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
175
185
// If we don't add notPROTECTED to the synthesized one, the member will not be seen as overriding the trait member.
176
186
// Therefore, addForwarders's call to membersBasedOnFlags would see the deferred member in the trait,
177
187
// instead of the concrete (desired) one in the class
188
+ // TODO: encapsulate as makeNotProtected, similar to makeNotPrivate (also do moduleClass, e.g.)
178
189
if (accessor hasFlag PROTECTED ) accessor setFlag notPROTECTED
179
190
180
191
// must not reset LOCAL, as we must maintain protected[this]ness to allow that variance hole
@@ -335,15 +346,14 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
335
346
Select (This (clazz), field)
336
347
}
337
348
338
- val accessorsAndFieldsNeedingTrees = clazz.info.decls.toList.filter(_ hasFlag NEEDS_TREES )
339
- accessorsAndFieldsNeedingTrees foreach (_ resetFlag NEEDS_TREES ) // emitting the needed trees now
349
+ val accessorsAndFieldsNeedingTrees = clazz.info.decls.toList.filter(checkAndClearNeedsTrees)
340
350
341
351
// println(s"accessorsAndFieldsNeedingTrees: $accessorsAndFieldsNeedingTrees")
342
352
def setterBody (setter : Symbol ): Tree = {
343
353
// trait setter in trait
344
354
if (clazz.isTrait) EmptyTree
345
355
// trait setter for overridden val in class
346
- else if (setter hasFlag OVERRIDDEN_TRAIT_SETTER ) { setter resetFlag OVERRIDDEN_TRAIT_SETTER ; mkTypedUnit(setter.pos) }
356
+ else if (checkAndClearOverridden( setter)) mkTypedUnit(setter.pos)
347
357
// trait val/var setter mixed into class
348
358
else Assign (fieldAccess(setter), Ident (setter.firstParam))
349
359
}
0 commit comments