@@ -13,7 +13,6 @@ import viper.silver.ast.utility.rewriter.Traverse.Traverse
1313import viper .silver .ast .utility .rewriter .{Rewritable , StrategyBuilder , Traverse }
1414import viper .silver .verifier .errors .ErrorNode
1515import viper .silver .verifier .{AbstractVerificationError , ConsistencyError , ErrorReason }
16- import scala .language .reflectiveCalls
1716
1817/*
1918
@@ -49,7 +48,7 @@ Some design choices:
4948 * Note that all but Program are transitive subtypes of `Node` via `Hashable`. The reason is
5049 * that AST node hashes may depend on the entire program, not just their sub-AST.
5150 */
52- trait Node extends Iterable [Node ] with Rewritable {
51+ trait Node extends Traversable [Node ] with Rewritable {
5352
5453 /** @see [[Nodes.subnodes() ]] */
5554 def subnodes = Nodes .subnodes(this )
@@ -62,23 +61,7 @@ trait Node extends Iterable[Node] with Rewritable {
6261 Visitor .reduceWithContext(this , Nodes .subnodes)(context, enter, combine)
6362 }
6463
65- override def iterator : Iterator [Node ] = {
66- val iterator = new Iterator [Node ] {
67- var remaining = Seq .empty[Node ]
68-
69- override def hasNext : Boolean = remaining.nonEmpty
70-
71- override def next (): Node = {
72- val result = remaining.head
73- remaining = remaining.tail
74- result
75- }
76- }
77-
78- Visitor .visit(this , Nodes .subnodes) { case n : Node => iterator.remaining ++= Seq (n) }
79-
80- iterator
81- }
64+ override def foreach [A ](f : Node => A ) = Visitor .visit(this , Nodes .subnodes) { case a : Node => f(a) }
8265
8366 /** @see [[Visitor.visit() ]] */
8467 def visit [A ](f : PartialFunction [Node , A ]): Unit = {
0 commit comments