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
- filewebresponse.cs
- SortAction.cs
- Control.cs
- BitmapCacheBrush.cs
- DataGridViewCheckBoxCell.cs
- RequestChannelBinder.cs
- WSDualHttpSecurityElement.cs
- RayMeshGeometry3DHitTestResult.cs
- DocumentXmlWriter.cs
- SecurityUtils.cs
- ImageFormatConverter.cs
- AsyncResult.cs
- ProxyWebPartManager.cs
- PrintPreviewDialog.cs
- HttpSysSettings.cs
- UriSectionReader.cs
- UIntPtr.cs
- WSIdentityFaultException.cs
- OleDbDataReader.cs
- HtmlDocument.cs
- CollectionViewGroup.cs
- columnmapfactory.cs
- FontFamily.cs
- RSAPKCS1SignatureFormatter.cs
- StrongNameIdentityPermission.cs
- PasswordTextContainer.cs
- DependencyProperty.cs
- CollectionViewGroup.cs
- GestureRecognizer.cs
- WeakReadOnlyCollection.cs
- DateTimeConverter.cs
- LinqMaximalSubtreeNominator.cs
- ToolStripKeyboardHandlingService.cs
- Setter.cs
- basenumberconverter.cs
- RectangleGeometry.cs
- IgnoreDeviceFilterElement.cs
- LayoutEngine.cs
- VisualTreeHelper.cs
- PropertyManager.cs
- SubqueryRules.cs
- SafeFileHandle.cs
- ConfigurationLocation.cs
- DesignerTransactionCloseEvent.cs
- Error.cs
- CodeDelegateInvokeExpression.cs
- Group.cs
- ContextMarshalException.cs
- PaperSize.cs
- TabItem.cs
- SqlDataAdapter.cs
- ValidationRule.cs
- DataColumn.cs
- _SSPISessionCache.cs
- PreviewPageInfo.cs
- BuildManagerHost.cs
- StateItem.cs
- OAVariantLib.cs
- Model3DCollection.cs
- CodeDirectionExpression.cs
- ExitEventArgs.cs
- CookieHandler.cs
- XamlVector3DCollectionSerializer.cs
- cookiecontainer.cs
- ChannelBase.cs
- SelectorItemAutomationPeer.cs
- StylusButton.cs
- FtpRequestCacheValidator.cs
- MeasureItemEvent.cs
- BitArray.cs
- BufferModeSettings.cs
- ToolStripItemImageRenderEventArgs.cs
- Grant.cs
- SplitterCancelEvent.cs
- FigureParagraph.cs
- Listbox.cs
- ScriptControlDescriptor.cs
- RNGCryptoServiceProvider.cs
- ValueUnavailableException.cs
- ParserContext.cs
- ActiveDesignSurfaceEvent.cs
- SqlConnectionFactory.cs
- EntityViewGenerationAttribute.cs
- CounterSample.cs
- HtmlButton.cs
- StylusPointPropertyId.cs
- DynamicVirtualDiscoSearcher.cs
- XamlPoint3DCollectionSerializer.cs
- LabelEditEvent.cs
- KeyValueConfigurationCollection.cs
- UnknownBitmapEncoder.cs
- SpecialNameAttribute.cs
- StringExpressionSet.cs
- PropertyOverridesDialog.cs
- HScrollBar.cs
- StylusPointProperty.cs
- SoapSchemaImporter.cs
- DesignerExtenders.cs
- StringToken.cs
- BrowserCapabilitiesCodeGenerator.cs