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
- localization.cs
- SecurityCredentialsManager.cs
- EdmMember.cs
- FileClassifier.cs
- QueryGeneratorBase.cs
- Array.cs
- CfgRule.cs
- InternalSafeNativeMethods.cs
- WebPartHelpVerb.cs
- SpecularMaterial.cs
- XmlStreamStore.cs
- PartialTrustHelpers.cs
- ApplicationTrust.cs
- CategoryGridEntry.cs
- CodeGenerator.cs
- TextDocumentView.cs
- WebHttpEndpointElement.cs
- MatcherBuilder.cs
- DataPagerCommandEventArgs.cs
- CodeArgumentReferenceExpression.cs
- FastEncoderWindow.cs
- ContextMenuAutomationPeer.cs
- GlyphsSerializer.cs
- BatchParser.cs
- ReadOnlyAttribute.cs
- TagPrefixCollection.cs
- ActivityTrace.cs
- SqlTransaction.cs
- CodeGeneratorOptions.cs
- CompilerResults.cs
- FileDialog.cs
- ReferencedAssembly.cs
- RepeaterItemEventArgs.cs
- MenuTracker.cs
- ImageFormat.cs
- Decoder.cs
- CodeTypeDeclarationCollection.cs
- FieldMetadata.cs
- BuildProvider.cs
- FieldToken.cs
- ProgressBarAutomationPeer.cs
- PassportAuthenticationModule.cs
- ADMembershipUser.cs
- LoginUtil.cs
- MonthCalendarDesigner.cs
- DataListItemEventArgs.cs
- SortAction.cs
- DataContractSerializerSection.cs
- DecimalMinMaxAggregationOperator.cs
- RectangleGeometry.cs
- Misc.cs
- MediaPlayerState.cs
- ExpressionBuilder.cs
- IPHostEntry.cs
- XmlNodeReader.cs
- BindableAttribute.cs
- WpfPayload.cs
- Transform.cs
- SafeThreadHandle.cs
- StatusBar.cs
- DoubleLinkListEnumerator.cs
- DesignerView.cs
- XPathQilFactory.cs
- HttpResponseWrapper.cs
- NumberFormatInfo.cs
- ValidationPropertyAttribute.cs
- FormViewRow.cs
- DefaultTextStore.cs
- UserControl.cs
- FlowDocumentPageViewerAutomationPeer.cs
- BitmapImage.cs
- MSAAWinEventWrap.cs
- ByteStreamGeometryContext.cs
- PatternMatcher.cs
- NativeMethods.cs
- _NtlmClient.cs
- OleDbConnectionFactory.cs
- ActionMessageFilterTable.cs
- XmlSchemaCompilationSettings.cs
- NonDualMessageSecurityOverHttp.cs
- MaskedTextBoxDesignerActionList.cs
- WorkflowItemPresenter.cs
- SecondaryIndexList.cs
- FixedDocumentSequencePaginator.cs
- JulianCalendar.cs
- PackageRelationship.cs
- RadioButton.cs
- XPathEmptyIterator.cs
- PathGradientBrush.cs
- DataGridCheckBoxColumn.cs
- ApplicationSettingsBase.cs
- TreeViewTemplateSelector.cs
- GraphicsPathIterator.cs
- RectAnimation.cs
- ByteFacetDescriptionElement.cs
- PropertyChangedEventArgs.cs
- EntityClassGenerator.cs
- HttpCachePolicy.cs
- ServiceManager.cs
- OdbcRowUpdatingEvent.cs