Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PixelFormatConverter.cs
- FrameAutomationPeer.cs
- ExportOptions.cs
- DateTimePicker.cs
- RoamingStoreFileUtility.cs
- ListControlConvertEventArgs.cs
- AnnotationHelper.cs
- XslException.cs
- RadialGradientBrush.cs
- StylusCollection.cs
- TextBoxView.cs
- Margins.cs
- SafeCryptContextHandle.cs
- UnsafeNativeMethods.cs
- FontFamily.cs
- SynchronousChannel.cs
- ErrorStyle.cs
- ellipse.cs
- CommentGlyph.cs
- Popup.cs
- CallTemplateAction.cs
- BuildProviderUtils.cs
- EntityStoreSchemaGenerator.cs
- WpfSharedXamlSchemaContext.cs
- CharUnicodeInfo.cs
- MiniCustomAttributeInfo.cs
- CodePageUtils.cs
- SymLanguageVendor.cs
- XmlHierarchyData.cs
- ViewBase.cs
- EncoderNLS.cs
- SchemaElement.cs
- SortExpressionBuilder.cs
- DbCommandDefinition.cs
- HttpCachePolicyElement.cs
- LineSegment.cs
- RelatedCurrencyManager.cs
- DialogResultConverter.cs
- MediaSystem.cs
- DrawingAttributes.cs
- ListView.cs
- EntityCommandCompilationException.cs
- WindowsGraphics.cs
- DetailsViewPagerRow.cs
- GeneralTransformGroup.cs
- EndpointAddressMessageFilterTable.cs
- CompensatableTransactionScopeActivityDesigner.cs
- ThreadAttributes.cs
- CodeAttributeDeclarationCollection.cs
- EntityExpressionVisitor.cs
- BindingValueChangedEventArgs.cs
- Error.cs
- SQLDoubleStorage.cs
- HitTestWithGeometryDrawingContextWalker.cs
- BitmapEffectInputData.cs
- WebUtility.cs
- CannotUnloadAppDomainException.cs
- OneOfScalarConst.cs
- UniformGrid.cs
- SoapFault.cs
- PrintControllerWithStatusDialog.cs
- RawAppCommandInputReport.cs
- HtmlFormWrapper.cs
- MobileListItem.cs
- DataDocumentXPathNavigator.cs
- QuaternionRotation3D.cs
- Soap11ServerProtocol.cs
- NavigateEvent.cs
- ImageListStreamer.cs
- ModelItemImpl.cs
- ConfigurationManagerInternal.cs
- SystemIPv4InterfaceProperties.cs
- HttpDigestClientElement.cs
- MemberDescriptor.cs
- AlphaSortedEnumConverter.cs
- ConnectionStringsExpressionBuilder.cs
- TrackingMemoryStream.cs
- Imaging.cs
- ContextMarshalException.cs
- Visual3D.cs
- RsaElement.cs
- ColorDialog.cs
- DataControlButton.cs
- Attributes.cs
- ScriptResourceHandler.cs
- EntryPointNotFoundException.cs
- ServicePointManager.cs
- SqlBinder.cs
- SemaphoreFullException.cs
- ModelTreeEnumerator.cs
- SchemaConstraints.cs
- PageFunction.cs
- SyndicationCategory.cs
- Rect3DValueSerializer.cs
- CodeTypeMember.cs
- ObjectSet.cs
- QueueSurrogate.cs
- XmlAttribute.cs
- MsmqAppDomainProtocolHandler.cs
- DetailsViewDeletedEventArgs.cs