diff options
Diffstat (limited to 'src/dotty/tools/dotc/ast')
-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 { |