Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / 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
- MLangCodePageEncoding.cs
- PEFileEvidenceFactory.cs
- ThreadStaticAttribute.cs
- OrthographicCamera.cs
- ProgressBarAutomationPeer.cs
- ConstructorExpr.cs
- ComMethodElement.cs
- UnsafeNativeMethods.cs
- CharacterBuffer.cs
- StreamAsIStream.cs
- HtmlControl.cs
- ScaleTransform.cs
- oledbconnectionstring.cs
- PrintDialogException.cs
- ExpressionBindingCollection.cs
- XNodeValidator.cs
- RefExpr.cs
- ContentDisposition.cs
- SafeNativeMethods.cs
- PathSegment.cs
- DateTimeSerializationSection.cs
- JournalNavigationScope.cs
- XamlFilter.cs
- ParserStreamGeometryContext.cs
- ApplicationInterop.cs
- GroupBox.cs
- BaseTemplateParser.cs
- HandleCollector.cs
- DelayedRegex.cs
- TextFormatter.cs
- ConcatQueryOperator.cs
- Control.cs
- LayoutExceptionEventArgs.cs
- CodeDOMProvider.cs
- ContextMenuStrip.cs
- MouseButtonEventArgs.cs
- WebHeaderCollection.cs
- XmlSchemaDocumentation.cs
- ToolStripControlHost.cs
- HtmlTitle.cs
- ProcessManager.cs
- HttpClientProtocol.cs
- DictionaryBase.cs
- FontNameEditor.cs
- WinInetCache.cs
- DataServicePagingProviderWrapper.cs
- _HeaderInfoTable.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- DataRowChangeEvent.cs
- SortQuery.cs
- ValidatingReaderNodeData.cs
- PointF.cs
- ReadOnlyDataSource.cs
- MessageQueueInstaller.cs
- FixedPage.cs
- DataExpression.cs
- ChannelSinkStacks.cs
- ConfigErrorGlyph.cs
- Table.cs
- ICspAsymmetricAlgorithm.cs
- PatternMatcher.cs
- XmlSchemaSequence.cs
- StreamUpdate.cs
- RootAction.cs
- CellIdBoolean.cs
- basecomparevalidator.cs
- JsonByteArrayDataContract.cs
- AdornedElementPlaceholder.cs
- CacheMemory.cs
- XmlAnyElementAttribute.cs
- VisualTreeUtils.cs
- ClassHandlersStore.cs
- TranslateTransform3D.cs
- SettingsPropertyValue.cs
- MetadataWorkspace.cs
- HwndProxyElementProvider.cs
- ViewValidator.cs
- UInt16Converter.cs
- GridItemPattern.cs
- BinaryNode.cs
- EdmTypeAttribute.cs
- Int16AnimationBase.cs
- ParsedRoute.cs
- CustomAssemblyResolver.cs
- DescriptionAttribute.cs
- WindowsFormsHostAutomationPeer.cs
- WebBrowserHelper.cs
- Decoder.cs
- ExtensibleClassFactory.cs
- ConnectionPoolRegistry.cs
- FunctionNode.cs
- ParameterCollection.cs
- TriggerActionCollection.cs
- HttpProfileBase.cs
- QilInvokeEarlyBound.cs
- IEnumerable.cs
- CardSpaceSelector.cs
- RemotingHelper.cs
- PropagatorResult.cs
- FileDialogCustomPlacesCollection.cs