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
- FormViewUpdatedEventArgs.cs
- ManagementInstaller.cs
- Compiler.cs
- XsltContext.cs
- DesignerOptionService.cs
- SingleStorage.cs
- DispatchChannelSink.cs
- VectorAnimationBase.cs
- BitmapFrame.cs
- FlowPosition.cs
- ReadOnlyHierarchicalDataSource.cs
- CodeVariableReferenceExpression.cs
- CheckBox.cs
- PageCatalogPart.cs
- DataGridAddNewRow.cs
- SystemIcmpV6Statistics.cs
- BitmapData.cs
- ExpressionSelection.cs
- OracleCommandBuilder.cs
- DynamicDataExtensions.cs
- TextUtf8RawTextWriter.cs
- CodeCatchClauseCollection.cs
- ColumnMap.cs
- ErrorRuntimeConfig.cs
- HttpCachePolicy.cs
- StrongTypingException.cs
- Application.cs
- IList.cs
- MetadataArtifactLoaderCompositeFile.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- PageParserFilter.cs
- RowToFieldTransformer.cs
- PriorityQueue.cs
- DictionaryCustomTypeDescriptor.cs
- ButtonBase.cs
- InlinedLocationReference.cs
- IisTraceListener.cs
- SingleAnimationUsingKeyFrames.cs
- ItemPager.cs
- IdentityReference.cs
- ButtonColumn.cs
- UriTemplatePathPartiallyEquivalentSet.cs
- EntityConnectionStringBuilder.cs
- IntSecurity.cs
- FontNamesConverter.cs
- TriggerAction.cs
- Animatable.cs
- XmlDataSource.cs
- ProxyElement.cs
- HasCopySemanticsAttribute.cs
- DataGridViewSortCompareEventArgs.cs
- SelectQueryOperator.cs
- ConnectionInterfaceCollection.cs
- TdsParser.cs
- SchemaInfo.cs
- HtmlInputReset.cs
- InstallHelper.cs
- QueryCursorEventArgs.cs
- RepeaterItemCollection.cs
- CqlParser.cs
- entitydatasourceentitysetnameconverter.cs
- TableCellCollection.cs
- VisualStyleInformation.cs
- OperandQuery.cs
- SQLMembershipProvider.cs
- UserPersonalizationStateInfo.cs
- AlignmentYValidation.cs
- DateTimeStorage.cs
- DataGridHelper.cs
- InfoCardRSAOAEPKeyExchangeDeformatter.cs
- NavigationCommands.cs
- RectIndependentAnimationStorage.cs
- MultiDataTrigger.cs
- HttpsTransportElement.cs
- FormParameter.cs
- ToolStripOverflow.cs
- TextTreeDeleteContentUndoUnit.cs
- CustomAssemblyResolver.cs
- CommandTreeTypeHelper.cs
- Utils.cs
- mactripleDES.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- HtmlElement.cs
- DataGridPagerStyle.cs
- AsyncSerializedWorker.cs
- ToolTipAutomationPeer.cs
- BitmapEffect.cs
- ACL.cs
- RenderTargetBitmap.cs
- shaperfactoryquerycacheentry.cs
- DoubleCollection.cs
- SqlNamer.cs
- WebBrowserHelper.cs
- BitmapFrameDecode.cs
- Rotation3DKeyFrameCollection.cs
- Selection.cs
- LeaseManager.cs
- HttpFileCollection.cs
- Int32AnimationUsingKeyFrames.cs
- HttpConfigurationSystem.cs