Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilReplaceVisitor.cs / 1 / 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 (!Ref.Equals(oldChild, newChild) || (newChild != null && !Ref.Equals(oldChildType, 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 (!Ref.Equals(oldChild, newChild) || (newChild != null && !Ref.Equals(oldChildType, 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
- XmlValidatingReader.cs
- EventLogLink.cs
- KeyToListMap.cs
- ValidationPropertyAttribute.cs
- RealizedColumnsBlock.cs
- SimpleHandlerBuildProvider.cs
- WebEventTraceProvider.cs
- Int32EqualityComparer.cs
- ConstructorExpr.cs
- EventArgs.cs
- RelatedView.cs
- PackagePartCollection.cs
- DataGridViewCellLinkedList.cs
- AspCompat.cs
- SecurityHeader.cs
- InternalSafeNativeMethods.cs
- DataRowCollection.cs
- WebPartCancelEventArgs.cs
- DetailsViewInsertEventArgs.cs
- Int64Storage.cs
- LassoSelectionBehavior.cs
- TextBox.cs
- ExtenderHelpers.cs
- DateTime.cs
- InnerItemCollectionView.cs
- WebSysDisplayNameAttribute.cs
- DataGridViewCellEventArgs.cs
- Stream.cs
- TcpProcessProtocolHandler.cs
- ILGenerator.cs
- ConstraintManager.cs
- httpstaticobjectscollection.cs
- Win32PrintDialog.cs
- RefExpr.cs
- X509ChainPolicy.cs
- UIElementHelper.cs
- EdmItemCollection.cs
- ChtmlPhoneCallAdapter.cs
- Error.cs
- XmlSchema.cs
- AuthorizationRule.cs
- Grammar.cs
- Security.cs
- XmlExtensionFunction.cs
- CompilerCollection.cs
- TableLayout.cs
- ScrollProviderWrapper.cs
- MsmqInputSessionChannelListener.cs
- WsatEtwTraceListener.cs
- SystemIPv6InterfaceProperties.cs
- Helpers.cs
- X509AsymmetricSecurityKey.cs
- KeyTime.cs
- EditorZoneBase.cs
- SapiRecoContext.cs
- LoadedEvent.cs
- FormatterConverter.cs
- TableCellCollection.cs
- Missing.cs
- selecteditemcollection.cs
- QilGeneratorEnv.cs
- GridEntryCollection.cs
- PersonalizationProviderCollection.cs
- WebBaseEventKeyComparer.cs
- RectConverter.cs
- ECDsaCng.cs
- ListBoxItem.cs
- ManipulationStartedEventArgs.cs
- CreationContext.cs
- XamlFigureLengthSerializer.cs
- TraceHwndHost.cs
- Transactions.cs
- BufferedReadStream.cs
- VBIdentifierTrimConverter.cs
- TextWriter.cs
- HierarchicalDataSourceConverter.cs
- TableRow.cs
- TextSelectionHelper.cs
- CodeTypeDeclarationCollection.cs
- SslStream.cs
- EntityDataSourceMemberPath.cs
- DataRelationCollection.cs
- InputScopeNameConverter.cs
- ProxyWebPartManager.cs
- RuntimeEnvironment.cs
- NullReferenceException.cs
- CqlIdentifiers.cs
- WebRequest.cs
- TrustManager.cs
- Model3D.cs
- SpStreamWrapper.cs
- TypeLibConverter.cs
- Page.cs
- RewritingProcessor.cs
- ByteRangeDownloader.cs
- HttpTransportElement.cs
- BitmapPalettes.cs
- InstanceCollisionException.cs
- ListBase.cs
- DataGridViewCellLinkedList.cs