Skip to content

Commit a3bc708

Browse files
committed
centralize fields flag juggling
1 parent eae7dac commit a3bc708

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

src/compiler/scala/tools/nsc/transform/Fields.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
5050
private def excludedAccessorOrFieldByFlags(statSym: Symbol): Boolean = statSym hasFlag LAZY | PRESUPER
5151

5252
// 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
5354
override def phaseNewFlags: Long = NEEDS_TREES | OVERRIDDEN_TRAIT_SETTER
5455

5556
final val TRAIT_SETTER_FLAGS = NEEDS_TREES | DEFERRED
@@ -78,6 +79,15 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
7879
)
7980

8081

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+
8191

8292
private def isOverriddenAccessor(member: Symbol, site: Symbol): Boolean = {
8393
val pre = site.thisType
@@ -175,6 +185,7 @@ abstract class Fields extends InfoTransform with ast.TreeDSL with TypingTransfor
175185
// If we don't add notPROTECTED to the synthesized one, the member will not be seen as overriding the trait member.
176186
// Therefore, addForwarders's call to membersBasedOnFlags would see the deferred member in the trait,
177187
// instead of the concrete (desired) one in the class
188+
// TODO: encapsulate as makeNotProtected, similar to makeNotPrivate (also do moduleClass, e.g.)
178189
if (accessor hasFlag PROTECTED) accessor setFlag notPROTECTED
179190

180191
// 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
335346
Select(This(clazz), field)
336347
}
337348

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)
340350

341351
// println(s"accessorsAndFieldsNeedingTrees: $accessorsAndFieldsNeedingTrees")
342352
def setterBody(setter: Symbol): Tree = {
343353
// trait setter in trait
344354
if (clazz.isTrait) EmptyTree
345355
// 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)
347357
// trait val/var setter mixed into class
348358
else Assign(fieldAccess(setter), Ident(setter.firstParam))
349359
}

0 commit comments

Comments
 (0)