SyntaxTreeNodeCollection GetModifiedSubNodes(SyntaxTreeNode node) { SyntaxTreeNodeCollection modifiedSubNodes = null; //lazy for (int i = 0; i < node.SubNodes.Count; i++) { var subNode = node.SubNodes[i]; var replacement = Visit(subNode); if (replacement != subNode) { if (modifiedSubNodes == null) //lazy init { modifiedSubNodes = new SyntaxTreeNodeCollection(); for (int j = 0; j < i; j++) //copy unmodified nodes { modifiedSubNodes.Add(node.SubNodes[j]); } } if (replacement != null) //insert replacement { modifiedSubNodes.Add(replacement); } } else { if (modifiedSubNodes != null) //only insert unmodified subnode if the lazy collection has been initialized { modifiedSubNodes.Add(subNode); } } } return(modifiedSubNodes); }
protected SyntaxTreeNode() { SubNodes = new SyntaxTreeNodeCollection(); }