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
- SqlPersistenceWorkflowInstanceDescription.cs
- assertwrapper.cs
- ConfigurationSection.cs
- EnvironmentPermission.cs
- CurrentChangingEventArgs.cs
- DataGridColumn.cs
- ChildTable.cs
- RawUIStateInputReport.cs
- TableChangeProcessor.cs
- CurrentChangedEventManager.cs
- GridViewPageEventArgs.cs
- FormatterServices.cs
- ContextProperty.cs
- baseaxisquery.cs
- DataRowView.cs
- ellipse.cs
- DbMetaDataColumnNames.cs
- ProcessThreadDesigner.cs
- IIS7WorkerRequest.cs
- Vector3D.cs
- HelpFileFileNameEditor.cs
- Path.cs
- MULTI_QI.cs
- TrackingDataItemValue.cs
- ConfigurationManagerHelper.cs
- TraceSection.cs
- SoapProtocolReflector.cs
- TableLayoutCellPaintEventArgs.cs
- BufferModeSettings.cs
- ApplicationDirectory.cs
- WebPartCatalogAddVerb.cs
- ViewGenResults.cs
- DataGridViewTopLeftHeaderCell.cs
- ItemMap.cs
- PrintDocument.cs
- TabOrder.cs
- LocatorPart.cs
- PackageDigitalSignatureManager.cs
- ExpressionPrefixAttribute.cs
- ImageDrawing.cs
- CultureInfo.cs
- precedingquery.cs
- TextSelectionProcessor.cs
- safex509handles.cs
- DataSourceHelper.cs
- FormatConvertedBitmap.cs
- FamilyMapCollection.cs
- CommandConverter.cs
- AssociationSetEnd.cs
- ImageBrush.cs
- EnvironmentPermission.cs
- StringAnimationUsingKeyFrames.cs
- BuilderPropertyEntry.cs
- ByteAnimationUsingKeyFrames.cs
- DataGridViewColumnEventArgs.cs
- XmlNamespaceMapping.cs
- MTConfigUtil.cs
- ContractType.cs
- documentation.cs
- Thread.cs
- XmlSchemaImport.cs
- CustomPeerResolverService.cs
- ColorContextHelper.cs
- StartFileNameEditor.cs
- TableCellCollection.cs
- _HeaderInfoTable.cs
- DataPagerField.cs
- DockPatternIdentifiers.cs
- AxisAngleRotation3D.cs
- NullReferenceException.cs
- XmlBaseWriter.cs
- XmlSchemaSubstitutionGroup.cs
- DbBuffer.cs
- SendMailErrorEventArgs.cs
- NetworkInformationPermission.cs
- EntityDataSourceWrapper.cs
- ClassicBorderDecorator.cs
- TextPattern.cs
- ToolStripItemImageRenderEventArgs.cs
- SharedStatics.cs
- HttpHostedTransportConfiguration.cs
- HttpResponseHeader.cs
- TwoPhaseCommitProxy.cs
- DetailsViewInsertEventArgs.cs
- LinkAreaEditor.cs
- Message.cs
- AnchoredBlock.cs
- DataGridItemCollection.cs
- DesignerDataColumn.cs
- PositiveTimeSpanValidator.cs
- BoolLiteral.cs
- OracleConnectionString.cs
- RangeBaseAutomationPeer.cs
- Main.cs
- WindowHideOrCloseTracker.cs
- XmlSchemaSimpleContentRestriction.cs
- parserscommon.cs
- SQLCharsStorage.cs
- TextBoxDesigner.cs
- BuiltInExpr.cs