diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/XmlParser/RawObjects.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/XmlParser/RawObjects.cs index ee250fefce..5766197e6f 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/XmlParser/RawObjects.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/XmlParser/RawObjects.cs @@ -287,10 +287,7 @@ namespace ICSharpCode.AvalonEdit.XmlParser /// public override IEnumerable GetSelfAndAllChildren() { - return Enumerable.Union( - new RawContainer[] { this }, - this.Children.SelectMany(x => x.GetSelfAndAllChildren()) - ); + return new RawObject[] { this }.Flatten(i => i is RawContainer ? ((RawContainer)i).Children : null); } /// @@ -979,4 +976,37 @@ namespace ICSharpCode.AvalonEdit.XmlParser return string.Format("[{0} Text.Length={1}]", base.ToString(), this.EscapedValue.Length); } } + + static class ExtensionMethods + { + // Copied from ICSharpCode.SharpDevelop.Dom.ExtensionMethods + /// + /// Converts a recursive data structure into a flat list. + /// + /// The root elements of the recursive data structure. + /// The function that gets the children of an element. + /// Iterator that enumerates the tree structure in preorder. + public static IEnumerable Flatten(this IEnumerable input, Func> recursion) + { + Stack> stack = new Stack>(); + try { + stack.Push(input.GetEnumerator()); + while (stack.Count > 0) { + while (stack.Peek().MoveNext()) { + T element = stack.Peek().Current; + yield return element; + IEnumerable children = recursion(element); + if (children != null) { + stack.Push(children.GetEnumerator()); + } + } + stack.Pop().Dispose(); + } + } finally { + while (stack.Count > 0) { + stack.Pop().Dispose(); + } + } + } + } }