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
- BindingsSection.cs
- FileLoadException.cs
- AtomEntry.cs
- TextPointerBase.cs
- OpCodes.cs
- MouseActionValueSerializer.cs
- ObjectViewQueryResultData.cs
- HtmlShim.cs
- XmlRootAttribute.cs
- ConfigurationSchemaErrors.cs
- FileSystemEnumerable.cs
- SafeLibraryHandle.cs
- SQLStringStorage.cs
- HttpRawResponse.cs
- Token.cs
- InternalTypeHelper.cs
- ResourceDisplayNameAttribute.cs
- ExtensionSimplifierMarkupObject.cs
- templategroup.cs
- Container.cs
- CapabilitiesSection.cs
- StringSorter.cs
- RecordsAffectedEventArgs.cs
- BrowserInteropHelper.cs
- ToolStripComboBox.cs
- CachingHintValidation.cs
- ProfileSection.cs
- ITextView.cs
- NamedPipeTransportBindingElement.cs
- EventRouteFactory.cs
- PersonalizationStateInfo.cs
- Pkcs7Signer.cs
- WebHttpBindingElement.cs
- WriteTimeStream.cs
- TemplateColumn.cs
- DBCommand.cs
- AttachmentCollection.cs
- ScriptComponentDescriptor.cs
- CompositionTarget.cs
- EncryptedReference.cs
- InfoCardTrace.cs
- PolicyStatement.cs
- SQLInt64Storage.cs
- MailMessageEventArgs.cs
- EncoderReplacementFallback.cs
- DataGridViewSelectedCellCollection.cs
- counter.cs
- AssemblyName.cs
- FastPropertyAccessor.cs
- HiddenFieldDesigner.cs
- CodePageEncoding.cs
- HttpServerProtocol.cs
- ReadonlyMessageFilter.cs
- ProtectedConfiguration.cs
- CustomTypeDescriptor.cs
- DataRowChangeEvent.cs
- AssociatedControlConverter.cs
- OleDbRowUpdatingEvent.cs
- SqlPersonalizationProvider.cs
- CatchBlock.cs
- TextRenderer.cs
- QilBinary.cs
- MailAddressParser.cs
- FunctionImportElement.cs
- OutputCacheProfile.cs
- XappLauncher.cs
- HierarchicalDataBoundControlAdapter.cs
- DescriptionAttribute.cs
- FontSource.cs
- PipelineComponent.cs
- DbConvert.cs
- EventArgs.cs
- _CacheStreams.cs
- ScaleTransform.cs
- Type.cs
- ConnectionConsumerAttribute.cs
- InputReportEventArgs.cs
- BitmapCodecInfo.cs
- DataGridColumnCollection.cs
- XsdValidatingReader.cs
- XmlSchemaObject.cs
- ContextStaticAttribute.cs
- TokenBasedSet.cs
- KeyPressEvent.cs
- EntityDesignerDataSourceView.cs
- ControlBindingsCollection.cs
- CompoundFileIOPermission.cs
- TableHeaderCell.cs
- SoapExtension.cs
- ReadOnlyCollectionBase.cs
- iisPickupDirectory.cs
- ConnectionStringsSection.cs
- DllNotFoundException.cs
- TemplatedWizardStep.cs
- DeferredElementTreeState.cs
- CultureInfo.cs
- UpdatableWrapper.cs
- ExpressionConverter.cs
- UnsafeNativeMethods.cs
- XmlSchemaSimpleType.cs