Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilReplaceVisitor.cs / 1305376 / QilReplaceVisitor.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Xml.Xsl; namespace System.Xml.Xsl.Qil { ////// Base internal class for visitors that replace the graph as they visit it. /// internal abstract class QilReplaceVisitor : QilVisitor { protected QilFactory f; public QilReplaceVisitor(QilFactory f) { this.f = f; } //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode VisitChildren(QilNode parent) { XmlQueryType oldParentType = parent.XmlType; bool recalcType = false; // Visit children for (int i = 0; i < parent.Count; i++) { QilNode oldChild = parent[i], newChild; XmlQueryType oldChildType = oldChild != null ? oldChild.XmlType : null; // Visit child if (IsReference(parent, i)) newChild = VisitReference(oldChild); else newChild = Visit(oldChild); // Only replace child and recalculate type if oldChild != newChild or oldChild.XmlType != newChild.XmlType if ((object) oldChild != (object) newChild || (newChild != null && (object) oldChildType != (object) newChild.XmlType)) { recalcType = true; parent[i] = newChild; } } if (recalcType) RecalculateType(parent, oldParentType); return parent; } //----------------------------------------------- // QilReplaceVisitor methods //----------------------------------------------- ////// Once children have been replaced, the Xml type is recalculated. /// protected virtual void RecalculateType(QilNode node, XmlQueryType oldType) { XmlQueryType newType; newType = f.TypeChecker.Check(node); // Note the use of AtMost to account for cases when folding of Error nodes in the graph cause // cardinality to be recalculated. // For example, (Sequence (TextCtor (Error "error")) (Int32 1)) => (Sequence (Error "error") (Int32 1)) // In this case, cardinality has gone from More to One Debug.Assert(newType.IsSubtypeOf(XmlQueryTypeFactory.AtMost(oldType, oldType.Cardinality)), "Replace shouldn't relax original type"); node.XmlType = newType; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Xml.Xsl; namespace System.Xml.Xsl.Qil { ////// Base internal class for visitors that replace the graph as they visit it. /// internal abstract class QilReplaceVisitor : QilVisitor { protected QilFactory f; public QilReplaceVisitor(QilFactory f) { this.f = f; } //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode VisitChildren(QilNode parent) { XmlQueryType oldParentType = parent.XmlType; bool recalcType = false; // Visit children for (int i = 0; i < parent.Count; i++) { QilNode oldChild = parent[i], newChild; XmlQueryType oldChildType = oldChild != null ? oldChild.XmlType : null; // Visit child if (IsReference(parent, i)) newChild = VisitReference(oldChild); else newChild = Visit(oldChild); // Only replace child and recalculate type if oldChild != newChild or oldChild.XmlType != newChild.XmlType if ((object) oldChild != (object) newChild || (newChild != null && (object) oldChildType != (object) newChild.XmlType)) { recalcType = true; parent[i] = newChild; } } if (recalcType) RecalculateType(parent, oldParentType); return parent; } //----------------------------------------------- // QilReplaceVisitor methods //----------------------------------------------- ////// Once children have been replaced, the Xml type is recalculated. /// protected virtual void RecalculateType(QilNode node, XmlQueryType oldType) { XmlQueryType newType; newType = f.TypeChecker.Check(node); // Note the use of AtMost to account for cases when folding of Error nodes in the graph cause // cardinality to be recalculated. // For example, (Sequence (TextCtor (Error "error")) (Int32 1)) => (Sequence (Error "error") (Int32 1)) // In this case, cardinality has gone from More to One Debug.Assert(newType.IsSubtypeOf(XmlQueryTypeFactory.AtMost(oldType, oldType.Cardinality)), "Replace shouldn't relax original type"); node.XmlType = newType; } } } // 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
- SqlDependencyUtils.cs
- RoutedUICommand.cs
- WindowCollection.cs
- Int32Storage.cs
- FunctionImportMapping.cs
- X509WindowsSecurityToken.cs
- DBConnectionString.cs
- RoutedEventConverter.cs
- IFlowDocumentViewer.cs
- SchemaCollectionCompiler.cs
- EtwTrackingBehaviorElement.cs
- HttpContext.cs
- FocusTracker.cs
- BufferedReceiveElement.cs
- InstanceOwnerException.cs
- EventLogger.cs
- PageTheme.cs
- RegistryPermission.cs
- CompatibleComparer.cs
- InvalidComObjectException.cs
- MultiBindingExpression.cs
- TokenBasedSet.cs
- ImageSourceConverter.cs
- WebPartRestoreVerb.cs
- MarshalByValueComponent.cs
- TextEndOfSegment.cs
- DateTimeFormatInfoScanner.cs
- ProfileSettings.cs
- DataKeyArray.cs
- RequestQueue.cs
- NamespaceEmitter.cs
- DataGridViewImageCell.cs
- TemplatePagerField.cs
- BaseProcessProtocolHandler.cs
- NumericUpDown.cs
- OutputScopeManager.cs
- URLIdentityPermission.cs
- HttpTransportSecurity.cs
- AutoGeneratedField.cs
- TableProviderWrapper.cs
- QueryCacheEntry.cs
- Executor.cs
- PropertyChangeTracker.cs
- ColumnMapTranslator.cs
- RoleManagerSection.cs
- Unit.cs
- Vector3DCollection.cs
- PublisherMembershipCondition.cs
- AVElementHelper.cs
- IndentTextWriter.cs
- Propagator.Evaluator.cs
- HttpPostClientProtocol.cs
- NetSectionGroup.cs
- DictionaryTraceRecord.cs
- Selection.cs
- SafeProcessHandle.cs
- Message.cs
- ImageAutomationPeer.cs
- TextTreeDeleteContentUndoUnit.cs
- DataGridToolTip.cs
- SecUtil.cs
- Transactions.cs
- CLRBindingWorker.cs
- GB18030Encoding.cs
- PersonalizableAttribute.cs
- Selection.cs
- NullableBoolConverter.cs
- KeyValueSerializer.cs
- UnmanagedMemoryStream.cs
- HandlerBase.cs
- MouseButtonEventArgs.cs
- Splitter.cs
- FilteredXmlReader.cs
- UnauthorizedWebPart.cs
- Roles.cs
- MD5.cs
- StreamReader.cs
- TextViewSelectionProcessor.cs
- SystemIPv6InterfaceProperties.cs
- DataColumn.cs
- SerializableAttribute.cs
- ObjectAssociationEndMapping.cs
- ApplicationSecurityInfo.cs
- EventLogPermissionHolder.cs
- HistoryEventArgs.cs
- XPathAxisIterator.cs
- BitmapSourceSafeMILHandle.cs
- ConfigurationException.cs
- EditorPartCollection.cs
- _FtpDataStream.cs
- ServiceSettingsResponseInfo.cs
- Bezier.cs
- DoubleCollectionValueSerializer.cs
- oledbconnectionstring.cs
- DocumentViewerAutomationPeer.cs
- SqlDataSourceStatusEventArgs.cs
- DataRelationPropertyDescriptor.cs
- EncoderReplacementFallback.cs
- TextFormatterContext.cs
- StringStorage.cs