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
- AccessibleObject.cs
- IdentitySection.cs
- ImageKeyConverter.cs
- AssociatedControlConverter.cs
- LocatorPartList.cs
- WebServiceMethodData.cs
- DataGridView.cs
- ConnectionInterfaceCollection.cs
- InsufficientMemoryException.cs
- XmlElementList.cs
- CacheMode.cs
- Message.cs
- FrameworkRichTextComposition.cs
- ExpressionConverter.cs
- RequestQueryProcessor.cs
- PreDigestedSignedInfo.cs
- Overlapped.cs
- WebScriptEnablingElement.cs
- Funcletizer.cs
- SqlGatherProducedAliases.cs
- SqlCaseSimplifier.cs
- ClaimSet.cs
- TemplatedAdorner.cs
- MsmqIntegrationBindingElement.cs
- ExpressionEditorAttribute.cs
- PropertyFilterAttribute.cs
- WebBrowserEvent.cs
- Cursors.cs
- PackWebRequestFactory.cs
- ConfigurationSectionGroup.cs
- PersonalizationState.cs
- counter.cs
- ArglessEventHandlerProxy.cs
- UnsafeNativeMethods.cs
- BinaryWriter.cs
- ProfilePropertySettingsCollection.cs
- ForwardPositionQuery.cs
- ToolStripPanel.cs
- DaylightTime.cs
- FontFamilyValueSerializer.cs
- DynamicActivity.cs
- SmtpNegotiateAuthenticationModule.cs
- StylusDevice.cs
- SortableBindingList.cs
- StateWorkerRequest.cs
- HttpCookieCollection.cs
- _ProxyChain.cs
- JsonGlobals.cs
- IPCCacheManager.cs
- ListSortDescriptionCollection.cs
- PreviewKeyDownEventArgs.cs
- UserControlBuildProvider.cs
- SchemeSettingElementCollection.cs
- InfoCardTraceRecord.cs
- LicenseManager.cs
- Pool.cs
- DoubleAnimationBase.cs
- ControlLocalizer.cs
- documentation.cs
- OleDbEnumerator.cs
- DataListItem.cs
- XmlUrlEditor.cs
- SelectedDatesCollection.cs
- IgnoreFileBuildProvider.cs
- UndirectedGraph.cs
- PolyQuadraticBezierSegment.cs
- InputBinding.cs
- DesignerVerbCollection.cs
- Utility.cs
- View.cs
- HtmlShim.cs
- InternalCache.cs
- Bitmap.cs
- AdornerHitTestResult.cs
- TextBox.cs
- InfoCardKeyedHashAlgorithm.cs
- VariantWrapper.cs
- BufferedGraphics.cs
- CommandEventArgs.cs
- odbcmetadatacolumnnames.cs
- FontWeights.cs
- CustomCategoryAttribute.cs
- DesignerDataColumn.cs
- XMLUtil.cs
- Propagator.JoinPropagator.JoinPredicateVisitor.cs
- DbUpdateCommandTree.cs
- UnsafeMethods.cs
- UserThread.cs
- UdpDiscoveryEndpointElement.cs
- X509CertificateRecipientClientCredential.cs
- ParameterCollection.cs
- AttributeSetAction.cs
- PrintPreviewDialog.cs
- CTreeGenerator.cs
- XmlDataSource.cs
- ListViewItemCollectionEditor.cs
- Adorner.cs
- Timer.cs
- RemotingAttributes.cs
- ToolStripRendererSwitcher.cs