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
- ResourceManager.cs
- VirtualDirectoryMapping.cs
- GotoExpression.cs
- NameValueSectionHandler.cs
- RadioButtonFlatAdapter.cs
- XmlUrlResolver.cs
- ADConnectionHelper.cs
- X509SecurityToken.cs
- FileChangesMonitor.cs
- ScriptRegistrationManager.cs
- columnmapfactory.cs
- ParentUndoUnit.cs
- XmlEncodedRawTextWriter.cs
- FileDataSourceCache.cs
- XXXOnTypeBuilderInstantiation.cs
- ConfigurationManagerHelper.cs
- odbcmetadatacolumnnames.cs
- Geometry.cs
- ContactManager.cs
- ImagingCache.cs
- ConnectionInterfaceCollection.cs
- NameValueConfigurationElement.cs
- CollectionCodeDomSerializer.cs
- EntityDataSourceQueryBuilder.cs
- StatusBarItemAutomationPeer.cs
- DesignerActionUIService.cs
- BamlCollectionHolder.cs
- RelatedCurrencyManager.cs
- IRCollection.cs
- HtmlControl.cs
- RtType.cs
- ListBoxDesigner.cs
- SiteMap.cs
- Int16KeyFrameCollection.cs
- MatrixAnimationBase.cs
- HtmlInputButton.cs
- Application.cs
- HttpCapabilitiesBase.cs
- MutableAssemblyCacheEntry.cs
- SendMailErrorEventArgs.cs
- NullableFloatAverageAggregationOperator.cs
- AssemblyUtil.cs
- WsatRegistrationHeader.cs
- AnnotationHighlightLayer.cs
- DBConnection.cs
- RequestQueue.cs
- LinkUtilities.cs
- TreeNodeClickEventArgs.cs
- XmlSchemaNotation.cs
- FontSizeConverter.cs
- InlinedAggregationOperator.cs
- GuidelineCollection.cs
- querybuilder.cs
- MetaType.cs
- ZipIOBlockManager.cs
- HelpProvider.cs
- HelpKeywordAttribute.cs
- XmlNodeChangedEventArgs.cs
- WebPartEditorOkVerb.cs
- ListViewItemEventArgs.cs
- PeerName.cs
- ConditionalAttribute.cs
- PostBackOptions.cs
- SiteMapHierarchicalDataSourceView.cs
- TdsRecordBufferSetter.cs
- XsltContext.cs
- InstancePersistenceContext.cs
- EventDrivenDesigner.cs
- Attributes.cs
- RubberbandSelector.cs
- ButtonBaseAdapter.cs
- formatter.cs
- shaperfactoryquerycacheentry.cs
- TraceLog.cs
- TreeNodeStyleCollection.cs
- EntityDataSourceStatementEditor.cs
- StateDesigner.cs
- ExceptionHandlers.cs
- AppDomainUnloadedException.cs
- KnownTypesHelper.cs
- StringOutput.cs
- TcpChannelHelper.cs
- File.cs
- HttpServerProtocol.cs
- ReferencedType.cs
- BindableTemplateBuilder.cs
- XmlSchemaNotation.cs
- ProcessHostMapPath.cs
- List.cs
- SelectorItemAutomationPeer.cs
- CultureInfoConverter.cs
- TypeConverterHelper.cs
- ProcessHostServerConfig.cs
- ResourceDescriptionAttribute.cs
- ValidationService.cs
- HMACRIPEMD160.cs
- AnnotationService.cs
- PluggableProtocol.cs
- DataGridTextBox.cs
- SoapMessage.cs