Code:
/ 4.0 / 4.0 / 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. //------------------------------------------------------------------------------ //// 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
- GenerateTemporaryTargetAssembly.cs
- DeferredReference.cs
- ColorPalette.cs
- SmtpTransport.cs
- CqlErrorHelper.cs
- BlurEffect.cs
- UndirectedGraph.cs
- CodeTypeDelegate.cs
- ConditionalAttribute.cs
- RelatedPropertyManager.cs
- DbProviderFactories.cs
- URLIdentityPermission.cs
- PersianCalendar.cs
- ToolStripDropDownButton.cs
- StdValidatorsAndConverters.cs
- X509Utils.cs
- ImageIndexConverter.cs
- SystemResources.cs
- DocumentPaginator.cs
- ListManagerBindingsCollection.cs
- DbConnectionStringCommon.cs
- RegisteredDisposeScript.cs
- EditorZoneDesigner.cs
- PeerOutputChannel.cs
- Transform.cs
- AppDomainProtocolHandler.cs
- ComponentCollection.cs
- LinkLabel.cs
- HitTestDrawingContextWalker.cs
- ThicknessAnimation.cs
- ImageMetadata.cs
- EventDescriptor.cs
- DeadCharTextComposition.cs
- ConfigXmlText.cs
- StateMachineWorkflowDesigner.cs
- XsdCachingReader.cs
- RandomDelayQueuedSendsAsyncResult.cs
- SecurityTokenResolver.cs
- PreviewKeyDownEventArgs.cs
- ExitEventArgs.cs
- EntityContainerEmitter.cs
- SchemaManager.cs
- _FtpControlStream.cs
- SmtpReplyReader.cs
- UInt64Storage.cs
- CharacterMetrics.cs
- ProgressBar.cs
- HttpValueCollection.cs
- SchemaSetCompiler.cs
- StreamingContext.cs
- ActivityDefaults.cs
- Style.cs
- FontStyles.cs
- HtmlLabelAdapter.cs
- SqlXml.cs
- Region.cs
- NavigationFailedEventArgs.cs
- SelectingProviderEventArgs.cs
- ControlBuilderAttribute.cs
- BitmapEffect.cs
- BigIntegerStorage.cs
- PeerPresenceInfo.cs
- ImmutableObjectAttribute.cs
- XmlSchemaValidator.cs
- DependencyPropertyKey.cs
- IisTraceListener.cs
- Constraint.cs
- ObjectDataSourceChooseTypePanel.cs
- bindurihelper.cs
- UtilityExtension.cs
- StartUpEventArgs.cs
- WebBrowsableAttribute.cs
- StyleBamlRecordReader.cs
- BufferBuilder.cs
- SqlCommandSet.cs
- CallSite.cs
- mediaeventshelper.cs
- DataGrid.cs
- DropSource.cs
- AssemblyAttributes.cs
- OLEDB_Util.cs
- Encoder.cs
- DetailsViewDeletedEventArgs.cs
- DateTimeFormat.cs
- GenericTextProperties.cs
- EmptyControlCollection.cs
- Size3D.cs
- ResourcePart.cs
- EventPrivateKey.cs
- RawAppCommandInputReport.cs
- ContractMethodParameterInfo.cs
- XhtmlConformanceSection.cs
- UInt64Converter.cs
- TypeUtils.cs
- Profiler.cs
- DataKeyArray.cs
- SecurityUtils.cs
- wmiprovider.cs
- MouseButtonEventArgs.cs
- IQueryable.cs