Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ResetableIterator.cs
- CodeLabeledStatement.cs
- EnumerableRowCollection.cs
- MdiWindowListStrip.cs
- CorrelationManager.cs
- XmlSchemaSimpleType.cs
- TextEditorCharacters.cs
- CodeDomLocalizationProvider.cs
- EastAsianLunisolarCalendar.cs
- SelectionPatternIdentifiers.cs
- CustomSignedXml.cs
- Ops.cs
- UrlPath.cs
- HtmlTextArea.cs
- DynamicDataRoute.cs
- UrlPath.cs
- SQLInt32.cs
- ThreadLocal.cs
- DispatcherProcessingDisabled.cs
- EmissiveMaterial.cs
- WebColorConverter.cs
- DoubleLinkList.cs
- DrawingDrawingContext.cs
- OracleConnectionStringBuilder.cs
- Privilege.cs
- ContextCorrelationInitializer.cs
- NativeMethods.cs
- ContextStaticAttribute.cs
- FrameworkContextData.cs
- PropertyDescriptor.cs
- BitmapFrameDecode.cs
- SqlDataSourceQueryEditorForm.cs
- RtfNavigator.cs
- SqlGenericUtil.cs
- DataGridTableCollection.cs
- CacheSection.cs
- XmlILConstructAnalyzer.cs
- Ref.cs
- IteratorFilter.cs
- PrefixQName.cs
- DelegateSerializationHolder.cs
- TextBoxLine.cs
- LastQueryOperator.cs
- ResolveMatchesMessageCD1.cs
- SelectorAutomationPeer.cs
- EntityTransaction.cs
- TargetPerspective.cs
- SqlMultiplexer.cs
- PropertyGeneratedEventArgs.cs
- ErrorWrapper.cs
- Propagator.Evaluator.cs
- CheckBox.cs
- MsmqIntegrationInputMessage.cs
- CompareInfo.cs
- URI.cs
- TargetException.cs
- PageFunction.cs
- SequenceDesigner.cs
- XmlDataSource.cs
- DocobjHost.cs
- SelectionItemProviderWrapper.cs
- FileNotFoundException.cs
- SubstitutionList.cs
- StringFunctions.cs
- QilGenerator.cs
- EntityDataSourceConfigureObjectContext.cs
- UserMapPath.cs
- CompensationDesigner.cs
- ExtendLockCommand.cs
- DataBoundControlAdapter.cs
- DefaultEventAttribute.cs
- Mappings.cs
- controlskin.cs
- WebBrowserEvent.cs
- MetadataFile.cs
- ADConnectionHelper.cs
- SponsorHelper.cs
- GotoExpression.cs
- xmlglyphRunInfo.cs
- ClassData.cs
- storepermission.cs
- ProcessProtocolHandler.cs
- OracleString.cs
- OutputCacheSection.cs
- ResourceProviderFactory.cs
- QuadraticEase.cs
- GcSettings.cs
- ResourceCategoryAttribute.cs
- _HTTPDateParse.cs
- ListControl.cs
- NativeCppClassAttribute.cs
- RangeValuePatternIdentifiers.cs
- CacheOutputQuery.cs
- CompilerGlobalScopeAttribute.cs
- OdbcCommandBuilder.cs
- FormViewDeleteEventArgs.cs
- KeyValuePairs.cs
- LogLogRecordHeader.cs
- FreeFormDragDropManager.cs
- Utils.cs