aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-11-08 18:45:17 +0100
committerMartin Odersky <odersky@gmail.com>2014-11-09 19:09:52 +0100
commit60803fa016987e05ebb2e2c80ba84d04aafc6ef3 (patch)
tree23ec2f601186129a6359c90dda8b21ebe91e0edd
parentb07c30b09851334c40298725daa5503e97ae305a (diff)
downloaddotty-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.scala8
-rw-r--r--src/dotty/tools/dotc/transform/Memoize.scala40
-rw-r--r--src/dotty/tools/dotc/transform/Mixin.scala1
-rw-r--r--test/dotc/tests.scala2
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")