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();
+ }
+ }
+ }
+ }
}