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
- XmlDocumentSchema.cs
- VSDExceptions.cs
- ForwardPositionQuery.cs
- wgx_render.cs
- ExpanderAutomationPeer.cs
- WebPartAddingEventArgs.cs
- LinkButton.cs
- MultipleViewPattern.cs
- UxThemeWrapper.cs
- MobileDeviceCapabilitiesSectionHandler.cs
- TranslateTransform.cs
- ContractUtils.cs
- ResourcesGenerator.cs
- SelectionEditor.cs
- CounterSetInstanceCounterDataSet.cs
- QueryInterceptorAttribute.cs
- TextRangeEdit.cs
- DataKey.cs
- TextMetrics.cs
- DecimalConstantAttribute.cs
- FormsAuthenticationModule.cs
- PerformanceCounterCategory.cs
- Canvas.cs
- EventToken.cs
- RegistrySecurity.cs
- SqlProviderServices.cs
- FormsAuthenticationUserCollection.cs
- CodeExpressionStatement.cs
- GreenMethods.cs
- XPathExpr.cs
- ModulesEntry.cs
- ToggleProviderWrapper.cs
- DbParameterHelper.cs
- InvalidCastException.cs
- PageClientProxyGenerator.cs
- MissingMethodException.cs
- StatusBarItem.cs
- CompilerScopeManager.cs
- SerializerWriterEventHandlers.cs
- ServicePointManager.cs
- ConfigurationPermission.cs
- XmlValidatingReader.cs
- StylusCollection.cs
- DiscriminatorMap.cs
- TaskFormBase.cs
- EntityTransaction.cs
- Function.cs
- ForeignConstraint.cs
- CheckBoxFlatAdapter.cs
- ContentFileHelper.cs
- UnsafeNativeMethods.cs
- AnnotationComponentManager.cs
- HtmlElement.cs
- Comparer.cs
- _AutoWebProxyScriptHelper.cs
- DataControlFieldCollection.cs
- _FtpDataStream.cs
- WebPartMenu.cs
- IndentedWriter.cs
- DBSchemaRow.cs
- QilGenerator.cs
- DynamicMethod.cs
- MonitoringDescriptionAttribute.cs
- DiscardableAttribute.cs
- SortFieldComparer.cs
- basevalidator.cs
- TransactionsSectionGroup.cs
- OleDbRowUpdatingEvent.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- ExpressionPrinter.cs
- TemplateManager.cs
- CompareInfo.cs
- QilTargetType.cs
- RSAOAEPKeyExchangeFormatter.cs
- NoneExcludedImageIndexConverter.cs
- CodeTypeDeclarationCollection.cs
- Encoding.cs
- precedingsibling.cs
- WindowsBrush.cs
- StrongNameMembershipCondition.cs
- AuthenticationException.cs
- Graphics.cs
- HtmlShimManager.cs
- ColumnWidthChangedEvent.cs
- ScriptReference.cs
- SafeMemoryMappedFileHandle.cs
- RSAOAEPKeyExchangeFormatter.cs
- HostedElements.cs
- CancellationState.cs
- ApplicationId.cs
- DependencyPropertyValueSerializer.cs
- BindingListCollectionView.cs
- URIFormatException.cs
- DesignerActionUIStateChangeEventArgs.cs
- GridViewSortEventArgs.cs
- FilterRepeater.cs
- CorrelationManager.cs
- ScriptResourceDefinition.cs
- Timer.cs
- WindowsFormsLinkLabel.cs