aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-09-25 13:25:06 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-10-11 06:38:11 +0200
commit543ff7f4123ded7172fd6ede59f09945efd7c158 (patch)
tree1c14165b391ca2b6de15f5a584fc804474ada13e /src/dotty/tools/dotc/transform/TreeChecker.scala
parent167581469779cabc7138427d506a16507369cbf5 (diff)
downloaddotty-543ff7f4123ded7172fd6ede59f09945efd7c158.tar.gz
dotty-543ff7f4123ded7172fd6ede59f09945efd7c158.tar.bz2
dotty-543ff7f4123ded7172fd6ede59f09945efd7c158.zip
Make changeOwner more robust regarding non-standard owner chains
The problem is running changeOwner(from, to) where - from is a ValDef or a Label - an embedded definition has as owner not `from` but some owner of `from`. We allow such denomrlaized owners and the pattern matcher generates them. This patch makes changeOwner take these situations into account.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index cf32df61b..ef5baca07 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -97,14 +97,13 @@ class TreeChecker {
}
private def checkOwner(tree: untpd.Tree)(implicit ctx: Context): Unit = {
- def ownerMatches(symOwner: Symbol, ctxOwner: Symbol): Boolean = {
+ def ownerMatches(symOwner: Symbol, ctxOwner: Symbol): Boolean =
symOwner == ctxOwner ||
- ctxOwner.isTerm && (!(ctxOwner is Method | Lazy | Mutable) || (ctxOwner is Label)) &&
- ownerMatches(symOwner, ctxOwner.owner)
- }
+ ctxOwner.isWeakOwner && ownerMatches(symOwner, ctxOwner.owner)
if(!ownerMatches(tree.symbol.owner, ctx.owner)) {
assert(ownerMatches(tree.symbol.owner, ctx.owner),
- i"bad owner; ${tree.symbol} has owner ${tree.symbol.owner}, expected was ${ctx.owner}")
+ i"bad owner; ${tree.symbol} has owner ${tree.symbol.owner}, expected was ${ctx.owner}\n" +
+ i"owner chain = ${tree.symbol.ownersIterator.toList}%, %, ctxOwners = ${ctx.outersIterator.map(_.owner).toList}%, %")
}
}
@@ -123,7 +122,11 @@ class TreeChecker {
* of a helper value without having to do a change owner traversal of the expression.
*/
override def typedStats(trees: List[untpd.Tree], exprOwner: Symbol)(implicit ctx: Context): List[Tree] = {
- for (tree <- trees if tree.isDef) checkOwner(tree)
+ for (tree <- trees) tree match {
+ case tree: untpd.DefTree => checkOwner(tree)
+ case _: untpd.Thicket => assert(false, "unexpanded thicket in statement sequence")
+ case _ =>
+ }
super.typedStats(trees, exprOwner)
}