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
- brushes.cs
- CaseInsensitiveOrdinalStringComparer.cs
- HeaderUtility.cs
- Profiler.cs
- Enumerable.cs
- WebResourceAttribute.cs
- Dictionary.cs
- XamlVector3DCollectionSerializer.cs
- XamlSerializerUtil.cs
- DataSourceHelper.cs
- Triplet.cs
- DrawingGroupDrawingContext.cs
- HtmlContainerControl.cs
- XmlUtf8RawTextWriter.cs
- Trigger.cs
- DoubleStorage.cs
- NullReferenceException.cs
- StickyNoteHelper.cs
- SharedPersonalizationStateInfo.cs
- Point.cs
- GeometryDrawing.cs
- Pen.cs
- SignatureGenerator.cs
- GeometryHitTestParameters.cs
- ParseNumbers.cs
- SettingsPropertyValue.cs
- InternalMappingException.cs
- Currency.cs
- Attributes.cs
- EdmType.cs
- RequestBringIntoViewEventArgs.cs
- SmiEventStream.cs
- BitStream.cs
- PropVariant.cs
- ScrollViewer.cs
- shaperfactoryquerycachekey.cs
- BinaryUtilClasses.cs
- CryptographicAttribute.cs
- DropShadowBitmapEffect.cs
- SqlCommandBuilder.cs
- Rotation3DAnimation.cs
- NamedPipeAppDomainProtocolHandler.cs
- RijndaelManagedTransform.cs
- DesignerWithHeader.cs
- EntityPropertyMappingAttribute.cs
- SrgsSemanticInterpretationTag.cs
- DbDataReader.cs
- CompilerErrorCollection.cs
- StringBuilder.cs
- TextElementCollection.cs
- FormsAuthenticationConfiguration.cs
- DiscoveryDocumentSerializer.cs
- RequestResizeEvent.cs
- ExeConfigurationFileMap.cs
- StrokeCollectionDefaultValueFactory.cs
- Encoder.cs
- MtomMessageEncodingBindingElement.cs
- PingReply.cs
- DataViewSettingCollection.cs
- DebugHandleTracker.cs
- MouseActionConverter.cs
- VariantWrapper.cs
- ProtocolsConfigurationEntry.cs
- EventSinkActivityDesigner.cs
- SizeFConverter.cs
- securitycriticaldataformultiplegetandset.cs
- XmlNamedNodeMap.cs
- ByteAnimationBase.cs
- BaseTransportHeaders.cs
- HtmlTableCell.cs
- MessageFilterTable.cs
- WebExceptionStatus.cs
- CipherData.cs
- TypeFieldSchema.cs
- WebRequestModulesSection.cs
- ValidationErrorEventArgs.cs
- AnchoredBlock.cs
- DataGridColumnCollection.cs
- PackageProperties.cs
- XPathNodeHelper.cs
- EventPropertyMap.cs
- WindowPattern.cs
- DebugViewWriter.cs
- Attributes.cs
- XmlILTrace.cs
- EventLogHandle.cs
- StateMachineWorkflowDesigner.cs
- TripleDESCryptoServiceProvider.cs
- HashRepartitionStream.cs
- IteratorFilter.cs
- MembershipUser.cs
- CharacterShapingProperties.cs
- PointLightBase.cs
- IgnorePropertiesAttribute.cs
- CaseInsensitiveHashCodeProvider.cs
- IconEditor.cs
- GridItemCollection.cs
- FormattedTextSymbols.cs
- EntityContainer.cs
- SHA256CryptoServiceProvider.cs