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
- ModuleElement.cs
- OleAutBinder.cs
- GreaterThan.cs
- CookieParameter.cs
- smtpconnection.cs
- COM2DataTypeToManagedDataTypeConverter.cs
- BitmapSourceSafeMILHandle.cs
- IdentityNotMappedException.cs
- SelectionProcessor.cs
- assertwrapper.cs
- DataSourceControlBuilder.cs
- Publisher.cs
- HandlerFactoryCache.cs
- DragDrop.cs
- VirtualizingStackPanel.cs
- SourceItem.cs
- EncryptedHeaderXml.cs
- KeyFrames.cs
- CodeDomSerializerBase.cs
- SqlConnectionHelper.cs
- ColumnProvider.cs
- PositiveTimeSpanValidatorAttribute.cs
- Stylus.cs
- JavaScriptSerializer.cs
- _emptywebproxy.cs
- Simplifier.cs
- DataGridTextBox.cs
- EncoderReplacementFallback.cs
- Literal.cs
- ForwardPositionQuery.cs
- SystemThemeKey.cs
- ButtonColumn.cs
- IndexOutOfRangeException.cs
- TraversalRequest.cs
- EntityKey.cs
- SizeConverter.cs
- DesignerDataSchemaClass.cs
- ResetableIterator.cs
- XmlSchemaImporter.cs
- CustomAttribute.cs
- _Connection.cs
- HtmlInputImage.cs
- HostAdapter.cs
- XamlSerializerUtil.cs
- DivideByZeroException.cs
- DocumentViewerConstants.cs
- DiscriminatorMap.cs
- PackageRelationship.cs
- SQLString.cs
- QueryAccessibilityHelpEvent.cs
- XmlAnyElementAttribute.cs
- mda.cs
- MultilineStringConverter.cs
- XamlReaderConstants.cs
- OperationContextScope.cs
- RunWorkerCompletedEventArgs.cs
- XamlParser.cs
- UInt64.cs
- SiteMapHierarchicalDataSourceView.cs
- TextRunCache.cs
- SerTrace.cs
- BooleanStorage.cs
- SBCSCodePageEncoding.cs
- DbModificationCommandTree.cs
- MatchNoneMessageFilter.cs
- TreeNodeBinding.cs
- SQlBooleanStorage.cs
- LinkClickEvent.cs
- DictationGrammar.cs
- TextEditorSelection.cs
- ArrayConverter.cs
- sqlser.cs
- NetworkInformationPermission.cs
- ModelItemDictionary.cs
- FrameworkContextData.cs
- DbInsertCommandTree.cs
- DataMemberAttribute.cs
- RetrieveVirtualItemEventArgs.cs
- SplineQuaternionKeyFrame.cs
- COAUTHINFO.cs
- Profiler.cs
- DefaultParameterValueAttribute.cs
- MergePropertyDescriptor.cs
- FixedDocument.cs
- CurrencyManager.cs
- precedingsibling.cs
- StoreContentChangedEventArgs.cs
- SimpleHandlerBuildProvider.cs
- CopyOfAction.cs
- IdentityReference.cs
- SendActivityDesignerTheme.cs
- NativeMethods.cs
- EntityDataSourceWizardForm.cs
- Clock.cs
- TableRowCollection.cs
- InputReport.cs
- AsnEncodedData.cs
- SelectionHighlightInfo.cs
- SplineQuaternionKeyFrame.cs
- DeferredSelectedIndexReference.cs