aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-09-06 11:38:55 +0200
committerMartin Odersky <odersky@gmail.com>2014-09-06 11:39:45 +0200
commitc3078b12582773e3a9bb356e168fb646ec6733b1 (patch)
tree26a03cbee889413c4300eab15fe27fa07ef8322d /src
parentb58b90683652e1b6e2c32412f0a03ba614b61b33 (diff)
downloaddotty-c3078b12582773e3a9bb356e168fb646ec6733b1.tar.gz
dotty-c3078b12582773e3a9bb356e168fb646ec6733b1.tar.bz2
dotty-c3078b12582773e3a9bb356e168fb646ec6733b1.zip
Make foreach/exsists into tree infix methods
foreachSubTree and existsSubTree are now infix methods. Streamlines their use somewhat.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala32
-rw-r--r--src/dotty/tools/dotc/transform/ExplicitOuter.scala2
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala4
3 files changed, 19 insertions, 19 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index 175a6b37e..c1c274ae8 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -356,22 +356,6 @@ 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 {
@@ -583,6 +567,22 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
def or(that: Tree)(implicit ctx: Context): Tree =
tree.select(defn.Boolean_||).appliedTo(that)
+
+ // --- Higher order traversal methods -------------------------------
+
+ def foreachSubTree(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 existsSubTree(p: Tree => Boolean): Boolean = {
+ val acc = new TreeAccumulator[Boolean] {
+ def apply(x: Boolean, t: Tree) = x || p(t) || foldOver(x, t)
+ }
+ acc(false, tree)
+ }
}
implicit class ListOfTreeDecorator(val xs: List[tpd.Tree]) extends AnyVal {
diff --git a/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/src/dotty/tools/dotc/transform/ExplicitOuter.scala
index d13598819..f910f49d0 100644
--- a/src/dotty/tools/dotc/transform/ExplicitOuter.scala
+++ b/src/dotty/tools/dotc/transform/ExplicitOuter.scala
@@ -85,7 +85,7 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf
val isTrait = cls.is(Trait)
if (needsOuterIfReferenced(cls) &&
!needsOuterAlways(cls) &&
- existsSubTreeOf(impl)(referencesOuter(cls, _)))
+ impl.existsSubTree(referencesOuter(cls, _)))
newOuterAccessors(cls).foreach(_.enteredAfter(thisTransformer))
if (hasOuter(cls)) {
val newDefs = new mutable.ListBuffer[Tree]
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 9c5fb09b0..1823b09fa 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -615,7 +615,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def typedCase(tree: untpd.CaseDef): CaseDef = track("typedCase") {
def caseRest(pat: Tree)(implicit ctx: Context) = {
gadtSyms foreach (_.resetGADTFlexType)
- foreachSubTreeOf(pat) {
+ pat foreachSubTree {
case b: Bind =>
if (ctx.scope.lookup(b.name) == NoSymbol) ctx.enter(b.symbol)
else ctx.error(d"duplicate pattern variable: ${b.name}", b.pos)
@@ -732,7 +732,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def checkRef(tree: Tree, sym: Symbol) =
if (sym.maybeOwner == refineCls && tree.pos.start <= sym.pos.end)
ctx.error("illegal forward reference in refinement", tree.pos)
- foreachSubTreeOf(refinement) {
+ refinement foreachSubTree {
case tree: RefTree => checkRef(tree, tree.symbol)
case tree: TypeTree => checkRef(tree, tree.tpe.typeSymbol)
case _ =>