diff options
author | Martin Odersky <odersky@gmail.com> | 2014-08-24 15:28:11 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-08-24 17:50:52 +0200 |
commit | 412fc2ce472acf8b59dba05ee96d3c09a6bb2d41 (patch) | |
tree | 3edcbe0ebee4a499dae3ff0cd6697d924f395383 /src/dotty/tools/dotc | |
parent | 3d92b75223d0f2d7391e1da1a1b011079ab34c97 (diff) | |
download | dotty-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.scala | 9 | ||||
-rw-r--r-- | src/dotty/tools/dotc/ast/tpd.scala | 16 |
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 { |