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
- SourceSwitch.cs
- FileSecurity.cs
- Help.cs
- ListenerConnectionModeReader.cs
- ReservationNotFoundException.cs
- AxHost.cs
- PageContentCollection.cs
- PrintingPermission.cs
- ExecutedRoutedEventArgs.cs
- PrimitiveSchema.cs
- ImmutableDispatchRuntime.cs
- FileFormatException.cs
- ListItemCollection.cs
- SqlCacheDependency.cs
- CompareInfo.cs
- XhtmlBasicFormAdapter.cs
- OrderByBuilder.cs
- StaticSiteMapProvider.cs
- ConfigXmlAttribute.cs
- PropertyRef.cs
- ValidationUtility.cs
- XmlIlTypeHelper.cs
- Config.cs
- ContextMenu.cs
- ContextProperty.cs
- DrawingVisualDrawingContext.cs
- DTCTransactionManager.cs
- HtmlInputFile.cs
- WsdlBuildProvider.cs
- DynamicMethod.cs
- TableItemPattern.cs
- MetadataArtifactLoaderComposite.cs
- BitmapEffectInputConnector.cs
- EdmRelationshipRoleAttribute.cs
- TableLayoutStyleCollection.cs
- FormViewInsertEventArgs.cs
- HtmlTableRow.cs
- FrameworkEventSource.cs
- SoapConverter.cs
- PerformanceCounterManager.cs
- UmAlQuraCalendar.cs
- QuaternionAnimation.cs
- RightsManagementInformation.cs
- DateTimeFormatInfo.cs
- GroupDescription.cs
- OciEnlistContext.cs
- URI.cs
- BindableTemplateBuilder.cs
- HttpCacheVaryByContentEncodings.cs
- DeleteMemberBinder.cs
- TypeElementCollection.cs
- WindowsIdentity.cs
- ButtonField.cs
- TableLayoutSettings.cs
- RootProfilePropertySettingsCollection.cs
- BindingCompleteEventArgs.cs
- DbProviderServices.cs
- HttpClientProtocol.cs
- UnauthorizedWebPart.cs
- DispatchWrapper.cs
- OpacityConverter.cs
- SafeThemeHandle.cs
- Schema.cs
- HttpVersion.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- HebrewCalendar.cs
- ApplicationInterop.cs
- HttpDebugHandler.cs
- Int32Collection.cs
- SystemFonts.cs
- SubtreeProcessor.cs
- SettingsBindableAttribute.cs
- ReadOnlyNameValueCollection.cs
- SessionViewState.cs
- HttpChannelHelper.cs
- UInt64.cs
- Wrapper.cs
- LogRecordSequence.cs
- AddValidationError.cs
- SqlFlattener.cs
- SQLMembershipProvider.cs
- WinFormsSpinner.cs
- CompoundFileStreamReference.cs
- EasingFunctionBase.cs
- SHA384Managed.cs
- XPathConvert.cs
- DataGridViewLinkCell.cs
- ApplicationGesture.cs
- ExecutorLocksHeldException.cs
- ChangesetResponse.cs
- HTMLTagNameToTypeMapper.cs
- NamespaceInfo.cs
- CookieHandler.cs
- XmlAtomicValue.cs
- PersonalizationAdministration.cs
- Border.cs
- RefreshPropertiesAttribute.cs
- WorkflowDebuggerSteppingAttribute.cs
- SafePEFileHandle.cs
- LicenseContext.cs