Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilCloneVisitor.cs / 1 / 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
- ApplicationContext.cs
- WsdlBuildProvider.cs
- ColorKeyFrameCollection.cs
- PingOptions.cs
- LoadedOrUnloadedOperation.cs
- WindowsEditBox.cs
- SecurityToken.cs
- CreateUserErrorEventArgs.cs
- SynchronizationLockException.cs
- ElementFactory.cs
- TypedTableGenerator.cs
- WindowsContainer.cs
- RootProfilePropertySettingsCollection.cs
- StateChangeEvent.cs
- NetStream.cs
- ThicknessAnimationBase.cs
- documentsequencetextpointer.cs
- TextFormatterHost.cs
- InstancePersistenceCommandException.cs
- TogglePattern.cs
- Double.cs
- DataGridLinkButton.cs
- ConditionCollection.cs
- HtmlInputReset.cs
- Attributes.cs
- Point4D.cs
- DataGridViewCheckBoxCell.cs
- SHA512Managed.cs
- ManagementObject.cs
- BitStack.cs
- ApplicationBuildProvider.cs
- XmlSerializableServices.cs
- StorageAssociationSetMapping.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- XmlArrayItemAttribute.cs
- SymbolTable.cs
- BitmapData.cs
- EnumerableRowCollectionExtensions.cs
- FilteredReadOnlyMetadataCollection.cs
- SelectionPattern.cs
- EventMappingSettingsCollection.cs
- SamlSubjectStatement.cs
- WebRequestModuleElement.cs
- AssociationType.cs
- LocalIdKeyIdentifierClause.cs
- SerializableAttribute.cs
- SqlDelegatedTransaction.cs
- VideoDrawing.cs
- SortKey.cs
- RootDesignerSerializerAttribute.cs
- QueryOperationResponseOfT.cs
- ParameterBuilder.cs
- ExpressionNormalizer.cs
- ConnectionManagementElementCollection.cs
- SystemIPAddressInformation.cs
- BindingRestrictions.cs
- xdrvalidator.cs
- HitTestParameters3D.cs
- XmlAttribute.cs
- ClientEventManager.cs
- FormViewDeleteEventArgs.cs
- XmlSchemaImport.cs
- GridEntry.cs
- CompiledELinqQueryState.cs
- TraceProvider.cs
- DatePicker.cs
- CalendarDesigner.cs
- AbstractSvcMapFileLoader.cs
- MethodSignatureGenerator.cs
- SQLInt16Storage.cs
- ProgressPage.cs
- updatecommandorderer.cs
- InvokeMethod.cs
- InvalidPropValue.cs
- ScrollBarAutomationPeer.cs
- HtmlContainerControl.cs
- TextSelectionProcessor.cs
- InstanceKeyView.cs
- TraceSection.cs
- XamlPathDataSerializer.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- WindowsScrollBar.cs
- PrintingPermissionAttribute.cs
- MarshalByRefObject.cs
- Latin1Encoding.cs
- ObjectIDGenerator.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- XmlSchemaComplexContentExtension.cs
- SafeSystemMetrics.cs
- LabelEditEvent.cs
- SharedDp.cs
- TypeSource.cs
- XpsThumbnail.cs
- ConfigurationManagerHelper.cs
- COM2TypeInfoProcessor.cs
- FontFamilyIdentifier.cs
- ActiveXHelper.cs
- DataSourceListEditor.cs
- GridToolTip.cs
- LocatorPart.cs