aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-24 15:28:11 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-24 17:50:52 +0200
commit412fc2ce472acf8b59dba05ee96d3c09a6bb2d41 (patch)
tree3edcbe0ebee4a499dae3ff0cd6697d924f395383 /src/dotty/tools/dotc
parent3d92b75223d0f2d7391e1da1a1b011079ab34c97 (diff)
downloaddotty-412fc2ce472acf8b59dba05ee96d3c09a6bb2d41.tar.gz
dotty-412fc2ce472acf8b59dba05ee96d3c09a6bb2d41.tar.bz2
dotty-412fc2ce472acf8b59dba05ee96d3c09a6bb2d41.zip
Move foreachSubTreeOf of to tpd.
Reason: The tree traverser created by it only handles the cases for typed tree nodes. Also add convenience existsSubTreeOf combinator.
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r--src/dotty/tools/dotc/ast/Trees.scala9
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala16
2 files changed, 16 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala
index 9803f8ac1..8d243a0cb 100644
--- a/src/dotty/tools/dotc/ast/Trees.scala
+++ b/src/dotty/tools/dotc/ast/Trees.scala
@@ -925,15 +925,6 @@ object Trees {
case ys => Thicket(ys)
}
- // ----- Position handling -----------------------------------------
-
- def foreachSubTreeOf(tree: Tree)(f: Tree => Unit): Unit = {
- val traverser = new TreeTraverser {
- def traverse(tree: Tree) = foldOver(f(tree), tree)
- }
- traverser.traverse(tree)
- }
-
// ----- Helper classes for copying, transforming, accumulating -----------------
val cpy: TreeCopier
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index 7cdd8b7ac..5a9198adc 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -331,6 +331,22 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
} else foldOver(sym, tree)
}
+ // --- Higher order traversal methods -------------------------------
+
+ def foreachSubTreeOf(tree: Tree)(f: Tree => Unit): Unit = { //TODO should go in tpd.
+ val traverser = new TreeTraverser {
+ def traverse(tree: Tree) = foldOver(f(tree), tree)
+ }
+ traverser.traverse(tree)
+ }
+
+ def existsSubTreeOf(tree: Tree)(p: Tree => Boolean): Boolean = {
+ val acc = new TreeAccumulator[Boolean] {
+ def apply(x: Boolean, t: Tree) = x || p(t) || foldOver(x, t)
+ }
+ acc(false, tree)
+ }
+
override val cpy = new TypedTreeCopier
class TypedTreeCopier extends TreeCopier {