Skip to content

Commit 6a317a5

Browse files
committed
Infer private[this]
Infer private[this] if all accesses are via this, even if it is not explicitly given.
1 parent dacfba8 commit 6a317a5

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ object desugar {
155155
val vdef @ ValDef(name, tpt, rhs) = transformQuotedPatternName(vdef0)
156156
val mods = vdef.mods
157157
val setterNeeded =
158-
mods.is(Mutable) && ctx.owner.isClass && (!mods.isAllOf(PrivateLocal) || ctx.owner.is(Trait))
158+
mods.is(Mutable) && ctx.owner.isClass && (!mods.is(Private) || ctx.owner.is(Trait))
159159
if (setterNeeded) {
160160
// TODO: copy of vdef as getter needed?
161161
// val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?

compiler/src/dotty/tools/dotc/transform/Getters.scala

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import Symbols._
1010
import MegaPhase._
1111
import Flags._
1212
import ValueClasses._
13+
import SymUtils._
14+
import NameOps._
15+
import collection.mutable
16+
1317

1418
/** Performs the following rewritings for fields of a class:
1519
*
@@ -46,7 +50,7 @@ import ValueClasses._
4650
* Also, drop the Local flag from all private[this] and protected[this] members.
4751
* This allows subsequent code motions in Flatten.
4852
*/
49-
class Getters extends MiniPhase with SymTransformer {
53+
class Getters extends MiniPhase with SymTransformer { thisPhase =>
5054
import ast.tpd._
5155

5256
override def phaseName: String = Getters.name
@@ -80,11 +84,31 @@ class Getters extends MiniPhase with SymTransformer {
8084
}
8185
private val NoGetterNeededFlags = Method | Param | JavaDefined | JavaStatic
8286

87+
val newSetters = mutable.HashSet[Symbol]()
88+
89+
def ensureSetter(sym: TermSymbol)(given Context) =
90+
if !sym.setter.exists then
91+
newSetters += sym.copy(
92+
name = sym.name.setterName,
93+
info = MethodType(sym.info.widenExpr :: Nil, defn.UnitType)
94+
).enteredAfter(thisPhase)
95+
8396
override def transformValDef(tree: ValDef)(implicit ctx: Context): Tree =
84-
if (tree.symbol.is(Method)) DefDef(tree.symbol.asTerm, tree.rhs).withSpan(tree.span) else tree
97+
val sym = tree.symbol
98+
if !sym.is(Method) then return tree
99+
val getterDef = DefDef(sym.asTerm, tree.rhs).withSpan(tree.span)
100+
if !sym.is(Mutable) then return getterDef
101+
ensureSetter(sym.asTerm)
102+
if !newSetters.contains(sym.setter) then return getterDef
103+
val setterDef = DefDef(sym.setter.asTerm, unitLiteral)
104+
Thicket(getterDef, setterDef)
85105

86106
override def transformAssign(tree: Assign)(implicit ctx: Context): Tree =
87-
if (tree.lhs.symbol.is(Method)) tree.lhs.becomes(tree.rhs).withSpan(tree.span) else tree
107+
val lsym = tree.lhs.symbol.asTerm
108+
if (lsym.is(Method))
109+
ensureSetter(lsym)
110+
tree.lhs.becomes(tree.rhs).withSpan(tree.span)
111+
else tree
88112
}
89113

90114
object Getters {

0 commit comments

Comments
 (0)