Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / 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
- ScrollBarRenderer.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- SystemSounds.cs
- XmlSiteMapProvider.cs
- SoapExtension.cs
- XmlCDATASection.cs
- ProcessRequestAsyncResult.cs
- SystemPens.cs
- Clock.cs
- ContentDesigner.cs
- dbenumerator.cs
- ContainerTracking.cs
- WindowsListView.cs
- DispatchChannelSink.cs
- Unit.cs
- Sql8ConformanceChecker.cs
- FlatButtonAppearance.cs
- Component.cs
- InputEventArgs.cs
- CapabilitiesRule.cs
- ArrayMergeHelper.cs
- ComEventsSink.cs
- Privilege.cs
- ChildChangedEventArgs.cs
- Serializer.cs
- SaveFileDialogDesigner.cs
- ScrollItemProviderWrapper.cs
- Tile.cs
- QuotedPairReader.cs
- FlowSwitch.cs
- StylusLogic.cs
- HashStream.cs
- Control.cs
- ListBindableAttribute.cs
- WinFormsSpinner.cs
- SplitterCancelEvent.cs
- Rect.cs
- SelectionProcessor.cs
- ApplicationFileParser.cs
- KnownTypesProvider.cs
- PropVariant.cs
- Sql8ConformanceChecker.cs
- PasswordBoxAutomationPeer.cs
- BuildResult.cs
- InvokeMethodActivityDesigner.cs
- BitmapInitialize.cs
- TypefaceMetricsCache.cs
- TdsParserSafeHandles.cs
- CommandDevice.cs
- OleDbTransaction.cs
- ScriptControlManager.cs
- WebPartCatalogCloseVerb.cs
- DataRelation.cs
- TextCollapsingProperties.cs
- EffectiveValueEntry.cs
- DeploymentExceptionMapper.cs
- PkcsUtils.cs
- DateTimeOffset.cs
- LinkedResource.cs
- METAHEADER.cs
- BuildProviderCollection.cs
- GridViewDeletedEventArgs.cs
- ContentElement.cs
- ProcessModelInfo.cs
- SystemException.cs
- SubpageParaClient.cs
- OutputCacheProfile.cs
- WebPartEditorApplyVerb.cs
- MaxSessionCountExceededException.cs
- ExceptionHandler.cs
- KoreanCalendar.cs
- XmlSchemaExporter.cs
- ProcessStartInfo.cs
- FactoryRecord.cs
- ComponentTray.cs
- Parser.cs
- ProxyGenerator.cs
- RayMeshGeometry3DHitTestResult.cs
- EDesignUtil.cs
- XmlAutoDetectWriter.cs
- FieldNameLookup.cs
- ActivationArguments.cs
- SecureUICommand.cs
- DataGridPagerStyle.cs
- WizardStepBase.cs
- WinInetCache.cs
- BasicCellRelation.cs
- SynchronousChannel.cs
- _NTAuthentication.cs
- MexNamedPipeBindingElement.cs
- DecimalAnimationUsingKeyFrames.cs
- DataSourceIDConverter.cs
- ExpressionVisitor.cs
- XmlSerializerNamespaces.cs
- ConfigurationSectionGroupCollection.cs
- XmlSerializerOperationBehavior.cs
- CacheChildrenQuery.cs
- HwndAppCommandInputProvider.cs
- UrlMappingsSection.cs
- PropertyPath.cs