aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Phases.scala4
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala2
-rw-r--r--src/dotty/tools/dotc/transform/GettersSetters.scala117
3 files changed, 3 insertions, 120 deletions
diff --git a/src/dotty/tools/dotc/core/Phases.scala b/src/dotty/tools/dotc/core/Phases.scala
index c1bc243a0..5777c0f5b 100644
--- a/src/dotty/tools/dotc/core/Phases.scala
+++ b/src/dotty/tools/dotc/core/Phases.scala
@@ -170,7 +170,7 @@ object Phases {
private val patmatCache = new PhaseCache(classOf[PatternMatcher])
private val flattenCache = new PhaseCache(classOf[Flatten])
private val explicitOuterCache = new PhaseCache(classOf[ExplicitOuter])
- private val gettersSettersCache = new PhaseCache(classOf[GettersSetters])
+ private val gettersCache = new PhaseCache(classOf[Getters])
def typerPhase = typerCache.phase
def refchecksPhase = refChecksCache.phase
@@ -178,7 +178,7 @@ object Phases {
def patmatPhase = patmatCache.phase
def flattenPhase = flattenCache.phase
def explicitOuterPhase = explicitOuterCache.phase
- def gettersSettersPhase = gettersSettersCache.phase
+ def gettersPhase = gettersCache.phase
def isAfterTyper(phase: Phase): Boolean = phase.id > typerPhase.id
}
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index a7f50c369..42af31553 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -792,7 +792,7 @@ class TypeComparer(initctx: Context) extends DotClass {
tp2.info match {
case tp2i: TermRef =>
isSubType(tp1, tp2i)
- case ExprType(tp2i: TermRef) if (ctx.phase.id > ctx.gettersSettersPhase.id) =>
+ case ExprType(tp2i: TermRef) if (ctx.phase.id > ctx.gettersPhase.id) =>
isSubType(tp1, tp2i)
case _ =>
false
diff --git a/src/dotty/tools/dotc/transform/GettersSetters.scala b/src/dotty/tools/dotc/transform/GettersSetters.scala
deleted file mode 100644
index bbe5740ff..000000000
--- a/src/dotty/tools/dotc/transform/GettersSetters.scala
+++ /dev/null
@@ -1,117 +0,0 @@
-package dotty.tools.dotc
-package transform
-
-import core._
-import DenotTransformers.SymTransformer
-import Phases.Phase
-import Contexts.Context
-import SymDenotations.SymDenotation
-import Types._
-import Symbols._
-import SymUtils._
-import Constants._
-import ast.Trees._
-import TreeTransforms._
-import NameOps._
-import Flags._
-import Decorators._
-
-/** Performs the following rewritings on fields of classes, where `x_L` is the "local name" of `x`:
- *
- * val x: T = e
- * --> private val x_L: T = e
- * <stable> def x: T = x_L
- *
- * var x: T = e
- * def x_=(y: T) = ()
- * --> private var x_L: T = e
- * def x: T = x_L
- * def x_=(x: T): Unit = x_L = x (if in class or trait)
- *
- * lazy val x: T = e
- * --> def x: T = e
- *
- * val x: T
- * --> <stable> def x: T
- *
- * var x: T
- * --> def x: T
- *
- * Omitted from the rewritings are
- *
- * - private[this] fields in non-trait classes
- * - fields generated for static modules (TODO: needed?)
- * - parameters, static fields, and fields coming from Java
- *
- * Furthermore, assignements to mutable vars are replaced by setter calls
- *
- * p.x = e
- * --> p.x_=(e)
- */
- class GettersSetters extends MiniPhaseTransform with SymTransformer { thisTransform =>
- import ast.tpd._
-
- override def phaseName = "gettersSetters"
-
- override def treeTransformPhase = thisTransform.next
-
- override def transformSym(d: SymDenotation)(implicit ctx: Context): SymDenotation = {
- def noGetterNeeded =
- d.is(NoGetterNeeded) ||
- d.initial.asInstanceOf[SymDenotation].is(PrivateLocal) && !d.owner.is(Trait) ||
- d.is(Module) && d.isStatic ||
- d.isSelfSym
- if (d.isTerm && d.owner.isClass && d.info.isValueType && !noGetterNeeded) {
- val maybeStable = if (d.isStable) Stable else EmptyFlags
- //if (d.name.toString == "_") println(i"make accessor $d in ${d.owner} ${d.symbol.id}")
- d.copySymDenotation(
- initFlags = d.flags | maybeStable | AccessorCreationFlags,
- info = ExprType(d.info))
- }
- else d
- }
- private val NoGetterNeeded = Method | Param | JavaDefined | JavaStatic
- private val NoFieldNeeded = Lazy | Deferred | ParamAccessor
-
- override def transformValDef(tree: ValDef)(implicit ctx: Context, info: TransformerInfo): Tree = {
- if (tree.symbol is Method) {
- val getter = tree.symbol.asTerm
- assert(getter is Accessor)
- if (getter is NoFieldNeeded)
- DefDef(getter, tree.rhs)
- else {
- val inTrait = getter.owner.is(Trait)
- val field = ctx.newSymbol(
- owner = ctx.owner,
- name = getter.name.fieldName,
- flags = Private | (getter.flags & Mutable),
- info = getter.info.resultType).enteredAfter(thisTransform)
- assert(tree.rhs.tpe.exists, tree.show)
- val fieldDef =
- cpy.ValDef(tree)(
- name = field.name,
- rhs = tree.rhs.changeOwner(getter, field).ensureConforms(field.info.widen)
- ).withType(field.valRef)
- val rhs = ref(field)
- assert(rhs.hasType)
- val getterDef = DefDef(getter, rhs.ensureConforms(getter.info.widen))
- Thicket(fieldDef, getterDef)
- }
- }
- else tree
- }
-
- override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree =
- if (tree.symbol.isSetter && !tree.symbol.is(Deferred | ParamAccessor | JavaDefined)) {
- val Literal(Constant(())) = tree.rhs
- assert(tree.symbol.field.exists, i"no field for ${tree.symbol.showLocated}")
- val initializer = Assign(ref(tree.symbol.field), ref(tree.vparamss.head.head.symbol))
- assert(initializer.hasType)
- cpy.DefDef(tree)(rhs = initializer)
- }
- else tree
-
- override def transformAssign(tree: Assign)(implicit ctx: Context, info: TransformerInfo): Tree =
- if (tree.lhs.symbol is Method) tree.lhs.becomes(tree.rhs)
- else tree
-} \ No newline at end of file