Skip to content

Commit c3078b1

Browse files
committed
Make foreach/exsists into tree infix methods
foreachSubTree and existsSubTree are now infix methods. Streamlines their use somewhat.
1 parent b58b906 commit c3078b1

File tree

3 files changed

+19
-19
lines changed

3 files changed

+19
-19
lines changed

src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -356,22 +356,6 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
356356
} else foldOver(sym, tree)
357357
}
358358

359-
// --- Higher order traversal methods -------------------------------
360-
361-
def foreachSubTreeOf(tree: Tree)(f: Tree => Unit): Unit = { //TODO should go in tpd.
362-
val traverser = new TreeTraverser {
363-
def traverse(tree: Tree) = foldOver(f(tree), tree)
364-
}
365-
traverser.traverse(tree)
366-
}
367-
368-
def existsSubTreeOf(tree: Tree)(p: Tree => Boolean): Boolean = {
369-
val acc = new TreeAccumulator[Boolean] {
370-
def apply(x: Boolean, t: Tree) = x || p(t) || foldOver(x, t)
371-
}
372-
acc(false, tree)
373-
}
374-
375359
override val cpy = new TypedTreeCopier
376360

377361
class TypedTreeCopier extends TreeCopier {
@@ -583,6 +567,22 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
583567

584568
def or(that: Tree)(implicit ctx: Context): Tree =
585569
tree.select(defn.Boolean_||).appliedTo(that)
570+
571+
// --- Higher order traversal methods -------------------------------
572+
573+
def foreachSubTree(f: Tree => Unit): Unit = { //TODO should go in tpd.
574+
val traverser = new TreeTraverser {
575+
def traverse(tree: Tree) = foldOver(f(tree), tree)
576+
}
577+
traverser.traverse(tree)
578+
}
579+
580+
def existsSubTree(p: Tree => Boolean): Boolean = {
581+
val acc = new TreeAccumulator[Boolean] {
582+
def apply(x: Boolean, t: Tree) = x || p(t) || foldOver(x, t)
583+
}
584+
acc(false, tree)
585+
}
586586
}
587587

588588
implicit class ListOfTreeDecorator(val xs: List[tpd.Tree]) extends AnyVal {

src/dotty/tools/dotc/transform/ExplicitOuter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf
8585
val isTrait = cls.is(Trait)
8686
if (needsOuterIfReferenced(cls) &&
8787
!needsOuterAlways(cls) &&
88-
existsSubTreeOf(impl)(referencesOuter(cls, _)))
88+
impl.existsSubTree(referencesOuter(cls, _)))
8989
newOuterAccessors(cls).foreach(_.enteredAfter(thisTransformer))
9090
if (hasOuter(cls)) {
9191
val newDefs = new mutable.ListBuffer[Tree]

src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
615615
def typedCase(tree: untpd.CaseDef): CaseDef = track("typedCase") {
616616
def caseRest(pat: Tree)(implicit ctx: Context) = {
617617
gadtSyms foreach (_.resetGADTFlexType)
618-
foreachSubTreeOf(pat) {
618+
pat foreachSubTree {
619619
case b: Bind =>
620620
if (ctx.scope.lookup(b.name) == NoSymbol) ctx.enter(b.symbol)
621621
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
732732
def checkRef(tree: Tree, sym: Symbol) =
733733
if (sym.maybeOwner == refineCls && tree.pos.start <= sym.pos.end)
734734
ctx.error("illegal forward reference in refinement", tree.pos)
735-
foreachSubTreeOf(refinement) {
735+
refinement foreachSubTree {
736736
case tree: RefTree => checkRef(tree, tree.symbol)
737737
case tree: TypeTree => checkRef(tree, tree.tpe.typeSymbol)
738738
case _ =>

0 commit comments

Comments
 (0)