Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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
- SplitContainer.cs
- mongolianshape.cs
- AnnotationDocumentPaginator.cs
- Type.cs
- HandleTable.cs
- StringResourceManager.cs
- TextView.cs
- TreeNodeStyleCollection.cs
- ScriptServiceAttribute.cs
- XamlTreeBuilder.cs
- ObfuscationAttribute.cs
- Renderer.cs
- unitconverter.cs
- TypeLibConverter.cs
- wmiprovider.cs
- PointHitTestResult.cs
- URIFormatException.cs
- ListViewDeleteEventArgs.cs
- IdentityManager.cs
- DataGridViewCell.cs
- FlowLayout.cs
- WebBrowserDocumentCompletedEventHandler.cs
- SchemaTableColumn.cs
- WindowPatternIdentifiers.cs
- MouseEvent.cs
- OracleSqlParser.cs
- TextContainer.cs
- ViewgenContext.cs
- DateTimeUtil.cs
- DbgCompiler.cs
- ShapeTypeface.cs
- HostAdapter.cs
- __Filters.cs
- ServiceDescription.cs
- Tuple.cs
- DataGridColumnCollection.cs
- ToolStripRenderer.cs
- SslStreamSecurityElement.cs
- SqlUnionizer.cs
- SystemIPGlobalProperties.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- AuthenticationSection.cs
- ResourceCategoryAttribute.cs
- DbProviderSpecificTypePropertyAttribute.cs
- WebUtil.cs
- InvokeHandlers.cs
- TrackBarRenderer.cs
- ByteKeyFrameCollection.cs
- IDataContractSurrogate.cs
- Span.cs
- SecureStringHasher.cs
- AudioException.cs
- SharedUtils.cs
- UrlMapping.cs
- GeneralTransform3DCollection.cs
- PageRequestManager.cs
- TypeBuilder.cs
- CmsInterop.cs
- DesignBindingValueUIHandler.cs
- FamilyTypefaceCollection.cs
- UrlMappingsModule.cs
- StreamResourceInfo.cs
- DataGridViewRowPrePaintEventArgs.cs
- DataRowChangeEvent.cs
- ArraySegment.cs
- ServiceReference.cs
- SizeKeyFrameCollection.cs
- GenericXmlSecurityToken.cs
- DataGridViewCellStyleConverter.cs
- RbTree.cs
- FactoryMaker.cs
- EdmMember.cs
- Accessible.cs
- localization.cs
- IPEndPointCollection.cs
- WebEvents.cs
- ActiveXSite.cs
- MDIWindowDialog.cs
- SafeLocalMemHandle.cs
- StaticContext.cs
- DataBindingHandlerAttribute.cs
- DynamicControlParameter.cs
- ActivitySurrogate.cs
- DelimitedListTraceListener.cs
- InstanceData.cs
- Itemizer.cs
- LinkButton.cs
- COSERVERINFO.cs
- RegistrationServices.cs
- NTAccount.cs
- FontUnitConverter.cs
- ListViewAutomationPeer.cs
- TableLayoutStyle.cs
- NativeMethods.cs
- ListContractAdapter.cs
- AnnotationAdorner.cs
- Compiler.cs
- tooltip.cs
- ProcessHostServerConfig.cs
- CustomPopupPlacement.cs