diff options
author | Martin Odersky <odersky@gmail.com> | 2014-09-25 13:25:06 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-10-11 06:38:11 +0200 |
commit | 543ff7f4123ded7172fd6ede59f09945efd7c158 (patch) | |
tree | 1c14165b391ca2b6de15f5a584fc804474ada13e /src/dotty/tools/dotc/transform/TreeChecker.scala | |
parent | 167581469779cabc7138427d506a16507369cbf5 (diff) | |
download | dotty-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.scala | 15 |
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) } |