diff options
author | Martin Odersky <odersky@gmail.com> | 2014-11-08 18:45:17 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-11-09 19:09:52 +0100 |
commit | 60803fa016987e05ebb2e2c80ba84d04aafc6ef3 (patch) | |
tree | 23ec2f601186129a6359c90dda8b21ebe91e0edd | |
parent | b07c30b09851334c40298725daa5503e97ae305a (diff) | |
download | dotty-60803fa016987e05ebb2e2c80ba84d04aafc6ef3.tar.gz dotty-60803fa016987e05ebb2e2c80ba84d04aafc6ef3.tar.bz2 dotty-60803fa016987e05ebb2e2c80ba84d04aafc6ef3.zip |
Merge memoize with miniphases following it into one group.
-rw-r--r-- | src/dotty/tools/dotc/Compiler.scala | 8 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/Memoize.scala | 40 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/Mixin.scala | 1 | ||||
-rw-r--r-- | test/dotc/tests.scala | 2 |
4 files changed, 31 insertions, 20 deletions
diff --git a/src/dotty/tools/dotc/Compiler.scala b/src/dotty/tools/dotc/Compiler.scala index 9da00f38a..ae5d5c100 100644 --- a/src/dotty/tools/dotc/Compiler.scala +++ b/src/dotty/tools/dotc/Compiler.scala @@ -51,12 +51,12 @@ class Compiler { List(new ElimByName, new InterceptedMethods, new Literalize, - new Getters), - List(new ResolveSuper), + new Getters, + new ResolveSuper), List(new Erasure), List(new Mixin), - List(new Memoize), - List(new CapturedVars, + List(new Memoize, + new CapturedVars, new Constructors), List(new LambdaLift, new Flatten, diff --git a/src/dotty/tools/dotc/transform/Memoize.scala b/src/dotty/tools/dotc/transform/Memoize.scala index db9349bdb..6b14d7714 100644 --- a/src/dotty/tools/dotc/transform/Memoize.scala +++ b/src/dotty/tools/dotc/transform/Memoize.scala @@ -37,28 +37,40 @@ import Decorators._ override def phaseName = "memoize" override def treeTransformPhase = thisTransform.next + override def prepareForDefDef(tree: DefDef)(implicit ctx: Context) = { + val sym = tree.symbol + if (sym.isGetter && !sym.is(NoFieldNeeded)) { + // allocate field early so that initializer has the right owner for subsequeny phases in + // the group. + val maybeMutable = if (sym is Stable) EmptyFlags else Mutable + val field = ctx.newSymbol( + owner = ctx.owner, + name = sym.name.asTermName.fieldName, + flags = Private | maybeMutable, + info = sym.info.resultType, + coord = tree.pos).enteredAfter(thisTransform) + tree.rhs.changeOwnerAfter(sym, field, thisTransform) + } + this + } + override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = { val sym = tree.symbol + def field = { + val field = sym.field.asTerm + assert(field.exists, i"no field for ${sym.showLocated} in ${sym.owner.info.decls.toList.map{_.showDcl}}%; %") + field + } if (sym.is(Accessor, butNot = NoFieldNeeded)) if (sym.isGetter) { - val maybeMutable = if (sym is Stable) EmptyFlags else Mutable - println(i"add field for $sym") - val field = ctx.newSymbol( - owner = ctx.owner, - name = sym.name.asTermName.fieldName, - flags = Private | maybeMutable, - info = sym.info.resultType, - coord = tree.pos).enteredAfter(thisTransform) - var fieldInit = tree.rhs.changeOwner(sym, field) - val fieldDef = ValDef(field, fieldInit) - val getterDef = cpy.DefDef(tree)(rhs = ref(field)) + val fieldDef = transformFollowing(ValDef(field, tree.rhs)) + val getterDef = cpy.DefDef(tree)(rhs = transformFollowingDeep(ref(field))) Thicket(fieldDef, getterDef) } else if (sym.isSetter) { val Literal(Constant(())) = tree.rhs - assert(sym.field.exists, i"no field for ${sym.showLocated} in ${sym.owner.info.decls.toList.map{_.showDcl}}%; %") - val initializer = Assign(ref(sym.field), ref(tree.vparamss.head.head.symbol)) - cpy.DefDef(tree)(rhs = initializer) + val initializer = Assign(ref(field), ref(tree.vparamss.head.head.symbol)) + cpy.DefDef(tree)(rhs = transformFollowingDeep(initializer)) } else tree // curiously, some accessors from Scala2 have ' ' suffixes. They count as // neither getters nor setters diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index 59bb8b910..668aca215 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -149,7 +149,6 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => def traitInits(mixin: ClassSymbol): List[Tree] = for (getter <- mixin.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield { - println(i"impl for getter $getter!") DefDef(implementation(getter.asTerm), superRef(initializer(getter)).appliedToNone) } diff --git a/test/dotc/tests.scala b/test/dotc/tests.scala index 2b0d7eb08..5cce45e21 100644 --- a/test/dotc/tests.scala +++ b/test/dotc/tests.scala @@ -15,7 +15,7 @@ class tests extends CompilerTest { implicit val defaultOptions = noCheckOptions ++ List( "-Yno-deep-subtypes", - "-Ycheck:patternMatcher,mixin,gettersSetters,restoreScopes" + "-Ycheck:resolveSuper,mixin,restoreScopes" ) val twice = List("#runs", "2", "-YnoDoubleBindings") |