// Returns a copy of a sibling tree. node is expected to be the first sibling. private TextTreeNode DeepCopyContainedNodes(TextTreeNode node) { TextTreeNode rootClone; TextTreeNode previousClone; TextTreeNode clone; TextTreeTextElementNode elementNode; rootClone = null; previousClone = null; do { elementNode = node as TextTreeTextElementNode; if (elementNode != null) { clone = DeepCopy(elementNode); } else { clone = node.Clone(); } // clone will be null in one case: if we're trying to clone an // empty TextNode. We can skip empty TextNodes (symbol count == 0) // because we know the clones have no TextPointer references, so // an empty node serves no purpose. Invariant.Assert(clone != null || node is TextTreeTextNode && node.SymbolCount == 0); if (clone != null) { clone.ParentNode = previousClone; if (previousClone != null) { previousClone.RightChildNode = clone; } else { Invariant.Assert(clone.Role == SplayTreeNodeRole.LocalRoot); // Remember the first clone created. rootClone = clone; } previousClone = clone; } node = (TextTreeNode)node.GetNextNode(); } while (node != null); return rootClone; }