From cf3af0e0e75e8f905eafaa12c29b87b320f7e4b1 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sun, 14 Dec 2014 15:53:40 +0100 Subject: Eliminate GettersSetters Has been replaced by Getters, but some traces remained. --- src/dotty/tools/dotc/core/Phases.scala | 4 +- src/dotty/tools/dotc/core/TypeComparer.scala | 2 +- .../tools/dotc/transform/GettersSetters.scala | 117 --------------------- 3 files changed, 3 insertions(+), 120 deletions(-) delete mode 100644 src/dotty/tools/dotc/transform/GettersSetters.scala 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 - * 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 - * --> 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 -- cgit v1.2.3