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
- JsonWriterDelegator.cs
- ToolStripContentPanelRenderEventArgs.cs
- AssemblyHash.cs
- XsltException.cs
- FontConverter.cs
- AspNetCompatibilityRequirementsMode.cs
- QilReference.cs
- PropertyGridView.cs
- DispatcherOperation.cs
- XamlSerializerUtil.cs
- ObjectStateEntryBaseUpdatableDataRecord.cs
- EndpointDiscoveryBehavior.cs
- WorkflowPersistenceService.cs
- StickyNoteHelper.cs
- DelimitedListTraceListener.cs
- PassportAuthenticationModule.cs
- translator.cs
- String.cs
- PrePrepareMethodAttribute.cs
- ConnectionPoint.cs
- XmlHierarchyData.cs
- DynamicRenderer.cs
- QueryAccessibilityHelpEvent.cs
- ConsoleKeyInfo.cs
- Models.cs
- ExpressionLexer.cs
- JavaScriptSerializer.cs
- Pair.cs
- CubicEase.cs
- AttributeEmitter.cs
- ZipPackagePart.cs
- DropShadowBitmapEffect.cs
- IntellisenseTextBox.cs
- ObjectQuery.cs
- CatalogZoneBase.cs
- WebUtil.cs
- PtsHost.cs
- TryLoadRunnableWorkflowCommand.cs
- BuilderPropertyEntry.cs
- FormsAuthenticationEventArgs.cs
- StringResourceManager.cs
- UriScheme.cs
- figurelength.cs
- serverconfig.cs
- ScanQueryOperator.cs
- XmlBinaryReaderSession.cs
- DbParameterCollectionHelper.cs
- NumericUpDownAcceleration.cs
- _UriSyntax.cs
- SpeakCompletedEventArgs.cs
- MarkupCompilePass1.cs
- FacetDescriptionElement.cs
- TimeEnumHelper.cs
- FixUpCollection.cs
- DynamicDocumentPaginator.cs
- RegisteredExpandoAttribute.cs
- HostingEnvironmentException.cs
- Figure.cs
- WindowsClaimSet.cs
- ManagedIStream.cs
- XamlRtfConverter.cs
- SqlDataSourceCustomCommandPanel.cs
- XPathParser.cs
- TCPListener.cs
- Int32Rect.cs
- CompositeCollection.cs
- GorillaCodec.cs
- SQLConvert.cs
- BitmapImage.cs
- InputLanguage.cs
- PassportAuthenticationModule.cs
- ListMarkerLine.cs
- StackSpiller.cs
- XamlDesignerSerializationManager.cs
- InvalidFilterCriteriaException.cs
- ResXResourceSet.cs
- XmlDocument.cs
- BuildManager.cs
- TypeElement.cs
- DataGridState.cs
- StylusButtonCollection.cs
- GridViewColumnHeaderAutomationPeer.cs
- ArrayElementGridEntry.cs
- PanelContainerDesigner.cs
- HtmlInputText.cs
- StaticFileHandler.cs
- HighlightVisual.cs
- DbMetaDataColumnNames.cs
- ListBoxChrome.cs
- SchemaDeclBase.cs
- RoleGroupCollection.cs
- FilterQuery.cs
- ServiceErrorHandler.cs
- XmlSchemaFacet.cs
- GraphicsContainer.cs
- WorkerProcess.cs
- TimeSpanValidatorAttribute.cs
- SapiRecognizer.cs
- FloaterParaClient.cs
- CompilerInfo.cs