public virtual SymArgument MakeArgument(SymNode aLevelToMakeArgumentsFrom) { SymArgument argument = new SymArgument(); // Convert (recursively) any emitted elements to real tokens if (aLevelToMakeArgumentsFrom is SymTokenBalancerMarkerLevelNode) { SymTokenBalancerMarkerLevelNode levelNode = (SymTokenBalancerMarkerLevelNode)aLevelToMakeArgumentsFrom; levelNode.ConvertEmittedElementsToRealTokenNodes(true /*recurse*/); } // Now actually obtain the argument tokens int count = aLevelToMakeArgumentsFrom.ChildCount; int i = 0; // while (i < count) { SymNode n = aLevelToMakeArgumentsFrom[0]; // We always remove any other nodes, irrespective of their type. // This is to ensure that the document tree does not get cluttered // with redundant argument token info. n.Remove(); // Now we decide what to do... if (n is SymTokenBalancerMarkerArgumentNode) { // We've reached the argument itself. This is the // signal to stop processing. We remove the argument node // since its not relevant to the production of the tree. break; } else if (n is SymTokenBalancerMarkerLevelNode) { // Create a new sub-argument node and copy over the // children. SymTokenBalancerMarkerLevelNode levelNode = (SymTokenBalancerMarkerLevelNode)n; SymArgumentSubLevel subLevel = levelNode.AsArgumentSubLevel(true); argument.CurrentNode.Add(subLevel); } else if (n is SymTokenBalancerNodeEmittedElement) { System.Diagnostics.Debug.Assert(false); // shouldn't get here anymore! } else if (n is SymNodeToken) { // Node is implicitly removed since it transfers // from one tree to another. argument.CurrentNode.Add(n); } count = aLevelToMakeArgumentsFrom.ChildCount; } // SymTokenUtils.RemoveWhiteSpace(argument, true); return(argument); }
public SymArgumentSubLevel AsArgumentSubLevel(bool aRecurse) { SymArgumentSubLevel ret = new SymArgumentSubLevel(this); // if (aRecurse) { foreach (SymNode child in ret) { if (child is SymTokenBalancerMarkerLevelNode) { SymTokenBalancerMarkerLevelNode markerNode = (SymTokenBalancerMarkerLevelNode)child; SymArgumentSubLevel subLevel = markerNode.AsArgumentSubLevel(aRecurse); ret.InsertChild(subLevel, markerNode); markerNode.Remove(); } } } // return(ret); }