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
- DataSourceControl.cs
- SafeCryptoHandles.cs
- EntityDataSourceChangingEventArgs.cs
- Polygon.cs
- Label.cs
- TransformationRules.cs
- __FastResourceComparer.cs
- DataTransferEventArgs.cs
- BuildManager.cs
- DecimalConverter.cs
- MembershipPasswordException.cs
- Util.cs
- UIElement.cs
- OutputCacheSection.cs
- CrossAppDomainChannel.cs
- DotExpr.cs
- HTMLTextWriter.cs
- PixelFormat.cs
- InfoCardClaimCollection.cs
- DataGridTablesFactory.cs
- XPathNodePointer.cs
- ASCIIEncoding.cs
- RegistrySecurity.cs
- XmlSchemaCompilationSettings.cs
- DelegatingTypeDescriptionProvider.cs
- RepeaterItem.cs
- Int64Converter.cs
- SmtpLoginAuthenticationModule.cs
- CompiledQueryCacheEntry.cs
- ZoneButton.cs
- SettingsAttributeDictionary.cs
- WindowsIPAddress.cs
- HostingPreferredMapPath.cs
- RewritingSimplifier.cs
- __Filters.cs
- HttpDebugHandler.cs
- MouseOverProperty.cs
- HttpModule.cs
- HttpHandlerAction.cs
- ServiceDescriptionSerializer.cs
- BitmapEffectGeneralTransform.cs
- Triangle.cs
- SuppressMergeCheckAttribute.cs
- PrintPageEvent.cs
- ContentDefinition.cs
- XPathPatternBuilder.cs
- SystemGatewayIPAddressInformation.cs
- ThicknessAnimation.cs
- DetailsViewUpdatedEventArgs.cs
- SourceFileInfo.cs
- SplitterEvent.cs
- MessageHeaders.cs
- DrawingAttributeSerializer.cs
- SHA512Cng.cs
- EmbeddedObject.cs
- Span.cs
- Highlights.cs
- DataBinding.cs
- ThreadStaticAttribute.cs
- PropertyHelper.cs
- BaseValidatorDesigner.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- RefreshPropertiesAttribute.cs
- ComplexBindingPropertiesAttribute.cs
- ToolStripDropTargetManager.cs
- Monitor.cs
- DataGridViewCellConverter.cs
- SQLDouble.cs
- ValidationErrorCollection.cs
- ResumeStoryboard.cs
- CompositeScriptReferenceEventArgs.cs
- WebServiceParameterData.cs
- CollectionContainer.cs
- UnsafeCollabNativeMethods.cs
- CheckBoxFlatAdapter.cs
- PropertyMetadata.cs
- VarInfo.cs
- ChangePassword.cs
- StreamingContext.cs
- PerformanceCounterPermissionEntryCollection.cs
- WebColorConverter.cs
- PasswordDeriveBytes.cs
- DateTimeConstantAttribute.cs
- TextRangeSerialization.cs
- TextContainerHelper.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- Speller.cs
- IdentityReference.cs
- FixedSOMLineCollection.cs
- UserInitiatedRoutedEventPermission.cs
- CollectionView.cs
- PenContexts.cs
- DataService.cs
- EntryPointNotFoundException.cs
- EncodingStreamWrapper.cs
- XmlTextEncoder.cs
- Security.cs
- BitmapSizeOptions.cs
- BuildTopDownAttribute.cs
- dataobject.cs