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
- CmsInterop.cs
- NotificationContext.cs
- ToolStripItemCollection.cs
- SimpleExpression.cs
- Span.cs
- CodeObject.cs
- MemberProjectionIndex.cs
- SqlCharStream.cs
- TeredoHelper.cs
- UnsafeNativeMethods.cs
- Debug.cs
- LoginUtil.cs
- MulticastDelegate.cs
- SizeFConverter.cs
- FastPropertyAccessor.cs
- ItemsChangedEventArgs.cs
- CodeTypeConstructor.cs
- ConnectionPointCookie.cs
- HttpProtocolImporter.cs
- ProvidePropertyAttribute.cs
- SqlNodeAnnotation.cs
- DbUpdateCommandTree.cs
- ISAPIWorkerRequest.cs
- FlowDocumentScrollViewer.cs
- baseaxisquery.cs
- LoadedOrUnloadedOperation.cs
- ParseHttpDate.cs
- DataGridViewComboBoxEditingControl.cs
- DataSourceHelper.cs
- ObjectSecurityT.cs
- Attributes.cs
- _SslState.cs
- StringTraceRecord.cs
- NameNode.cs
- FunctionDefinition.cs
- LocalizabilityAttribute.cs
- LoginCancelEventArgs.cs
- VirtualDirectoryMapping.cs
- TemplateBindingExpressionConverter.cs
- InternalConfigSettingsFactory.cs
- AnnotationResource.cs
- DetailsViewUpdatedEventArgs.cs
- InputBuffer.cs
- NetStream.cs
- PathFigureCollection.cs
- SessionStateItemCollection.cs
- SerialPinChanges.cs
- ConstraintCollection.cs
- XPathDocument.cs
- EncoderExceptionFallback.cs
- SpotLight.cs
- AbandonedMutexException.cs
- Size3DConverter.cs
- AutomationFocusChangedEventArgs.cs
- AnimationClockResource.cs
- XmlILTrace.cs
- NativeMethods.cs
- XmlNode.cs
- CachingHintValidation.cs
- Deflater.cs
- WindowsFormsHost.cs
- BamlLocalizableResourceKey.cs
- ComponentEditorPage.cs
- SR.cs
- ValidatingPropertiesEventArgs.cs
- Point3DCollection.cs
- OdbcParameterCollection.cs
- GlyphingCache.cs
- StrongNameHelpers.cs
- translator.cs
- NativeRecognizer.cs
- OracleCommandBuilder.cs
- SiteMapSection.cs
- TextHidden.cs
- XmlDocumentSchema.cs
- RecommendedAsConfigurableAttribute.cs
- EdmItemError.cs
- WaitForChangedResult.cs
- ConnectAlgorithms.cs
- Part.cs
- GridViewRowPresenter.cs
- InvokeBinder.cs
- AppDomainFactory.cs
- ExtensionDataObject.cs
- PresentationTraceSources.cs
- EncryptedPackageFilter.cs
- ToolBarButtonClickEvent.cs
- MultiView.cs
- VisualBrush.cs
- AccessorTable.cs
- _NegoState.cs
- InternalConfigSettingsFactory.cs
- ValueConversionAttribute.cs
- Compilation.cs
- WSFederationHttpBindingElement.cs
- DynamicMethod.cs
- ToolboxItem.cs
- CompiledQuery.cs
- DeclaredTypeValidatorAttribute.cs
- SubMenuStyleCollection.cs