Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilCloneVisitor.cs / 1 / QilCloneVisitor.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml; using System.Xml.Xsl; namespace System.Xml.Xsl.Qil { // Create an exact replica of a QIL graph internal class QilCloneVisitor : QilScopedVisitor { private QilFactory fac; private SubstitutionList subs; //----------------------------------------------- // Constructors //----------------------------------------------- public QilCloneVisitor(QilFactory fac) : this(fac, new SubstitutionList()) { } public QilCloneVisitor(QilFactory fac, SubstitutionList subs) { this.fac = fac; this.subs = subs; } //----------------------------------------------- // Entry //----------------------------------------------- public QilNode Clone(QilNode node) { // Assume that iterator nodes at the top-level are references rather than definitions return VisitAssumeReference(node); } //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode Visit(QilNode oldNode) { QilNode newNode = null; if (oldNode == null) return null; // ShallowClone any nodes which have not yet been cloned if (oldNode is QilReference) { // Reference nodes may have been cloned previously and put into scope newNode = FindClonedReference(oldNode); } if (newNode == null) newNode = oldNode.ShallowClone(this.fac); return base.Visit(newNode); } ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode VisitChildren(QilNode parent) { // Visit children for (int i = 0; i < parent.Count; i++) { QilNode child = parent[i]; // If child is a reference, if (IsReference(parent, i)) { // Visit the reference and substitute its copy parent[i] = VisitReference(child); // If no substutition found, then use original child if (parent[i] == null) parent[i] = child; } else { // Otherwise, visit the node and substitute its copy parent[i] = Visit(child); } } return parent; } ////// If a cloned reference is in scope, replace "oldNode". Otherwise, return "oldNode". /// protected override QilNode VisitReference(QilNode oldNode) { QilNode newNode = FindClonedReference(oldNode); return base.VisitReference(newNode == null ? oldNode : newNode); } //----------------------------------------------- // QilScopedVisitor methods //----------------------------------------------- ////// Push node and its shallow clone onto the substitution list. /// protected override void BeginScope(QilNode node) { this.subs.AddSubstitutionPair(node, node.ShallowClone(this.fac)); } ////// Pop entry from substitution list. /// protected override void EndScope(QilNode node) { this.subs.RemoveLastSubstitutionPair(); } //----------------------------------------------- // QilCloneVisitor methods //----------------------------------------------- ////// Find the clone of an in-scope reference. /// protected QilNode FindClonedReference(QilNode node) { return this.subs.FindReplacement(node); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml; using System.Xml.Xsl; namespace System.Xml.Xsl.Qil { // Create an exact replica of a QIL graph internal class QilCloneVisitor : QilScopedVisitor { private QilFactory fac; private SubstitutionList subs; //----------------------------------------------- // Constructors //----------------------------------------------- public QilCloneVisitor(QilFactory fac) : this(fac, new SubstitutionList()) { } public QilCloneVisitor(QilFactory fac, SubstitutionList subs) { this.fac = fac; this.subs = subs; } //----------------------------------------------- // Entry //----------------------------------------------- public QilNode Clone(QilNode node) { // Assume that iterator nodes at the top-level are references rather than definitions return VisitAssumeReference(node); } //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode Visit(QilNode oldNode) { QilNode newNode = null; if (oldNode == null) return null; // ShallowClone any nodes which have not yet been cloned if (oldNode is QilReference) { // Reference nodes may have been cloned previously and put into scope newNode = FindClonedReference(oldNode); } if (newNode == null) newNode = oldNode.ShallowClone(this.fac); return base.Visit(newNode); } ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode VisitChildren(QilNode parent) { // Visit children for (int i = 0; i < parent.Count; i++) { QilNode child = parent[i]; // If child is a reference, if (IsReference(parent, i)) { // Visit the reference and substitute its copy parent[i] = VisitReference(child); // If no substutition found, then use original child if (parent[i] == null) parent[i] = child; } else { // Otherwise, visit the node and substitute its copy parent[i] = Visit(child); } } return parent; } ////// If a cloned reference is in scope, replace "oldNode". Otherwise, return "oldNode". /// protected override QilNode VisitReference(QilNode oldNode) { QilNode newNode = FindClonedReference(oldNode); return base.VisitReference(newNode == null ? oldNode : newNode); } //----------------------------------------------- // QilScopedVisitor methods //----------------------------------------------- ////// Push node and its shallow clone onto the substitution list. /// protected override void BeginScope(QilNode node) { this.subs.AddSubstitutionPair(node, node.ShallowClone(this.fac)); } ////// Pop entry from substitution list. /// protected override void EndScope(QilNode node) { this.subs.RemoveLastSubstitutionPair(); } //----------------------------------------------- // QilCloneVisitor methods //----------------------------------------------- ////// Find the clone of an in-scope reference. /// protected QilNode FindClonedReference(QilNode node) { return this.subs.FindReplacement(node); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DropTarget.cs
- PlatformCulture.cs
- ThicknessConverter.cs
- _UriSyntax.cs
- EntityRecordInfo.cs
- ActiveXHost.cs
- XmlDataProvider.cs
- EncryptedData.cs
- TextProperties.cs
- CheckedPointers.cs
- Event.cs
- TextDecorationCollectionConverter.cs
- cookiecollection.cs
- CircleHotSpot.cs
- StyleBamlTreeBuilder.cs
- FontDifferentiator.cs
- WindowsGraphics.cs
- TextEndOfSegment.cs
- ArrayTypeMismatchException.cs
- FacetValueContainer.cs
- SecurityChannelFaultConverter.cs
- DBSchemaTable.cs
- _NetRes.cs
- FilterQueryOptionExpression.cs
- XmlSerializerFactory.cs
- CodeBlockBuilder.cs
- ExecutionEngineException.cs
- SerializationSectionGroup.cs
- OdbcCommand.cs
- WindowsAuthenticationModule.cs
- HtmlElement.cs
- MeasureData.cs
- ToolTipAutomationPeer.cs
- FillRuleValidation.cs
- PerformanceCounterManager.cs
- EntityDataSource.cs
- VBCodeProvider.cs
- DesignerForm.cs
- TypeDependencyAttribute.cs
- JournalEntry.cs
- XmlAttributeCollection.cs
- FileResponseElement.cs
- SymDocumentType.cs
- ExpressionBuilderCollection.cs
- ReliableInputConnection.cs
- ParseHttpDate.cs
- OleDbRowUpdatedEvent.cs
- SplitterDesigner.cs
- NativeObjectSecurity.cs
- PackagingUtilities.cs
- StringExpressionSet.cs
- TextViewSelectionProcessor.cs
- MsmqBindingElementBase.cs
- RewritingProcessor.cs
- PasswordTextNavigator.cs
- TableSectionStyle.cs
- RegexMatchCollection.cs
- regiisutil.cs
- TimeStampChecker.cs
- CubicEase.cs
- dtdvalidator.cs
- Mutex.cs
- Vector3DAnimation.cs
- XmlTypeAttribute.cs
- TextPointer.cs
- EmptyEnumerable.cs
- DataListCommandEventArgs.cs
- Rect.cs
- PageSettings.cs
- FatalException.cs
- CallbackValidatorAttribute.cs
- RemoteTokenFactory.cs
- RunClient.cs
- exports.cs
- ListViewItem.cs
- TableRow.cs
- Point3DValueSerializer.cs
- LOSFormatter.cs
- BlobPersonalizationState.cs
- EnumerableRowCollectionExtensions.cs
- GenericEnumerator.cs
- BindingCompleteEventArgs.cs
- ToolBar.cs
- GAC.cs
- Config.cs
- XPathCompileException.cs
- MetadataItemEmitter.cs
- XsltConvert.cs
- FileUtil.cs
- Schedule.cs
- FixedSOMFixedBlock.cs
- ReceiveActivityDesignerTheme.cs
- ComNativeDescriptor.cs
- ImageAnimator.cs
- GridViewPageEventArgs.cs
- ToolZoneDesigner.cs
- SeparatorAutomationPeer.cs
- EntityClientCacheEntry.cs
- TemplateControl.cs
- CultureTableRecord.cs