Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilCloneVisitor.cs / 1305376 / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TagPrefixAttribute.cs
- WebPartZone.cs
- storepermission.cs
- PluggableProtocol.cs
- HashMembershipCondition.cs
- XmlDeclaration.cs
- RotateTransform3D.cs
- ProgressChangedEventArgs.cs
- _UriSyntax.cs
- StringPropertyBuilder.cs
- AppModelKnownContentFactory.cs
- DesignerContextDescriptor.cs
- DtcInterfaces.cs
- CustomAttributeSerializer.cs
- TableDetailsCollection.cs
- SizeLimitedCache.cs
- Transform3D.cs
- Grid.cs
- ConvertersCollection.cs
- Semaphore.cs
- Types.cs
- Interlocked.cs
- MinimizableAttributeTypeConverter.cs
- ProxyWebPartConnectionCollection.cs
- ContentOperations.cs
- RandomNumberGenerator.cs
- DataView.cs
- PreviewKeyDownEventArgs.cs
- MimeParameter.cs
- DatatypeImplementation.cs
- TypeCacheManager.cs
- ExecutionEngineException.cs
- DoubleLink.cs
- basenumberconverter.cs
- RotationValidation.cs
- Geometry.cs
- Form.cs
- RootBrowserWindowAutomationPeer.cs
- ASCIIEncoding.cs
- TraceContextEventArgs.cs
- OdbcCommandBuilder.cs
- OpacityConverter.cs
- SecurityDocument.cs
- MulticastIPAddressInformationCollection.cs
- FileSecurity.cs
- CredentialSelector.cs
- ObjectSecurity.cs
- UserNameSecurityTokenProvider.cs
- XappLauncher.cs
- XmlSchemaDocumentation.cs
- XmlValidatingReader.cs
- Int32RectValueSerializer.cs
- EntityContainerRelationshipSet.cs
- DataGridViewCellValueEventArgs.cs
- MediaElement.cs
- GridViewUpdatedEventArgs.cs
- IntMinMaxAggregationOperator.cs
- RuleRefElement.cs
- ListSourceHelper.cs
- EventLog.cs
- LayoutSettings.cs
- IResourceProvider.cs
- TypefaceMap.cs
- LeaseManager.cs
- GenerateHelper.cs
- SoapCodeExporter.cs
- PromptBuilder.cs
- ContentElement.cs
- DetailsViewRowCollection.cs
- XmlSchemaAny.cs
- SettingsBindableAttribute.cs
- _ConnectionGroup.cs
- IBuiltInEvidence.cs
- AsyncMethodInvoker.cs
- PropertyValue.cs
- Policy.cs
- WebFaultClientMessageInspector.cs
- FieldTemplateFactory.cs
- SchemaElement.cs
- CurrentChangedEventManager.cs
- UserPersonalizationStateInfo.cs
- XmlStreamStore.cs
- DataListCommandEventArgs.cs
- ExpressionEditorAttribute.cs
- Subset.cs
- CleanUpVirtualizedItemEventArgs.cs
- BufferAllocator.cs
- DocumentXmlWriter.cs
- XmlChildNodes.cs
- UInt16Converter.cs
- ConnectionStringsExpressionBuilder.cs
- CollectionViewSource.cs
- DataListItemEventArgs.cs
- XmlSchemaSimpleContentRestriction.cs
- LinqToSqlWrapper.cs
- Bidi.cs
- RequestContext.cs
- XamlVector3DCollectionSerializer.cs
- XhtmlBasicLinkAdapter.cs
- UnsafeNativeMethods.cs