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
- HelpEvent.cs
- ContextMarshalException.cs
- MexBindingBindingCollectionElement.cs
- MailWriter.cs
- RemoteWebConfigurationHostStream.cs
- LoadItemsEventArgs.cs
- TypeSchema.cs
- ConfigXmlSignificantWhitespace.cs
- CopyOnWriteList.cs
- Configuration.cs
- DBSqlParserTable.cs
- ElementUtil.cs
- CustomErrorCollection.cs
- ToolStripPanelRow.cs
- RoleManagerModule.cs
- bindurihelper.cs
- HtmlControlDesigner.cs
- NavigateEvent.cs
- configsystem.cs
- DbDataAdapter.cs
- QueryStringConverter.cs
- XmlDeclaration.cs
- TextTreeUndoUnit.cs
- XhtmlBasicPhoneCallAdapter.cs
- ToolStripProgressBar.cs
- Ref.cs
- AttributeConverter.cs
- ResourceReferenceExpression.cs
- RolePrincipal.cs
- Int32RectValueSerializer.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- AutoScrollHelper.cs
- DragEventArgs.cs
- XmlSyndicationContent.cs
- EnumType.cs
- ExecutionContext.cs
- BamlTreeNode.cs
- XPathParser.cs
- BitmapEffectOutputConnector.cs
- PlatformNotSupportedException.cs
- InvokePattern.cs
- PkcsUtils.cs
- EventRecordWrittenEventArgs.cs
- NativeMethodsCLR.cs
- FontStretchConverter.cs
- ConfigurationElement.cs
- CorrelationToken.cs
- GrammarBuilderPhrase.cs
- WindowsStatusBar.cs
- Point3D.cs
- WasAdminWrapper.cs
- cookiecontainer.cs
- EditCommandColumn.cs
- EventlogProvider.cs
- WebPartUtil.cs
- HyperLinkField.cs
- DependsOnAttribute.cs
- Vector3DConverter.cs
- TextFormatterImp.cs
- base64Transforms.cs
- sortedlist.cs
- TdsParserSafeHandles.cs
- XmlAttributeCollection.cs
- EntityStoreSchemaFilterEntry.cs
- BaseServiceProvider.cs
- BorderGapMaskConverter.cs
- SHA1CryptoServiceProvider.cs
- CacheMemory.cs
- PaintEvent.cs
- DateTimeFormat.cs
- ShaderRenderModeValidation.cs
- TextTreeRootNode.cs
- AutomationPeer.cs
- CodeFieldReferenceExpression.cs
- DeleteHelper.cs
- FieldAccessException.cs
- ConfigurationManagerInternalFactory.cs
- FormViewUpdatedEventArgs.cs
- MultidimensionalArrayItemReference.cs
- PngBitmapEncoder.cs
- ObjectStateFormatter.cs
- MultiByteCodec.cs
- BuildProvider.cs
- MergeFilterQuery.cs
- XmlWrappingReader.cs
- TrackingAnnotationCollection.cs
- AnimationLayer.cs
- MaterialCollection.cs
- ToolStripContainer.cs
- AssociationTypeEmitter.cs
- ReadOnlyDataSource.cs
- ColorTranslator.cs
- VirtualStackFrame.cs
- SiteOfOriginContainer.cs
- DBNull.cs
- HtmlShim.cs
- EventLogQuery.cs
- XPathAncestorQuery.cs
- XmlSchemaAttributeGroupRef.cs
- ParallelTimeline.cs