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
- CellTreeNode.cs
- ConfigXmlText.cs
- PointCollection.cs
- EntityDataSourceEntityTypeFilterConverter.cs
- WpfSharedBamlSchemaContext.cs
- DataObjectCopyingEventArgs.cs
- TreeViewHitTestInfo.cs
- OptionalColumn.cs
- InstanceData.cs
- ControlType.cs
- PropertiesTab.cs
- SelectedGridItemChangedEvent.cs
- DataControlPagerLinkButton.cs
- TextSelectionHelper.cs
- XmlSchemaSimpleType.cs
- RegexMatchCollection.cs
- EventsTab.cs
- WebPartPersonalization.cs
- TextEffect.cs
- ValidateNames.cs
- SerializationInfoEnumerator.cs
- UserControl.cs
- DocumentCollection.cs
- Command.cs
- SingleAnimation.cs
- TagPrefixCollection.cs
- SqlAliaser.cs
- XmlDocumentFragment.cs
- XmlSchemaAttributeGroupRef.cs
- NonSerializedAttribute.cs
- EdmConstants.cs
- XmlElementAttribute.cs
- TypeInfo.cs
- ConstantSlot.cs
- DesignerRegionMouseEventArgs.cs
- MetadataItemSerializer.cs
- CSharpCodeProvider.cs
- NamedPipeChannelFactory.cs
- ParameterBuilder.cs
- SafeNativeMethods.cs
- TreeViewHitTestInfo.cs
- MgmtConfigurationRecord.cs
- VersionConverter.cs
- CharacterString.cs
- TextEffect.cs
- MobileCategoryAttribute.cs
- BindingParameterCollection.cs
- FormsAuthenticationUserCollection.cs
- KnownTypesHelper.cs
- SqlComparer.cs
- PartialList.cs
- TextBounds.cs
- Soap12ProtocolReflector.cs
- DPAPIProtectedConfigurationProvider.cs
- PerformanceCountersElement.cs
- UserControlBuildProvider.cs
- SecurityTokenResolver.cs
- WindowsFormsHostAutomationPeer.cs
- CommonXSendMessage.cs
- BookmarkCallbackWrapper.cs
- StickyNoteAnnotations.cs
- ResourcePermissionBaseEntry.cs
- SystemIPAddressInformation.cs
- XamlSerializerUtil.cs
- QueryResponse.cs
- SelectionEditingBehavior.cs
- mediaeventshelper.cs
- Quaternion.cs
- GraphicsContext.cs
- LookupNode.cs
- EncryptedData.cs
- EditorZoneAutoFormat.cs
- HtmlControl.cs
- XamlStyleSerializer.cs
- _TLSstream.cs
- XmlNamespaceDeclarationsAttribute.cs
- QilIterator.cs
- _HeaderInfo.cs
- StringOutput.cs
- ColumnMapVisitor.cs
- BinHexEncoder.cs
- LogicalMethodInfo.cs
- FormatConvertedBitmap.cs
- WebPartDeleteVerb.cs
- BindingContext.cs
- PassportAuthentication.cs
- Error.cs
- RowVisual.cs
- WebPartZoneBase.cs
- SqlUdtInfo.cs
- ObjectItemAttributeAssemblyLoader.cs
- WebPartDisplayModeEventArgs.cs
- SHA512CryptoServiceProvider.cs
- TextRangeEditLists.cs
- InputBinding.cs
- ICollection.cs
- InputScopeNameConverter.cs
- ApplicationContext.cs
- LicenseContext.cs
- ContextQuery.cs