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
- NameValueConfigurationElement.cs
- EventLogger.cs
- DiscoveryUtility.cs
- GroupLabel.cs
- FacetChecker.cs
- OdbcConnectionHandle.cs
- UnknownBitmapDecoder.cs
- BaseTemplateCodeDomTreeGenerator.cs
- StickyNote.cs
- ToolStripContainer.cs
- ValueHandle.cs
- ResXDataNode.cs
- FormattedText.cs
- CompilerScope.Storage.cs
- TrackingServices.cs
- ICollection.cs
- MessageDispatch.cs
- ReaderWriterLock.cs
- ActivityDefaults.cs
- HttpWebRequestElement.cs
- DispatchChannelSink.cs
- GeometryDrawing.cs
- DocumentApplication.cs
- EntityDataSourceDesignerHelper.cs
- X509Certificate.cs
- ProcessHostConfigUtils.cs
- dsa.cs
- CodeDomSerializerException.cs
- TypeConverterHelper.cs
- XamlToRtfParser.cs
- PageContent.cs
- BlurEffect.cs
- FigureParaClient.cs
- ArraySet.cs
- DetailsViewPagerRow.cs
- EpmCustomContentWriterNodeData.cs
- OleDbFactory.cs
- _ConnectStream.cs
- EnvironmentPermission.cs
- InplaceBitmapMetadataWriter.cs
- SessionViewState.cs
- DocumentApplicationJournalEntry.cs
- LocalizabilityAttribute.cs
- Calendar.cs
- XmlElementList.cs
- PropertyChangingEventArgs.cs
- ColumnMap.cs
- ObjectListItem.cs
- FormsAuthenticationTicket.cs
- Select.cs
- Parser.cs
- TextServicesDisplayAttribute.cs
- CheckBoxBaseAdapter.cs
- BufferedGraphics.cs
- PageAsyncTaskManager.cs
- TextCompositionManager.cs
- Menu.cs
- AuthorizationRuleCollection.cs
- UseManagedPresentationElement.cs
- AddInServer.cs
- ScriptBehaviorDescriptor.cs
- WaitHandle.cs
- DelayedRegex.cs
- MatrixCamera.cs
- OdbcFactory.cs
- NamespaceDecl.cs
- _CacheStreams.cs
- SafeFileMappingHandle.cs
- Atom10FormatterFactory.cs
- SelectingProviderEventArgs.cs
- Translator.cs
- SetIterators.cs
- CanonicalizationDriver.cs
- StructuralCache.cs
- SystemException.cs
- QuerySetOp.cs
- ContainerUtilities.cs
- BindingGroup.cs
- ServiceOperation.cs
- TableProvider.cs
- RuleAction.cs
- DocumentPage.cs
- ProcessThreadCollection.cs
- PropertyGridDesigner.cs
- DataMisalignedException.cs
- SqlRewriteScalarSubqueries.cs
- DataListAutoFormat.cs
- PerspectiveCamera.cs
- ElementProxy.cs
- shaperfactoryquerycachekey.cs
- CodeIdentifiers.cs
- PageAsyncTask.cs
- SqlDataRecord.cs
- TypeEnumerableViewSchema.cs
- TreeNodeBindingCollection.cs
- XmlDictionaryWriter.cs
- SendOperation.cs
- FormatterServicesNoSerializableCheck.cs
- SqlStatistics.cs
- CompilerState.cs