aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/Memoize.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-12-03 14:46:40 +0100
committerMartin Odersky <odersky@gmail.com>2014-12-03 14:46:40 +0100
commitc16e4b2bd8948be3a250373fb9eac98bb990e43a (patch)
treeefc8cb734a2b017fe4ae9a19845094e27b52daca /src/dotty/tools/dotc/transform/Memoize.scala
parent5ff3d0fe4370c525c8d29f6483892d0bf59cd4c0 (diff)
downloaddotty-c16e4b2bd8948be3a250373fb9eac98bb990e43a.tar.gz
dotty-c16e4b2bd8948be3a250373fb9eac98bb990e43a.tar.bz2
dotty-c16e4b2bd8948be3a250373fb9eac98bb990e43a.zip
Make sure all non-deferred methods are implemented
Checked by a new post condition after memoize. Two bugs were detected and fixed by the condition (1) Memoize did not implement getters and setters of ParamAccessors (2) ResolveSuper did not implement super accessors in non-trait classes.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Memoize.scala')
-rw-r--r--src/dotty/tools/dotc/transform/Memoize.scala10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/transform/Memoize.scala b/src/dotty/tools/dotc/transform/Memoize.scala
index f4b00d6a5..17a84484a 100644
--- a/src/dotty/tools/dotc/transform/Memoize.scala
+++ b/src/dotty/tools/dotc/transform/Memoize.scala
@@ -43,6 +43,12 @@ import Decorators._
*/
override def runsAfter: Set[Class[_ <: Phase]] = Set(classOf[Mixin])
+ override def checkPostCondition(tree: Tree)(implicit ctx: Context): Unit = tree match {
+ case tree: DefDef if !tree.symbol.is(Lazy | Deferred) =>
+ assert(!tree.rhs.isEmpty, i"unimplemented: $tree")
+ case _ =>
+ }
+
override def prepareForDefDef(tree: DefDef)(implicit ctx: Context) = {
val sym = tree.symbol
if (sym.isGetter && !sym.is(NoFieldNeeded)) {
@@ -74,7 +80,7 @@ import Decorators._
Thicket(fieldDef, getterDef)
}
else if (sym.isSetter) {
- val Literal(Constant(())) = tree.rhs
+ if (!sym.is(ParamAccessor)) { val Literal(Constant(())) = tree.rhs }
val initializer = Assign(ref(field), ref(tree.vparamss.head.head.symbol))
cpy.DefDef(tree)(rhs = transformFollowingDeep(initializer))
}
@@ -82,5 +88,5 @@ import Decorators._
// neither getters nor setters
else tree
}
- private val NoFieldNeeded = Lazy | Deferred | ParamAccessor | JavaDefined
+ private val NoFieldNeeded = Lazy | Deferred | JavaDefined
} \ No newline at end of file