summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2012-02-22 19:00:24 +0100
committerMartin Odersky <odersky@gmail.com>2012-02-22 19:00:24 +0100
commit4c151ccd186779feb4499e0b9aec1c52d4681fbf (patch)
tree0b1489cd714543e0d40dad35aebd4885529697ed /src
parent7fe2892e4207746b6473e7f0a6fab73a3288238d (diff)
downloadscala-4c151ccd186779feb4499e0b9aec1c52d4681fbf.tar.gz
scala-4c151ccd186779feb4499e0b9aec1c52d4681fbf.tar.bz2
scala-4c151ccd186779feb4499e0b9aec1c52d4681fbf.zip
Make this substituter on trees also act on types, just as the other tree substitutres do.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/internal/Trees.scala12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/compiler/scala/reflect/internal/Trees.scala b/src/compiler/scala/reflect/internal/Trees.scala
index 5ef7ee3a27..91492f973a 100644
--- a/src/compiler/scala/reflect/internal/Trees.scala
+++ b/src/compiler/scala/reflect/internal/Trees.scala
@@ -348,10 +348,16 @@ trait Trees extends api.Trees { self: SymbolTable =>
override def toString = substituterString("Symbol", "Tree", from, to)
}
+ /** Substitute clazz.this with `to`. `to` must be an attributed tree.
+ */
class ThisSubstituter(clazz: Symbol, to: => Tree) extends Transformer {
- override def transform(tree: Tree) = tree match {
- case This(_) if tree.symbol == clazz => to
- case _ => super.transform(tree)
+ val newtpe = to.tpe
+ override def transform(tree: Tree) = {
+ if (tree.tpe ne null) tree.tpe = tree.tpe.substThis(clazz, newtpe)
+ tree match {
+ case This(_) if tree.symbol == clazz => to
+ case _ => super.transform(tree)
+ }
}
}