summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2012-02-22 09:52:33 +0100
committerMartin Odersky <odersky@gmail.com>2012-02-22 09:52:33 +0100
commit19a48510c2e18430a35319c04dfe3bad7119f23f (patch)
treedace319b4a13cc9ab0351155975929901663fd47 /src
parentcae87f6797efa22aef043b4a586456735c1c6c31 (diff)
downloadscala-19a48510c2e18430a35319c04dfe3bad7119f23f.tar.gz
scala-19a48510c2e18430a35319c04dfe3bad7119f23f.tar.bz2
scala-19a48510c2e18430a35319c04dfe3bad7119f23f.zip
Made changeOwner more robust; now also deals with return expressions.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/internal/Trees.scala14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/compiler/scala/reflect/internal/Trees.scala b/src/compiler/scala/reflect/internal/Trees.scala
index 4ae8b0d5ac..5ef7ee3a27 100644
--- a/src/compiler/scala/reflect/internal/Trees.scala
+++ b/src/compiler/scala/reflect/internal/Trees.scala
@@ -133,7 +133,7 @@ trait Trees extends api.Trees { self: SymbolTable =>
new ChangeOwnerTraverser(oldOwner, newOwner) apply t
}
}
-
+
def substTreeSyms(pairs: (Symbol, Symbol)*): Tree =
substTreeSyms(pairs.map(_._1).toList, pairs.map(_._2).toList)
@@ -305,10 +305,14 @@ trait Trees extends api.Trees { self: SymbolTable =>
}
class ChangeOwnerTraverser(val oldowner: Symbol, val newowner: Symbol) extends Traverser {
- def changeOwner(tree: Tree) = {
- if ((tree.isDef || tree.isInstanceOf[Function]) &&
- tree.symbol != NoSymbol && tree.symbol.owner == oldowner)
- tree.symbol.owner = newowner
+ def changeOwner(tree: Tree) = tree match {
+ case Return(expr) =>
+ if (tree.symbol == oldowner)
+ tree.symbol = newowner
+ case _: DefTree | _: Function =>
+ if (tree.symbol != NoSymbol && tree.symbol.owner == oldowner)
+ tree.symbol.owner = newowner
+ case _ =>
}
override def traverse(tree: Tree) {
changeOwner(tree)