summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/Trees.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2013-01-05 00:34:39 +0300
committerEugene Burmako <xeno.by@gmail.com>2013-01-09 08:10:47 +0100
commit5660b7af199ae02a014fb200f199b58d42addde9 (patch)
tree9910170dfc504e953bbc7dc26e59ee8230b67cc9 /src/reflect/scala/reflect/internal/Trees.scala
parent75507997c79e46018e3e77a8b89d7bd72a5fac15 (diff)
downloadscala-5660b7af199ae02a014fb200f199b58d42addde9.tar.gz
scala-5660b7af199ae02a014fb200f199b58d42addde9.tar.bz2
scala-5660b7af199ae02a014fb200f199b58d42addde9.zip
adds Trees.replace(Tree, Tree)
Currently dead code. Has proven to be useful to implement type macros, therefore I'm moving it to scala.reflect.internal.Trees.
Diffstat (limited to 'src/reflect/scala/reflect/internal/Trees.scala')
-rw-r--r--src/reflect/scala/reflect/internal/Trees.scala13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala
index 308ab93c07..3c2249bfb5 100644
--- a/src/reflect/scala/reflect/internal/Trees.scala
+++ b/src/reflect/scala/reflect/internal/Trees.scala
@@ -164,6 +164,9 @@ trait Trees extends api.Trees { self: SymbolTable =>
override def substituteThis(clazz: Symbol, to: Tree): Tree =
new ThisSubstituter(clazz, to) transform this
+ def replace(from: Tree, to: Tree): Tree =
+ new TreeReplacer(from, to, positionAware = false) transform this
+
def hasSymbolWhich(f: Symbol => Boolean) =
(symbol ne null) && (symbol ne NoSymbol) && f(symbol)
@@ -1381,6 +1384,16 @@ trait Trees extends api.Trees { self: SymbolTable =>
if (tree eq orig) super.transform(tree)
else tree
}
+
+ /** A transformer that replaces tree `from` with tree `to` in a given tree */
+ class TreeReplacer(from: Tree, to: Tree, positionAware: Boolean) extends Transformer {
+ override def transform(t: Tree): Tree = {
+ if (t == from) to
+ else if (!positionAware || (t.pos includes from.pos) || t.pos.isTransparent) super.transform(t)
+ else t
+ }
+ }
+
// Create a readable string describing a substitution.
private def substituterString(fromStr: String, toStr: String, from: List[Any], to: List[Any]): String = {
"subst[%s, %s](%s)".format(fromStr, toStr, (from, to).zipped map (_ + " -> " + _) mkString ", ")