@@ -48,7 +48,7 @@ Some design choices:
4848 * Note that all but Program are transitive subtypes of `Node` via `Hashable`. The reason is
4949 * that AST node hashes may depend on the entire program, not just their sub-AST.
5050 */
51- trait Node extends Traversable [Node ] with Rewritable {
51+ trait Node extends Iterable [Node ] with Rewritable {
5252
5353 /** @see [[Nodes.subnodes() ]] */
5454 def subnodes = Nodes .subnodes(this )
@@ -61,36 +61,54 @@ trait Node extends Traversable[Node] with Rewritable {
6161 Visitor .reduceWithContext(this , Nodes .subnodes)(context, enter, combine)
6262 }
6363
64+ override def iterator : Iterator [Node ] = {
65+ val iterator = new Iterator [Node ] {
66+ var remaining = Seq [Node ]().empty
67+
68+ override def hasNext : Boolean = remaining.nonEmpty
69+
70+ override def next (): Node = {
71+ val result = remaining.head
72+ remaining = remaining.tail
73+ result
74+ }
75+ }
76+
77+ Visitor .visit(this , Nodes .subnodes) { case n : Node => iterator.remaining ++= Seq (n) }
78+
79+ iterator
80+ }
81+
6482 /** Applies the function `f` to the AST node, then visits all subnodes. */
65- def foreach [A ](f : Node => A ) = Visitor .visit(this , Nodes .subnodes) { case a : Node => f(a) }
83+ // ? override def foreach[A](f: Node => A) = Visitor.visit(this, Nodes.subnodes) { case a: Node => f(a) }
6684
6785 /** @see [[Visitor.visit() ]] */
68- def visit [A ](f : PartialFunction [Node , A ]) {
86+ def visit [A ](f : PartialFunction [Node , A ]): Unit = {
6987 Visitor .visit(this , Nodes .subnodes)(f)
7088 }
7189
7290 /** @see [[Visitor.visitWithContext() ]] */
73- def visitWithContext [C ](c : C )(f : C => PartialFunction [Node , C ]) {
91+ def visitWithContext [C ](c : C )(f : C => PartialFunction [Node , C ]): Unit = {
7492 Visitor .visitWithContext(this , Nodes .subnodes, c)(f)
7593 }
7694
7795 /** @see [[Visitor.visitWithContextManually() ]] */
78- def visitWithContextManually [C , A ](c : C )(f : C => PartialFunction [Node , A ]) {
96+ def visitWithContextManually [C , A ](c : C )(f : C => PartialFunction [Node , A ]): Unit = {
7997 Visitor .visitWithContextManually(this , Nodes .subnodes, c)(f)
8098 }
8199
82100 /** @see [[Visitor.visit() ]] */
83- def visit [A ](f1 : PartialFunction [Node , A ], f2 : PartialFunction [Node , A ]) {
101+ def visit [A ](f1 : PartialFunction [Node , A ], f2 : PartialFunction [Node , A ]): Unit = {
84102 Visitor .visit(this , Nodes .subnodes, f1, f2)
85103 }
86104
87105 /** @see [[Visitor.visitOpt() ]] */
88- def visitOpt (f : Node => Boolean ) {
106+ def visitOpt (f : Node => Boolean ): Unit = {
89107 Visitor .visitOpt(this , Nodes .subnodes)(f)
90108 }
91109
92110 /** @see [[Visitor.visitOpt() ]] */
93- def visitOpt [A ](f1 : Node => Boolean , f2 : Node => A ) {
111+ def visitOpt [A ](f1 : Node => Boolean , f2 : Node => A ): Unit = {
94112 Visitor .visitOpt(this , Nodes .subnodes, f1, f2)
95113 }
96114
0 commit comments