Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilCloneVisitor.cs / 1305376 / 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
- ColorEditor.cs
- WebPartDisplayModeCollection.cs
- InkCanvasAutomationPeer.cs
- HttpCookieCollection.cs
- oledbmetadatacollectionnames.cs
- RequiredArgumentAttribute.cs
- ConnectionStringSettings.cs
- FlowLayoutPanel.cs
- Separator.cs
- ExternalException.cs
- RegexWriter.cs
- ControlAdapter.cs
- SapiGrammar.cs
- QilUnary.cs
- CachedPathData.cs
- EntryIndex.cs
- GridToolTip.cs
- UniqueIdentifierService.cs
- ListViewCommandEventArgs.cs
- StylusDownEventArgs.cs
- FixedTextContainer.cs
- HashHelper.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- XsdBuildProvider.cs
- MgmtConfigurationRecord.cs
- HttpApplicationFactory.cs
- IntMinMaxAggregationOperator.cs
- BooleanAnimationBase.cs
- DbConnectionPoolIdentity.cs
- AttachedPropertyMethodSelector.cs
- SHA384Managed.cs
- FilePrompt.cs
- DynamicDataRoute.cs
- InstanceData.cs
- TitleStyle.cs
- TimelineGroup.cs
- CacheEntry.cs
- ResourceProperty.cs
- WorkflowRuntimeEndpoint.cs
- DataErrorValidationRule.cs
- WorkItem.cs
- BamlRecordWriter.cs
- HelpOperationInvoker.cs
- NamespaceQuery.cs
- Parameter.cs
- TableRow.cs
- NullRuntimeConfig.cs
- SizeLimitedCache.cs
- CollectionConverter.cs
- Quaternion.cs
- Configuration.cs
- CssTextWriter.cs
- DateBoldEvent.cs
- StyleCollectionEditor.cs
- TraceEventCache.cs
- NamedElement.cs
- SqlDataSourceCache.cs
- DefaultBinder.cs
- ParserHooks.cs
- PopupEventArgs.cs
- ProfessionalColorTable.cs
- BooleanKeyFrameCollection.cs
- BezierSegment.cs
- TextCompositionManager.cs
- XmlHierarchicalDataSourceView.cs
- FrameworkElement.cs
- FrameAutomationPeer.cs
- ClientRolePrincipal.cs
- PublishLicense.cs
- ObjectKeyFrameCollection.cs
- SqlDataSource.cs
- TextBoxBase.cs
- RenderingBiasValidation.cs
- Imaging.cs
- SqlGenericUtil.cs
- View.cs
- DataControlLinkButton.cs
- XmlComment.cs
- AppearanceEditorPart.cs
- regiisutil.cs
- Enum.cs
- SafeNativeMethods.cs
- PropertyChangedEventArgs.cs
- GeneralTransform.cs
- RegionInfo.cs
- HandledEventArgs.cs
- BoundsDrawingContextWalker.cs
- clipboard.cs
- SqlParameter.cs
- Context.cs
- DynamicEntity.cs
- RuntimeResourceSet.cs
- WSFederationHttpBindingCollectionElement.cs
- ProviderSettings.cs
- ItemAutomationPeer.cs
- SystemFonts.cs
- HandlerBase.cs
- SettingsContext.cs
- ContainerAction.cs
- PanningMessageFilter.cs