diff options
author | Martin Odersky <odersky@gmail.com> | 2014-08-18 13:37:16 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-08-18 13:37:16 +0200 |
commit | ea616bf0b9f5c62d1f5a7b5b16b98cfac3c9ca1d (patch) | |
tree | 789fc813d61de41d3165e3cdc153d3e7dc3796a6 /src/dotty/tools/dotc/transform/TreeChecker.scala | |
parent | 0f6a277d3ab17f7d7011a3a29833a4ed12bb30ff (diff) | |
download | dotty-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.scala | 24 |
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) } |