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
- Geometry3D.cs
- AnnotationResource.cs
- SQLBytesStorage.cs
- RuleInfoComparer.cs
- Graphics.cs
- ThreadInterruptedException.cs
- ChameleonKey.cs
- ControlCachePolicy.cs
- Rect.cs
- WindowVisualStateTracker.cs
- BitArray.cs
- ConfigurationFileMap.cs
- CodeTypeDeclarationCollection.cs
- TextParaLineResult.cs
- relpropertyhelper.cs
- EntityDataSourceDesignerHelper.cs
- DbgCompiler.cs
- Substitution.cs
- DynamicResourceExtension.cs
- DataRecordInfo.cs
- ExclusiveCanonicalizationTransform.cs
- KeysConverter.cs
- MenuEventArgs.cs
- XXXOnTypeBuilderInstantiation.cs
- SiteMapNode.cs
- InvalidCardException.cs
- ConfigurationManagerHelper.cs
- DataRowView.cs
- ServiceTimeoutsBehavior.cs
- StyleSelector.cs
- ValidatorUtils.cs
- InfocardInteractiveChannelInitializer.cs
- ContextMenuService.cs
- MouseGesture.cs
- DataSetMappper.cs
- DiagnosticsConfigurationHandler.cs
- XmlStreamNodeWriter.cs
- CompilerCollection.cs
- AutomationElementCollection.cs
- ProcessHost.cs
- PartialCachingControl.cs
- StreamWithDictionary.cs
- RepeatInfo.cs
- UriParserTemplates.cs
- OracleBoolean.cs
- XmlAttribute.cs
- XmlSerializationReader.cs
- HttpWebRequest.cs
- BitmapEffect.cs
- TypeDescriptionProvider.cs
- HtmlWindowCollection.cs
- SystemPens.cs
- SiteMap.cs
- Animatable.cs
- DNS.cs
- NumberFormatInfo.cs
- ActiveXSite.cs
- TableRow.cs
- _ConnectStream.cs
- PermissionSet.cs
- KeyboardNavigation.cs
- UnhandledExceptionEventArgs.cs
- ClientBuildManager.cs
- UpDownBase.cs
- ResourceAssociationSetEnd.cs
- OuterGlowBitmapEffect.cs
- Site.cs
- ViewPort3D.cs
- DbConnectionHelper.cs
- TemplatingOptionsDialog.cs
- DataGridViewColumn.cs
- compensatingcollection.cs
- Operators.cs
- LocalizedNameDescriptionPair.cs
- ManipulationDevice.cs
- CodeTypeConstructor.cs
- SoapSchemaImporter.cs
- EditorPartCollection.cs
- EventSinkActivityDesigner.cs
- PolicyVersionConverter.cs
- SimpleMailWebEventProvider.cs
- SqlParameterCollection.cs
- XmlDocumentSurrogate.cs
- HtmlTableRow.cs
- StackOverflowException.cs
- RouteItem.cs
- SecurityContext.cs
- UnsafeNativeMethods.cs
- WindowsRegion.cs
- StaticResourceExtension.cs
- XamlFigureLengthSerializer.cs
- BinaryKeyIdentifierClause.cs
- IisTraceWebEventProvider.cs
- OdbcConnectionOpen.cs
- DatagridviewDisplayedBandsData.cs
- FrameSecurityDescriptor.cs
- BaseDataList.cs
- FileChangesMonitor.cs
- SerializerProvider.cs
- GeometryModel3D.cs