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
- ViewKeyConstraint.cs
- ObfuscateAssemblyAttribute.cs
- TypeHelpers.cs
- COM2IProvidePropertyBuilderHandler.cs
- basevalidator.cs
- PageRanges.cs
- ClassValidator.cs
- Encoder.cs
- GenericPrincipal.cs
- BulletedList.cs
- ShaperBuffers.cs
- ListItemsCollectionEditor.cs
- EmptyEnumerable.cs
- MessagePropertyDescription.cs
- TablePatternIdentifiers.cs
- WorkflowApplicationIdleEventArgs.cs
- ReadOnlyDictionary.cs
- WebPartAddingEventArgs.cs
- DecoderExceptionFallback.cs
- Pair.cs
- XmlAnyAttributeAttribute.cs
- _FtpControlStream.cs
- SchemaConstraints.cs
- PropertyDescriptor.cs
- dbenumerator.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- XmlNodeList.cs
- SequenceDesigner.cs
- FontUnit.cs
- CodeExpressionStatement.cs
- InheritanceContextHelper.cs
- ControlParameter.cs
- WriterOutput.cs
- UserPersonalizationStateInfo.cs
- HwndMouseInputProvider.cs
- ContentDisposition.cs
- _ConnectStream.cs
- DBDataPermissionAttribute.cs
- Process.cs
- _OverlappedAsyncResult.cs
- ProtocolsConfigurationHandler.cs
- DeferredSelectedIndexReference.cs
- OneWayChannelFactory.cs
- CodeGeneratorOptions.cs
- QilDataSource.cs
- DeploymentSection.cs
- RemotingConfiguration.cs
- Substitution.cs
- StylusOverProperty.cs
- SiteMapPath.cs
- WindowsAuthenticationEventArgs.cs
- Base64WriteStateInfo.cs
- SafeMILHandle.cs
- TextBox.cs
- BuilderPropertyEntry.cs
- NativeActivityContext.cs
- ValueTable.cs
- TextRange.cs
- IOThreadScheduler.cs
- SqlClientWrapperSmiStreamChars.cs
- SerializationEventsCache.cs
- NodeFunctions.cs
- SequenceDesignerAccessibleObject.cs
- MenuItemBindingCollection.cs
- ListChangedEventArgs.cs
- GeometryValueSerializer.cs
- RelatedEnd.cs
- IntSecurity.cs
- IsolatedStoragePermission.cs
- Control.cs
- FrameworkContentElement.cs
- Calendar.cs
- FormViewUpdateEventArgs.cs
- DataServiceQueryException.cs
- DataControlField.cs
- DataSvcMapFile.cs
- InheritanceService.cs
- externdll.cs
- BookmarkUndoUnit.cs
- GC.cs
- ConfigurationManagerHelperFactory.cs
- HtmlPanelAdapter.cs
- EventDriven.cs
- ContentWrapperAttribute.cs
- OdbcRowUpdatingEvent.cs
- DesignerView.cs
- Attributes.cs
- ScriptDescriptor.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- SystemIcmpV4Statistics.cs
- ColorContext.cs
- LockedBorderGlyph.cs
- UxThemeWrapper.cs
- XmlCountingReader.cs
- TimeSpan.cs
- SamlEvidence.cs
- EastAsianLunisolarCalendar.cs
- FixedSOMGroup.cs
- AnnotationAuthorChangedEventArgs.cs
- ProfilePropertySettings.cs