Beispiel #1
0
        /// <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;
                }
            }
        }