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
- SspiSafeHandles.cs
- ForwardPositionQuery.cs
- RegularExpressionValidator.cs
- ChannelBuilder.cs
- HtmlTableRow.cs
- Vector3DIndependentAnimationStorage.cs
- SerialPinChanges.cs
- GlyphCache.cs
- altserialization.cs
- ElasticEase.cs
- WindowClosedEventArgs.cs
- CustomAssemblyResolver.cs
- XmlNodeChangedEventManager.cs
- PageRouteHandler.cs
- codemethodreferenceexpression.cs
- CrossContextChannel.cs
- VScrollProperties.cs
- BufferedWebEventProvider.cs
- MatrixCamera.cs
- SqlReferenceCollection.cs
- BackStopAuthenticationModule.cs
- IntellisenseTextBox.cs
- MultiTrigger.cs
- ItemList.cs
- MeasureData.cs
- IndexingContentUnit.cs
- SingleObjectCollection.cs
- SortAction.cs
- TreeNodeBindingCollection.cs
- SecurityResources.cs
- DES.cs
- RowUpdatingEventArgs.cs
- SystemGatewayIPAddressInformation.cs
- Repeater.cs
- Compilation.cs
- CacheSection.cs
- ChildTable.cs
- TabletCollection.cs
- OleDbDataReader.cs
- NativeMethods.cs
- FormatSettings.cs
- ScrollChrome.cs
- SecurityToken.cs
- ListSortDescriptionCollection.cs
- EntityDataSourceDataSelection.cs
- RadioButton.cs
- IISMapPath.cs
- LocalizabilityAttribute.cs
- LinkButton.cs
- UIElement3DAutomationPeer.cs
- HttpCachePolicy.cs
- DataGridAddNewRow.cs
- EdmEntityTypeAttribute.cs
- TagNameToTypeMapper.cs
- SecurityPermission.cs
- DataRelationCollection.cs
- TypeDescriptionProviderAttribute.cs
- SpotLight.cs
- returneventsaver.cs
- Vector3DConverter.cs
- ColumnMapVisitor.cs
- ImageCreator.cs
- RowToParametersTransformer.cs
- RelationshipConstraintValidator.cs
- RecordsAffectedEventArgs.cs
- WindowsTooltip.cs
- PtsPage.cs
- QilFactory.cs
- ComPlusContractBehavior.cs
- ChangeProcessor.cs
- FunctionDescription.cs
- SolidBrush.cs
- PlanCompilerUtil.cs
- X509Chain.cs
- Attributes.cs
- SudsCommon.cs
- ExceptionUtil.cs
- SoapTransportImporter.cs
- SafeReadContext.cs
- Hyperlink.cs
- Grant.cs
- TextBox.cs
- PropertyMappingExceptionEventArgs.cs
- CodeMemberEvent.cs
- FormViewUpdateEventArgs.cs
- SecurityToken.cs
- SimpleFieldTemplateUserControl.cs
- Error.cs
- InternalBase.cs
- PathSegmentCollection.cs
- FamilyTypefaceCollection.cs
- EventSinkHelperWriter.cs
- CultureSpecificStringDictionary.cs
- ComAdminWrapper.cs
- SplitterDesigner.cs
- DateTimeFormat.cs
- SafeTokenHandle.cs
- WebBrowserNavigatingEventHandler.cs
- InvalidFilterCriteriaException.cs
- WindowsProgressbar.cs