aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-18 13:37:16 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-18 13:37:16 +0200
commitea616bf0b9f5c62d1f5a7b5b16b98cfac3c9ca1d (patch)
tree789fc813d61de41d3165e3cdc153d3e7dc3796a6 /src/dotty/tools/dotc/transform/TreeChecker.scala
parent0f6a277d3ab17f7d7011a3a29833a4ed12bb30ff (diff)
downloaddotty-ea616bf0b9f5c62d1f5a7b5b16b98cfac3c9ca1d.tar.gz
dotty-ea616bf0b9f5c62d1f5a7b5b16b98cfac3c9ca1d.tar.bz2
dotty-ea616bf0b9f5c62d1f5a7b5b16b98cfac3c9ca1d.zip
Extend owner checking in TreeChecker
Now also checks owners of primary constructors and template local dummys.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index 473f38105..ee105ba4c 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -75,6 +75,22 @@ class TreeChecker {
super.typedSelect(tree, pt)
}
+ private def checkOwner(tree: untpd.Tree)(implicit ctx: Context): Unit = {
+ def ownerMatches(symOwner: Symbol, ctxOwner: Symbol): Boolean =
+ symOwner == ctxOwner ||
+ ctxOwner.isTerm && !(ctxOwner is Method | Lazy | Mutable) &&
+ ownerMatches(symOwner, ctxOwner.owner)
+ assert(ownerMatches(tree.symbol.owner, ctx.owner),
+ i"bad owner; ${tree.symbol} has owner ${tree.symbol.owner}, expected was ${ctx.owner}")
+ }
+
+ override def typedClassDef(cdef: untpd.TypeDef, cls: ClassSymbol)(implicit ctx: Context) = {
+ val TypeDef(_, _, impl @ Template(constr, _, _, _)) = cdef
+ checkOwner(impl)
+ checkOwner(impl.constr)
+ super.typedClassDef(cdef, cls)
+ }
+
/** Check that all defined symbols have legal owners.
* An owner is legal if it is either the same as the context's owner
* or there's an owner chain of valdefs starting at the context's owner and
@@ -83,13 +99,7 @@ class TreeChecker {
* of a helper value without having to do a change owner traversal of the expression.
*/
override def index(trees: List[untpd.Tree])(implicit ctx: Context): Context = {
- def ownerMatches(symOwner: Symbol, ctxOwner: Symbol): Boolean =
- symOwner == ctxOwner ||
- ctxOwner.isTerm && !(ctxOwner is Method | Lazy | Mutable) &&
- ownerMatches(symOwner, ctxOwner.owner)
- for (tree <- trees if tree.isDef)
- assert(ownerMatches(tree.symbol.owner, ctx.owner),
- i"bad owner; $tree has owner ${tree.symbol.owner}, expected was ${ctx.owner}")
+ for (tree <- trees if tree.isDef) checkOwner(tree)
super.index(trees)
}