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
- SettingsProviderCollection.cs
- Bitmap.cs
- IconConverter.cs
- AuthorizationRule.cs
- SafeCertificateStore.cs
- GZipDecoder.cs
- Internal.cs
- GridEntry.cs
- SkipQueryOptionExpression.cs
- XmlRawWriter.cs
- PersistenceTypeAttribute.cs
- StorageEndPropertyMapping.cs
- DrawingBrush.cs
- NavigationPropertySingletonExpression.cs
- ProcessModelInfo.cs
- CodeAccessPermission.cs
- BaseAppDomainProtocolHandler.cs
- WebResourceAttribute.cs
- CanonicalFormWriter.cs
- PackageStore.cs
- GetKeyedHashRequest.cs
- AttributeEmitter.cs
- MD5.cs
- connectionpool.cs
- JsonReader.cs
- XNameConverter.cs
- RangeValidator.cs
- TextDpi.cs
- WpfWebRequestHelper.cs
- ManualResetEvent.cs
- COM2Properties.cs
- IntPtr.cs
- HttpWebRequestElement.cs
- StylusPointProperties.cs
- XLinq.cs
- FontNamesConverter.cs
- FormatterServices.cs
- DesignerVerb.cs
- ScriptDescriptor.cs
- MimeTextImporter.cs
- WebContext.cs
- ListViewDeleteEventArgs.cs
- ColumnMap.cs
- UpdatePanelTriggerCollection.cs
- DateTimeFormatInfo.cs
- TypeElementCollection.cs
- DirectionalLight.cs
- TypeBuilderInstantiation.cs
- cookie.cs
- ChangeDirector.cs
- XpsFilter.cs
- ButtonBaseAutomationPeer.cs
- XpsFixedDocumentReaderWriter.cs
- URI.cs
- WindowCollection.cs
- ToolStripCodeDomSerializer.cs
- ValueConversionAttribute.cs
- MSAAEventDispatcher.cs
- CollectionDataContract.cs
- ProcessModelSection.cs
- LinkDescriptor.cs
- HwndMouseInputProvider.cs
- ChangeNode.cs
- Geometry.cs
- GCHandleCookieTable.cs
- HashAlgorithm.cs
- ContentControl.cs
- Util.cs
- FormatStringEditor.cs
- GridViewPageEventArgs.cs
- TextSelectionProcessor.cs
- PopupEventArgs.cs
- TrackingServices.cs
- PropertyEmitter.cs
- TemplateKey.cs
- HashHelper.cs
- shaperfactoryquerycacheentry.cs
- CodeMemberProperty.cs
- SoapAttributeAttribute.cs
- RedirectionProxy.cs
- serverconfig.cs
- CacheManager.cs
- SemanticTag.cs
- InternalConfigHost.cs
- Condition.cs
- IPAddressCollection.cs
- AccessViolationException.cs
- DesignerAdapterUtil.cs
- ToolStripComboBox.cs
- DeferredReference.cs
- ContextConfiguration.cs
- HandleTable.cs
- X509CertificateEndpointIdentity.cs
- BinaryExpression.cs
- CheckBox.cs
- XmlLoader.cs
- SkinBuilder.cs
- Bits.cs
- DockPattern.cs
- AnnotationComponentManager.cs