/// <summary> /// Enumerates all nodes of the tree rooted by this node (including this node). /// </summary> internal IEnumerable <GreenNode> EnumerateNodes() { yield return(this); Stack <Syntax.InternalSyntax.ChildSyntaxList.Enumerator> stack = new Stack <Syntax.InternalSyntax.ChildSyntaxList.Enumerator>(24); stack.Push(this.ChildNodesAndTokens().GetEnumerator()); while (stack.Count > 0) { Syntax.InternalSyntax.ChildSyntaxList.Enumerator en = stack.Pop(); if (!en.MoveNext()) { // no more down this branch continue; } GreenNode current = en.Current; stack.Push(en); // put it back on stack (struct enumerator) yield return(current); if (!current.IsToken) { // not token, so consider children stack.Push(current.ChildNodesAndTokens().GetEnumerator()); continue; } } }