summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/CCI/StandardVisitor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/CCI/StandardVisitor.cs')
-rw-r--r--tools/Sandcastle/Source/CCI/StandardVisitor.cs2225
1 files changed, 2225 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/CCI/StandardVisitor.cs b/tools/Sandcastle/Source/CCI/StandardVisitor.cs
new file mode 100644
index 0000000..fcc6ba6
--- /dev/null
+++ b/tools/Sandcastle/Source/CCI/StandardVisitor.cs
@@ -0,0 +1,2225 @@
+// Copyright © Microsoft Corporation.
+// This source file is subject to the Microsoft Permissive License.
+// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
+// All other rights reserved.
+
+using System;
+using System.CodeDom.Compiler;
+using System.Collections;
+using System.Diagnostics;
+#if FxCop
+using AttributeList = Microsoft.Cci.AttributeNodeCollection;
+using BlockList = Microsoft.Cci.BlockCollection;
+using ExpressionList = Microsoft.Cci.ExpressionCollection;
+using InterfaceList = Microsoft.Cci.InterfaceCollection;
+using MemberList = Microsoft.Cci.MemberCollection;
+using NodeList = Microsoft.Cci.NodeCollection;
+using ParameterList = Microsoft.Cci.ParameterCollection;
+using SecurityAttributeList = Microsoft.Cci.SecurityAttributeCollection;
+using StatementList = Microsoft.Cci.StatementCollection;
+using TypeNodeList = Microsoft.Cci.TypeNodeCollection;
+using Property = Microsoft.Cci.PropertyNode;
+using Module = Microsoft.Cci.ModuleNode;
+using Return = Microsoft.Cci.ReturnNode;
+using Class = Microsoft.Cci.ClassNode;
+using Interface = Microsoft.Cci.InterfaceNode;
+using Event = Microsoft.Cci.EventNode;
+using Throw = Microsoft.Cci.ThrowNode;
+#endif
+#if CCINamespace
+namespace Microsoft.Cci{
+#else
+namespace System.Compiler
+{
+#endif
+
+ /// <summary>
+ /// Base for all classes that process the IR using the visitor pattern.
+ /// </summary>
+#if !FxCop
+ public
+#endif
+ abstract class Visitor
+ {
+ /// <summary>
+ /// Switches on node.NodeType to call a visitor method that has been specialized for node.
+ /// </summary>
+ /// <param name="node">The node to be visited.</param>
+ /// <returns> Returns null if node is null. Otherwise returns an updated node (possibly a different object).</returns>
+ public abstract Node Visit(Node node);
+#if !MinimalReader
+ /// <summary>
+ /// Transfers the state from one visitor to another. This enables separate visitor instances to cooperative process a single IR.
+ /// </summary>
+ public virtual void TransferStateTo(Visitor targetVisitor)
+ {
+ }
+#endif
+ public virtual ExpressionList VisitExpressionList(ExpressionList list)
+ {
+ if (list == null) return null;
+ for (int i = 0, n = list.Count; i < n; i++)
+ list[i] = (Expression)this.Visit(list[i]);
+ return list;
+ }
+ }
+
+ /// <summary>
+ /// Walks an IR, mutuating it into a new form
+ /// </summary>
+#if !FxCop
+ public
+#endif
+ class StandardVisitor : Visitor
+ {
+#if !MinimalReader
+ public Visitor callingVisitor;
+#endif
+ protected bool memberListNamesChanged;
+
+ public StandardVisitor()
+ {
+ }
+#if !MinimalReader
+ public StandardVisitor(Visitor callingVisitor)
+ {
+ this.callingVisitor = callingVisitor;
+ }
+#endif
+ public virtual Node VisitUnknownNodeType(Node node)
+ {
+#if !MinimalReader
+ Visitor visitor = this.GetVisitorFor(node);
+ if (visitor == null) return node;
+ if (this.callingVisitor != null)
+ //Allow specialized state (unknown to this visitor) to propagate all the way down to the new visitor
+ this.callingVisitor.TransferStateTo(visitor);
+ this.TransferStateTo(visitor);
+ node = visitor.Visit(node);
+ visitor.TransferStateTo(this);
+ if (this.callingVisitor != null)
+ //Propagate specialized state (unknown to this visitor) all the way up the chain
+ visitor.TransferStateTo(this.callingVisitor);
+#else
+ Debug.Assert(false);
+#endif
+ return node;
+ }
+#if !MinimalReader
+ public virtual Visitor GetVisitorFor(Node node)
+ {
+ if (node == null) return null;
+ return (Visitor)node.GetVisitorFor(this, this.GetType().Name);
+ }
+#endif
+ public override Node Visit(Node node)
+ {
+ if (node == null) return null;
+ switch (node.NodeType)
+ {
+#if !MinimalReader
+ case NodeType.Acquire:
+ return this.VisitAcquire((Acquire)node);
+#endif
+ case NodeType.AddressDereference:
+ return this.VisitAddressDereference((AddressDereference)node);
+#if !MinimalReader
+ case NodeType.AliasDefinition:
+ return this.VisitAliasDefinition((AliasDefinition)node);
+ case NodeType.AnonymousNestedFunction:
+ return this.VisitAnonymousNestedFunction((AnonymousNestedFunction)node);
+ case NodeType.ApplyToAll:
+ return this.VisitApplyToAll((ApplyToAll)node);
+#endif
+ case NodeType.Arglist:
+ return this.VisitExpression((Expression)node);
+#if !MinimalReader
+ case NodeType.ArglistArgumentExpression:
+ return this.VisitArglistArgumentExpression((ArglistArgumentExpression)node);
+ case NodeType.ArglistExpression:
+ return this.VisitArglistExpression((ArglistExpression)node);
+#endif
+ case NodeType.ArrayType:
+ Debug.Assert(false); return null;
+ case NodeType.Assembly:
+ return this.VisitAssembly((AssemblyNode)node);
+ case NodeType.AssemblyReference:
+ return this.VisitAssemblyReference((AssemblyReference)node);
+#if !MinimalReader
+ case NodeType.Assertion:
+ return this.VisitAssertion((Assertion)node);
+ case NodeType.Assumption:
+ return this.VisitAssumption((Assumption)node);
+ case NodeType.AssignmentExpression:
+ return this.VisitAssignmentExpression((AssignmentExpression)node);
+#endif
+ case NodeType.AssignmentStatement:
+ return this.VisitAssignmentStatement((AssignmentStatement)node);
+ case NodeType.Attribute:
+ return this.VisitAttributeNode((AttributeNode)node);
+#if !MinimalReader
+ case NodeType.Base:
+ return this.VisitBase((Base)node);
+#endif
+ case NodeType.Block:
+ return this.VisitBlock((Block)node);
+#if !MinimalReader
+ case NodeType.BlockExpression:
+ return this.VisitBlockExpression((BlockExpression)node);
+#endif
+ case NodeType.Branch:
+ return this.VisitBranch((Branch)node);
+#if !MinimalReader
+ case NodeType.Compilation:
+ return this.VisitCompilation((Compilation)node);
+ case NodeType.CompilationUnit:
+ return this.VisitCompilationUnit((CompilationUnit)node);
+ case NodeType.CompilationUnitSnippet:
+ return this.VisitCompilationUnitSnippet((CompilationUnitSnippet)node);
+#endif
+#if ExtendedRuntime
+ case NodeType.ConstrainedType:
+ return this.VisitConstrainedType((ConstrainedType)node);
+#endif
+#if !MinimalReader
+ case NodeType.Continue:
+ return this.VisitContinue((Continue)node);
+ case NodeType.CurrentClosure:
+ return this.VisitCurrentClosure((CurrentClosure)node);
+#endif
+ case NodeType.DebugBreak:
+ return node;
+ case NodeType.Call:
+ case NodeType.Calli:
+ case NodeType.Callvirt:
+ case NodeType.Jmp:
+#if !MinimalReader
+ case NodeType.MethodCall:
+#endif
+ return this.VisitMethodCall((MethodCall)node);
+#if !MinimalReader
+ case NodeType.Catch:
+ return this.VisitCatch((Catch)node);
+#endif
+ case NodeType.Class:
+ return this.VisitClass((Class)node);
+#if !MinimalReader
+ case NodeType.CoerceTuple:
+ return this.VisitCoerceTuple((CoerceTuple)node);
+ case NodeType.CollectionEnumerator:
+ return this.VisitCollectionEnumerator((CollectionEnumerator)node);
+ case NodeType.Composition:
+ return this.VisitComposition((Composition)node);
+#endif
+ case NodeType.Construct:
+ return this.VisitConstruct((Construct)node);
+ case NodeType.ConstructArray:
+ return this.VisitConstructArray((ConstructArray)node);
+#if !MinimalReader
+ case NodeType.ConstructDelegate:
+ return this.VisitConstructDelegate((ConstructDelegate)node);
+ case NodeType.ConstructFlexArray:
+ return this.VisitConstructFlexArray((ConstructFlexArray)node);
+ case NodeType.ConstructIterator:
+ return this.VisitConstructIterator((ConstructIterator)node);
+ case NodeType.ConstructTuple:
+ return this.VisitConstructTuple((ConstructTuple)node);
+#endif
+ case NodeType.DelegateNode:
+ return this.VisitDelegateNode((DelegateNode)node);
+#if !MinimalReader
+ case NodeType.DoWhile:
+ return this.VisitDoWhile((DoWhile)node);
+#endif
+ case NodeType.Dup:
+ return this.VisitExpression((Expression)node);
+ case NodeType.EndFilter:
+ return this.VisitEndFilter((EndFilter)node);
+ case NodeType.EndFinally:
+ return this.VisitEndFinally((EndFinally)node);
+ case NodeType.EnumNode:
+ return this.VisitEnumNode((EnumNode)node);
+ case NodeType.Event:
+ return this.VisitEvent((Event)node);
+#if ExtendedRuntime
+ case NodeType.EnsuresExceptional :
+ return this.VisitEnsuresExceptional((EnsuresExceptional)node);
+#endif
+#if !MinimalReader
+ case NodeType.Exit:
+ return this.VisitExit((Exit)node);
+ case NodeType.Read:
+ case NodeType.Write:
+ return this.VisitExpose((Expose)node);
+ case NodeType.ExpressionSnippet:
+ return this.VisitExpressionSnippet((ExpressionSnippet)node);
+#endif
+ case NodeType.ExpressionStatement:
+ return this.VisitExpressionStatement((ExpressionStatement)node);
+#if !MinimalReader
+ case NodeType.FaultHandler:
+ return this.VisitFaultHandler((FaultHandler)node);
+#endif
+ case NodeType.Field:
+ return this.VisitField((Field)node);
+#if !MinimalReader
+ case NodeType.FieldInitializerBlock:
+ return this.VisitFieldInitializerBlock((FieldInitializerBlock)node);
+ case NodeType.Finally:
+ return this.VisitFinally((Finally)node);
+ case NodeType.Filter:
+ return this.VisitFilter((Filter)node);
+ case NodeType.Fixed:
+ return this.VisitFixed((Fixed)node);
+ case NodeType.For:
+ return this.VisitFor((For)node);
+ case NodeType.ForEach:
+ return this.VisitForEach((ForEach)node);
+ case NodeType.FunctionDeclaration:
+ return this.VisitFunctionDeclaration((FunctionDeclaration)node);
+ case NodeType.Goto:
+ return this.VisitGoto((Goto)node);
+ case NodeType.GotoCase:
+ return this.VisitGotoCase((GotoCase)node);
+#endif
+ case NodeType.Identifier:
+ return this.VisitIdentifier((Identifier)node);
+#if !MinimalReader
+ case NodeType.If:
+ return this.VisitIf((If)node);
+ case NodeType.ImplicitThis:
+ return this.VisitImplicitThis((ImplicitThis)node);
+#endif
+ case NodeType.Indexer:
+ return this.VisitIndexer((Indexer)node);
+ case NodeType.InstanceInitializer:
+ return this.VisitInstanceInitializer((InstanceInitializer)node);
+#if ExtendedRuntime
+ case NodeType.Invariant :
+ return this.VisitInvariant((Invariant)node);
+#endif
+ case NodeType.StaticInitializer:
+ return this.VisitStaticInitializer((StaticInitializer)node);
+ case NodeType.Method:
+ return this.VisitMethod((Method)node);
+#if !MinimalReader
+ case NodeType.TemplateInstance:
+ return this.VisitTemplateInstance((TemplateInstance)node);
+ case NodeType.StackAlloc:
+ return this.VisitStackAlloc((StackAlloc)node);
+#endif
+ case NodeType.Interface:
+ return this.VisitInterface((Interface)node);
+#if !MinimalReader
+ case NodeType.LabeledStatement:
+ return this.VisitLabeledStatement((LabeledStatement)node);
+#endif
+ case NodeType.Literal:
+ return this.VisitLiteral((Literal)node);
+ case NodeType.Local:
+ return this.VisitLocal((Local)node);
+#if !MinimalReader
+ case NodeType.LocalDeclaration:
+ return this.VisitLocalDeclaration((LocalDeclaration)node);
+ case NodeType.LocalDeclarationsStatement:
+ return this.VisitLocalDeclarationsStatement((LocalDeclarationsStatement)node);
+ case NodeType.Lock:
+ return this.VisitLock((Lock)node);
+ case NodeType.LRExpression:
+ return this.VisitLRExpression((LRExpression)node);
+#endif
+ case NodeType.MemberBinding:
+ return this.VisitMemberBinding((MemberBinding)node);
+#if ExtendedRuntime
+ case NodeType.MethodContract :
+ return this.VisitMethodContract((MethodContract)node);
+#endif
+ case NodeType.Module:
+ return this.VisitModule((Module)node);
+ case NodeType.ModuleReference:
+ return this.VisitModuleReference((ModuleReference)node);
+#if !MinimalReader
+ case NodeType.NameBinding:
+ return this.VisitNameBinding((NameBinding)node);
+#endif
+ case NodeType.NamedArgument:
+ return this.VisitNamedArgument((NamedArgument)node);
+#if !MinimalReader
+ case NodeType.Namespace:
+ return this.VisitNamespace((Namespace)node);
+#endif
+ case NodeType.Nop:
+#if !MinimalReader
+ case NodeType.SwitchCaseBottom:
+#endif
+ return node;
+#if ExtendedRuntime
+ case NodeType.EnsuresNormal :
+ return this.VisitEnsuresNormal((EnsuresNormal)node);
+ case NodeType.OldExpression :
+ return this.VisitOldExpression((OldExpression)node);
+ case NodeType.RequiresOtherwise :
+ return this.VisitRequiresOtherwise((RequiresOtherwise)node);
+ case NodeType.RequiresPlain :
+ return this.VisitRequiresPlain((RequiresPlain)node);
+#endif
+ case NodeType.OptionalModifier:
+ case NodeType.RequiredModifier:
+ //TODO: type modifers should only be visited via VisitTypeReference
+ return this.VisitTypeModifier((TypeModifier)node);
+ case NodeType.Parameter:
+ return this.VisitParameter((Parameter)node);
+ case NodeType.Pop:
+ return this.VisitExpression((Expression)node);
+#if !MinimalReader
+ case NodeType.PrefixExpression:
+ return this.VisitPrefixExpression((PrefixExpression)node);
+ case NodeType.PostfixExpression:
+ return this.VisitPostfixExpression((PostfixExpression)node);
+#endif
+ case NodeType.Property:
+ return this.VisitProperty((Property)node);
+#if !MinimalReader
+ case NodeType.Quantifier:
+ return this.VisitQuantifier((Quantifier)node);
+ case NodeType.Comprehension:
+ return this.VisitComprehension((Comprehension)node);
+ case NodeType.ComprehensionBinding:
+ return this.VisitComprehensionBinding((ComprehensionBinding)node);
+ case NodeType.QualifiedIdentifer:
+ return this.VisitQualifiedIdentifier((QualifiedIdentifier)node);
+#endif
+ case NodeType.Rethrow:
+ case NodeType.Throw:
+ return this.VisitThrow((Throw)node);
+#if !MinimalReader
+ case NodeType.RefValueExpression:
+ return this.VisitRefValueExpression((RefValueExpression)node);
+ case NodeType.RefTypeExpression:
+ return this.VisitRefTypeExpression((RefTypeExpression)node);
+#endif
+ case NodeType.Return:
+ return this.VisitReturn((Return)node);
+#if !MinimalReader
+ case NodeType.Repeat:
+ return this.VisitRepeat((Repeat)node);
+ case NodeType.ResourceUse:
+ return this.VisitResourceUse((ResourceUse)node);
+#endif
+ case NodeType.SecurityAttribute:
+ return this.VisitSecurityAttribute((SecurityAttribute)node);
+#if !MinimalReader
+ case NodeType.SetterValue:
+ return this.VisitSetterValue((SetterValue)node);
+ case NodeType.StatementSnippet:
+ return this.VisitStatementSnippet((StatementSnippet)node);
+#endif
+ case NodeType.Struct:
+ return this.VisitStruct((Struct)node);
+#if !MinimalReader
+ case NodeType.Switch:
+ return this.VisitSwitch((Switch)node);
+ case NodeType.SwitchCase:
+ return this.VisitSwitchCase((SwitchCase)node);
+#endif
+ case NodeType.SwitchInstruction:
+ return this.VisitSwitchInstruction((SwitchInstruction)node);
+#if !MinimalReader
+ case NodeType.Typeswitch:
+ return this.VisitTypeswitch((Typeswitch)node);
+ case NodeType.TypeswitchCase:
+ return this.VisitTypeswitchCase((TypeswitchCase)node);
+#endif
+ case NodeType.This:
+ return this.VisitThis((This)node);
+#if !MinimalReader
+ case NodeType.Try:
+ return this.VisitTry((Try)node);
+#endif
+#if ExtendedRuntime
+ case NodeType.TypeContract:
+ return this.VisitTypeContract((TypeContract)node);
+
+ case NodeType.TupleType:
+ return this.VisitTupleType((TupleType)node);
+ case NodeType.TypeAlias:
+ return this.VisitTypeAlias((TypeAlias)node);
+ case NodeType.TypeIntersection:
+ return this.VisitTypeIntersection((TypeIntersection)node);
+#endif
+#if !MinimalReader
+ case NodeType.TypeMemberSnippet:
+ return this.VisitTypeMemberSnippet((TypeMemberSnippet)node);
+#endif
+ case NodeType.ClassParameter:
+ case NodeType.TypeParameter:
+ return this.VisitTypeParameter((TypeNode)node);
+#if ExtendedRuntime
+ case NodeType.TypeUnion:
+ return this.VisitTypeUnion((TypeUnion)node);
+#endif
+#if !MinimalReader
+ case NodeType.TypeReference:
+ return this.VisitTypeReference((TypeReference)node);
+ case NodeType.UsedNamespace:
+ return this.VisitUsedNamespace((UsedNamespace)node);
+ case NodeType.VariableDeclaration:
+ return this.VisitVariableDeclaration((VariableDeclaration)node);
+ case NodeType.While:
+ return this.VisitWhile((While)node);
+ case NodeType.Yield:
+ return this.VisitYield((Yield)node);
+
+ case NodeType.Conditional:
+#endif
+ case NodeType.Cpblk:
+ case NodeType.Initblk:
+ return this.VisitTernaryExpression((TernaryExpression)node);
+
+ case NodeType.Add:
+ case NodeType.Add_Ovf:
+ case NodeType.Add_Ovf_Un:
+#if !MinimalReader
+ case NodeType.AddEventHandler:
+#endif
+ case NodeType.And:
+#if !MinimalReader
+ case NodeType.As:
+#endif
+ case NodeType.Box:
+ case NodeType.Castclass:
+ case NodeType.Ceq:
+ case NodeType.Cgt:
+ case NodeType.Cgt_Un:
+ case NodeType.Clt:
+ case NodeType.Clt_Un:
+#if !MinimalReader
+ case NodeType.Comma:
+#endif
+ case NodeType.Div:
+ case NodeType.Div_Un:
+ case NodeType.Eq:
+#if !MinimalReader
+ case NodeType.ExplicitCoercion:
+#endif
+ case NodeType.Ge:
+ case NodeType.Gt:
+#if !MinimalReader
+ case NodeType.Is:
+ case NodeType.Iff:
+ case NodeType.Implies:
+#endif
+ case NodeType.Isinst:
+ case NodeType.Ldvirtftn:
+ case NodeType.Le:
+#if !MinimalReader
+ case NodeType.LogicalAnd:
+ case NodeType.LogicalOr:
+#endif
+ case NodeType.Lt:
+ case NodeType.Mkrefany:
+#if !MinimalReader
+ case NodeType.Maplet:
+#endif
+ case NodeType.Mul:
+ case NodeType.Mul_Ovf:
+ case NodeType.Mul_Ovf_Un:
+ case NodeType.Ne:
+ case NodeType.Or:
+#if !MinimalReader
+ case NodeType.NullCoalesingExpression:
+ case NodeType.Range:
+#endif
+ case NodeType.Refanyval:
+ case NodeType.Rem:
+ case NodeType.Rem_Un:
+#if !MinimalReader
+ case NodeType.RemoveEventHandler:
+#endif
+ case NodeType.Shl:
+ case NodeType.Shr:
+ case NodeType.Shr_Un:
+ case NodeType.Sub:
+ case NodeType.Sub_Ovf:
+ case NodeType.Sub_Ovf_Un:
+ case NodeType.Unbox:
+ case NodeType.UnboxAny:
+ case NodeType.Xor:
+ return this.VisitBinaryExpression((BinaryExpression)node);
+
+ case NodeType.AddressOf:
+#if !MinimalReader
+ case NodeType.OutAddress:
+ case NodeType.RefAddress:
+#endif
+ case NodeType.Ckfinite:
+ case NodeType.Conv_I:
+ case NodeType.Conv_I1:
+ case NodeType.Conv_I2:
+ case NodeType.Conv_I4:
+ case NodeType.Conv_I8:
+ case NodeType.Conv_Ovf_I:
+ case NodeType.Conv_Ovf_I1:
+ case NodeType.Conv_Ovf_I1_Un:
+ case NodeType.Conv_Ovf_I2:
+ case NodeType.Conv_Ovf_I2_Un:
+ case NodeType.Conv_Ovf_I4:
+ case NodeType.Conv_Ovf_I4_Un:
+ case NodeType.Conv_Ovf_I8:
+ case NodeType.Conv_Ovf_I8_Un:
+ case NodeType.Conv_Ovf_I_Un:
+ case NodeType.Conv_Ovf_U:
+ case NodeType.Conv_Ovf_U1:
+ case NodeType.Conv_Ovf_U1_Un:
+ case NodeType.Conv_Ovf_U2:
+ case NodeType.Conv_Ovf_U2_Un:
+ case NodeType.Conv_Ovf_U4:
+ case NodeType.Conv_Ovf_U4_Un:
+ case NodeType.Conv_Ovf_U8:
+ case NodeType.Conv_Ovf_U8_Un:
+ case NodeType.Conv_Ovf_U_Un:
+ case NodeType.Conv_R4:
+ case NodeType.Conv_R8:
+ case NodeType.Conv_R_Un:
+ case NodeType.Conv_U:
+ case NodeType.Conv_U1:
+ case NodeType.Conv_U2:
+ case NodeType.Conv_U4:
+ case NodeType.Conv_U8:
+#if !MinimalReader
+ case NodeType.Decrement:
+ case NodeType.DefaultValue:
+ case NodeType.Increment:
+#endif
+ case NodeType.Ldftn:
+ case NodeType.Ldlen:
+ case NodeType.Ldtoken:
+ case NodeType.Localloc:
+ case NodeType.LogicalNot:
+ case NodeType.Neg:
+ case NodeType.Not:
+#if !MinimalReader
+ case NodeType.Parentheses:
+#endif
+ case NodeType.Refanytype:
+ case NodeType.ReadOnlyAddressOf:
+ case NodeType.Sizeof:
+ case NodeType.SkipCheck:
+#if !MinimalReader
+ case NodeType.Typeof:
+ case NodeType.UnaryPlus:
+#endif
+ return this.VisitUnaryExpression((UnaryExpression)node);
+#if ExtendedRuntime
+ // query node types
+ case NodeType.QueryAggregate:
+ return this.VisitQueryAggregate((QueryAggregate)node);
+ case NodeType.QueryAlias:
+ return this.VisitQueryAlias((QueryAlias)node);
+ case NodeType.QueryAll:
+ case NodeType.QueryAny:
+ return this.VisitQueryQuantifier((QueryQuantifier)node);
+ case NodeType.QueryAxis:
+ return this.VisitQueryAxis((QueryAxis)node);
+ case NodeType.QueryCommit:
+ return this.VisitQueryCommit((QueryCommit)node);
+ case NodeType.QueryContext:
+ return this.VisitQueryContext((QueryContext)node);
+ case NodeType.QueryDelete:
+ return this.VisitQueryDelete((QueryDelete)node);
+ case NodeType.QueryDifference:
+ return this.VisitQueryDifference((QueryDifference)node);
+ case NodeType.QueryDistinct:
+ return this.VisitQueryDistinct((QueryDistinct)node);
+ case NodeType.QueryExists:
+ return this.VisitQueryExists((QueryExists)node);
+ case NodeType.QueryFilter:
+ return this.VisitQueryFilter((QueryFilter)node);
+ case NodeType.QueryGeneratedType:
+ return this.VisitQueryGeneratedType((QueryGeneratedType)node);
+ case NodeType.QueryGroupBy:
+ return this.VisitQueryGroupBy((QueryGroupBy)node);
+ case NodeType.QueryInsert:
+ return this.VisitQueryInsert((QueryInsert)node);
+ case NodeType.QueryIntersection:
+ return this.VisitQueryIntersection((QueryIntersection)node);
+ case NodeType.QueryIterator:
+ return this.VisitQueryIterator((QueryIterator)node);
+ case NodeType.QueryJoin:
+ return this.VisitQueryJoin((QueryJoin)node);
+ case NodeType.QueryLimit:
+ return this.VisitQueryLimit((QueryLimit)node);
+ case NodeType.QueryOrderBy:
+ return this.VisitQueryOrderBy((QueryOrderBy)node);
+ case NodeType.QueryOrderItem:
+ return this.VisitQueryOrderItem((QueryOrderItem)node);
+ case NodeType.QueryPosition:
+ return this.VisitQueryPosition((QueryPosition)node);
+ case NodeType.QueryProject:
+ return this.VisitQueryProject((QueryProject)node);
+ case NodeType.QueryQuantifiedExpression:
+ return this.VisitQueryQuantifiedExpression((QueryQuantifiedExpression)node);
+ case NodeType.QueryRollback:
+ return this.VisitQueryRollback((QueryRollback)node);
+ case NodeType.QuerySelect:
+ return this.VisitQuerySelect((QuerySelect)node);
+ case NodeType.QuerySingleton:
+ return this.VisitQuerySingleton((QuerySingleton)node);
+ case NodeType.QueryTransact:
+ return this.VisitQueryTransact((QueryTransact)node);
+ case NodeType.QueryTypeFilter:
+ return this.VisitQueryTypeFilter((QueryTypeFilter)node);
+ case NodeType.QueryUnion:
+ return this.VisitQueryUnion((QueryUnion)node);
+ case NodeType.QueryUpdate:
+ return this.VisitQueryUpdate((QueryUpdate)node);
+ case NodeType.QueryYielder:
+ return this.VisitQueryYielder((QueryYielder)node);
+#endif
+ default:
+ return this.VisitUnknownNodeType(node);
+ }
+ }
+ public virtual Expression VisitAddressDereference(AddressDereference addr)
+ {
+ if (addr == null) return null;
+ addr.Address = this.VisitExpression(addr.Address);
+ return addr;
+ }
+#if !MinimalReader
+ public virtual AliasDefinition VisitAliasDefinition(AliasDefinition aliasDefinition)
+ {
+ if (aliasDefinition == null) return null;
+ aliasDefinition.AliasedType = this.VisitTypeReference(aliasDefinition.AliasedType);
+ return aliasDefinition;
+ }
+ public virtual AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions)
+ {
+ if (aliasDefinitions == null) return null;
+ for (int i = 0, n = aliasDefinitions.Count; i < n; i++)
+ aliasDefinitions[i] = this.VisitAliasDefinition(aliasDefinitions[i]);
+ return aliasDefinitions;
+ }
+ public virtual Expression VisitAnonymousNestedFunction(AnonymousNestedFunction func)
+ {
+ if (func == null) return null;
+ func.Parameters = this.VisitParameterList(func.Parameters);
+ func.Body = this.VisitBlock(func.Body);
+ return func;
+ }
+ public virtual Expression VisitApplyToAll(ApplyToAll applyToAll)
+ {
+ if (applyToAll == null) return null;
+ applyToAll.Operand1 = this.VisitExpression(applyToAll.Operand1);
+ applyToAll.Operand2 = this.VisitExpression(applyToAll.Operand2);
+ return applyToAll;
+ }
+ public ArrayType VisitArrayType(ArrayType array)
+ {
+ Debug.Assert(false, "An array type exists only at runtime. It should be referred to, but never visited.");
+ return null;
+ }
+#endif
+ public virtual AssemblyNode VisitAssembly(AssemblyNode assembly)
+ {
+ if (assembly == null) return null;
+ this.VisitModule(assembly);
+ assembly.ModuleAttributes = this.VisitAttributeList(assembly.ModuleAttributes);
+ assembly.SecurityAttributes = this.VisitSecurityAttributeList(assembly.SecurityAttributes);
+ return assembly;
+ }
+ public virtual AssemblyReference VisitAssemblyReference(AssemblyReference assemblyReference)
+ {
+ return assemblyReference;
+ }
+#if !MinimalReader
+ public virtual Statement VisitAssertion(Assertion assertion)
+ {
+ if (assertion == null) return null;
+ assertion.Condition = this.VisitExpression(assertion.Condition);
+ return assertion;
+ }
+ public virtual Statement VisitAssumption(Assumption assumption)
+ {
+ if (assumption == null) return null;
+ assumption.Condition = this.VisitExpression(assumption.Condition);
+ return assumption;
+ }
+ public virtual Expression VisitAssignmentExpression(AssignmentExpression assignment)
+ {
+ if (assignment == null) return null;
+ assignment.AssignmentStatement = (Statement)this.Visit(assignment.AssignmentStatement);
+ return assignment;
+ }
+#endif
+ public virtual Statement VisitAssignmentStatement(AssignmentStatement assignment)
+ {
+ if (assignment == null) return null;
+ assignment.Target = this.VisitTargetExpression(assignment.Target);
+ assignment.Source = this.VisitExpression(assignment.Source);
+ return assignment;
+ }
+ public virtual Expression VisitAttributeConstructor(AttributeNode attribute)
+ {
+ if (attribute == null) return null;
+ return this.VisitExpression(attribute.Constructor);
+ }
+ public virtual AttributeNode VisitAttributeNode(AttributeNode attribute)
+ {
+ if (attribute == null) return null;
+ attribute.Constructor = this.VisitAttributeConstructor(attribute);
+ attribute.Expressions = this.VisitExpressionList(attribute.Expressions);
+ return attribute;
+ }
+ public virtual AttributeList VisitAttributeList(AttributeList attributes)
+ {
+ if (attributes == null) return null;
+ for (int i = 0, n = attributes.Count; i < n; i++)
+ attributes[i] = this.VisitAttributeNode(attributes[i]);
+ return attributes;
+ }
+#if !MinimalReader
+ public virtual Expression VisitBase(Base Base)
+ {
+ return Base;
+ }
+#endif
+ public virtual Expression VisitBinaryExpression(BinaryExpression binaryExpression)
+ {
+ if (binaryExpression == null) return null;
+ binaryExpression.Operand1 = this.VisitExpression(binaryExpression.Operand1);
+ binaryExpression.Operand2 = this.VisitExpression(binaryExpression.Operand2);
+ return binaryExpression;
+ }
+ public virtual Block VisitBlock(Block block)
+ {
+ if (block == null) return null;
+ block.Statements = this.VisitStatementList(block.Statements);
+ return block;
+ }
+#if !MinimalReader
+ public virtual Expression VisitBlockExpression(BlockExpression blockExpression)
+ {
+ if (blockExpression == null) return null;
+ blockExpression.Block = this.VisitBlock(blockExpression.Block);
+ return blockExpression;
+ }
+#endif
+ public virtual BlockList VisitBlockList(BlockList blockList)
+ {
+ if (blockList == null) return null;
+ for (int i = 0, n = blockList.Count; i < n; i++)
+ blockList[i] = this.VisitBlock(blockList[i]);
+ return blockList;
+ }
+ public virtual Statement VisitBranch(Branch branch)
+ {
+ if (branch == null) return null;
+ branch.Condition = this.VisitExpression(branch.Condition);
+ return branch;
+ }
+#if !MinimalReader
+ public virtual Statement VisitCatch(Catch Catch)
+ {
+ if (Catch == null) return null;
+ Catch.Variable = this.VisitTargetExpression(Catch.Variable);
+ Catch.Type = this.VisitTypeReference(Catch.Type);
+ Catch.Block = this.VisitBlock(Catch.Block);
+ return Catch;
+ }
+ public virtual CatchList VisitCatchList(CatchList catchers)
+ {
+ if (catchers == null) return null;
+ for (int i = 0, n = catchers.Count; i < n; i++)
+ catchers[i] = (Catch)this.VisitCatch(catchers[i]);
+ return catchers;
+ }
+#endif
+ public virtual Class VisitClass(Class Class)
+ {
+ return (Class)this.VisitTypeNode(Class);
+ }
+#if !MinimalReader
+ public virtual Expression VisitCoerceTuple(CoerceTuple coerceTuple)
+ {
+ if (coerceTuple == null) return null;
+ coerceTuple.OriginalTuple = this.VisitExpression(coerceTuple.OriginalTuple);
+ return this.VisitConstructTuple(coerceTuple);
+ }
+ public virtual CollectionEnumerator VisitCollectionEnumerator(CollectionEnumerator ce)
+ {
+ if (ce == null) return null;
+ ce.Collection = this.VisitExpression(ce.Collection);
+ return ce;
+ }
+ public virtual Compilation VisitCompilation(Compilation compilation)
+ {
+ if (compilation == null) return null;
+ Module module = compilation.TargetModule;
+ if (module != null)
+ module.Attributes = this.VisitAttributeList(module.Attributes);
+ AssemblyNode assem = module as AssemblyNode;
+ if (assem != null)
+ assem.ModuleAttributes = this.VisitAttributeList(assem.ModuleAttributes);
+ compilation.CompilationUnits = this.VisitCompilationUnitList(compilation.CompilationUnits);
+ return compilation;
+ }
+ public virtual CompilationUnit VisitCompilationUnit(CompilationUnit cUnit)
+ {
+ if (cUnit == null) return null;
+ cUnit.Nodes = this.VisitNodeList(cUnit.Nodes);
+ return cUnit;
+ }
+ public virtual NodeList VisitNodeList(NodeList nodes)
+ {
+ if (nodes == null) return null;
+ for (int i = 0, n = nodes.Count; i < n; i++)
+ nodes[i] = this.Visit(nodes[i]);
+ return nodes;
+ }
+ public virtual CompilationUnitList VisitCompilationUnitList(CompilationUnitList compilationUnits)
+ {
+ if (compilationUnits == null) return null;
+ for (int i = 0, n = compilationUnits.Count; i < n; i++)
+ compilationUnits[i] = (CompilationUnit)this.Visit(compilationUnits[i]);
+ return compilationUnits;
+ }
+ public virtual CompilationUnit VisitCompilationUnitSnippet(CompilationUnitSnippet snippet)
+ {
+ return this.VisitCompilationUnit(snippet);
+ }
+ public virtual Node VisitComposition(Composition comp)
+ {
+ if (comp == null) return null;
+ if (comp.GetType() == typeof(Composition))
+ {
+ comp.Expression = (Expression)this.Visit(comp.Expression);
+ return comp;
+ }
+ return this.VisitUnknownNodeType(comp);
+ }
+#endif
+ public virtual Expression VisitConstruct(Construct cons)
+ {
+ if (cons == null) return null;
+ cons.Constructor = this.VisitExpression(cons.Constructor);
+ cons.Operands = this.VisitExpressionList(cons.Operands);
+#if !MinimalReader
+ cons.Owner = this.VisitExpression(cons.Owner);
+#endif
+ return cons;
+ }
+ public virtual Expression VisitConstructArray(ConstructArray consArr)
+ {
+ if (consArr == null) return null;
+ consArr.ElementType = this.VisitTypeReference(consArr.ElementType);
+ consArr.Operands = this.VisitExpressionList(consArr.Operands);
+#if !MinimalReader
+ consArr.Initializers = this.VisitExpressionList(consArr.Initializers);
+ consArr.Owner = this.VisitExpression(consArr.Owner);
+#endif
+ return consArr;
+ }
+#if !MinimalReader
+ public virtual Expression VisitConstructDelegate(ConstructDelegate consDelegate)
+ {
+ if (consDelegate == null) return null;
+ consDelegate.DelegateType = this.VisitTypeReference(consDelegate.DelegateType);
+ consDelegate.TargetObject = this.VisitExpression(consDelegate.TargetObject);
+ return consDelegate;
+ }
+ public virtual Expression VisitConstructFlexArray(ConstructFlexArray consArr)
+ {
+ if (consArr == null) return null;
+ consArr.ElementType = this.VisitTypeReference(consArr.ElementType);
+ consArr.Operands = this.VisitExpressionList(consArr.Operands);
+ consArr.Initializers = this.VisitExpressionList(consArr.Initializers);
+ return consArr;
+ }
+ public virtual Expression VisitConstructIterator(ConstructIterator consIterator)
+ {
+ return consIterator;
+ }
+ public virtual Expression VisitConstructTuple(ConstructTuple consTuple)
+ {
+ if (consTuple == null) return null;
+ consTuple.Fields = this.VisitFieldList(consTuple.Fields);
+ return consTuple;
+ }
+#endif
+#if ExtendedRuntime
+ public virtual TypeNode VisitConstrainedType(ConstrainedType cType){
+ if (cType == null) return null;
+ cType.UnderlyingType = this.VisitTypeReference(cType.UnderlyingType);
+ cType.Constraint = this.VisitExpression(cType.Constraint);
+ return cType;
+ }
+#endif
+#if !MinimalReader
+ public virtual Statement VisitContinue(Continue Continue)
+ {
+ return Continue;
+ }
+ public virtual Expression VisitCurrentClosure(CurrentClosure currentClosure)
+ {
+ return currentClosure;
+ }
+#endif
+ public virtual DelegateNode VisitDelegateNode(DelegateNode delegateNode)
+ {
+ if (delegateNode == null) return null;
+ delegateNode = (DelegateNode)this.VisitTypeNode(delegateNode);
+ if (delegateNode == null) return null;
+ delegateNode.Parameters = this.VisitParameterList(delegateNode.Parameters);
+ delegateNode.ReturnType = this.VisitTypeReference(delegateNode.ReturnType);
+ return delegateNode;
+ }
+#if !MinimalReader
+ public virtual Statement VisitDoWhile(DoWhile doWhile)
+ {
+ if (doWhile == null) return null;
+ doWhile.Invariants = this.VisitLoopInvariantList(doWhile.Invariants);
+ doWhile.Body = this.VisitBlock(doWhile.Body);
+ doWhile.Condition = this.VisitExpression(doWhile.Condition);
+ return doWhile;
+ }
+#endif
+ public virtual Statement VisitEndFilter(EndFilter endFilter)
+ {
+ if (endFilter == null) return null;
+ endFilter.Value = this.VisitExpression(endFilter.Value);
+ return endFilter;
+ }
+ public virtual Statement VisitEndFinally(EndFinally endFinally)
+ {
+ return endFinally;
+ }
+#if ExtendedRuntime
+ public virtual EnsuresList VisitEnsuresList(EnsuresList Ensures) {
+ if (Ensures == null) return null;
+ for (int i = 0, n = Ensures.Count; i < n; i++)
+ Ensures[i] = (Ensures) this.Visit(Ensures[i]);
+ return Ensures;
+ }
+#endif
+ public virtual EnumNode VisitEnumNode(EnumNode enumNode)
+ {
+ return (EnumNode)this.VisitTypeNode(enumNode);
+ }
+ public virtual Event VisitEvent(Event evnt)
+ {
+ if (evnt == null) return null;
+ evnt.Attributes = this.VisitAttributeList(evnt.Attributes);
+ evnt.HandlerType = this.VisitTypeReference(evnt.HandlerType);
+ return evnt;
+ }
+#if ExtendedRuntime
+ public virtual EnsuresExceptional VisitEnsuresExceptional(EnsuresExceptional exceptional) {
+ if (exceptional == null) return null;
+ exceptional.PostCondition = this.VisitExpression(exceptional.PostCondition);
+ exceptional.Type = this.VisitTypeReference(exceptional.Type);
+ exceptional.Variable = this.VisitExpression(exceptional.Variable);
+ return exceptional;
+ }
+#endif
+#if !MinimalReader
+ public virtual Statement VisitExit(Exit exit)
+ {
+ return exit;
+ }
+ public virtual Statement VisitExpose(Expose @expose)
+ {
+ if (@expose == null) return null;
+ @expose.Instance = this.VisitExpression(@expose.Instance);
+ @expose.Body = this.VisitBlock(expose.Body);
+ return expose;
+ }
+#endif
+
+ public virtual Expression VisitExpression(Expression expression)
+ {
+ if (expression == null) return null;
+ switch (expression.NodeType)
+ {
+ case NodeType.Dup:
+ case NodeType.Arglist:
+ return expression;
+ case NodeType.Pop:
+ UnaryExpression uex = expression as UnaryExpression;
+ if (uex != null)
+ {
+ uex.Operand = this.VisitExpression(uex.Operand);
+ return uex;
+ }
+ return expression;
+ default:
+ return (Expression)this.Visit(expression);
+ }
+ }
+ public override ExpressionList VisitExpressionList(ExpressionList expressions)
+ {
+ if (expressions == null) return null;
+ for (int i = 0, n = expressions.Count; i < n; i++)
+ expressions[i] = this.VisitExpression(expressions[i]);
+ return expressions;
+ }
+#if !MinimalReader
+ public virtual Expression VisitExpressionSnippet(ExpressionSnippet snippet)
+ {
+ return snippet;
+ }
+#endif
+ public virtual Statement VisitExpressionStatement(ExpressionStatement statement)
+ {
+ if (statement == null) return null;
+ statement.Expression = this.VisitExpression(statement.Expression);
+ return statement;
+ }
+#if !MinimalReader
+ public virtual Statement VisitFaultHandler(FaultHandler faultHandler)
+ {
+ if (faultHandler == null) return null;
+ faultHandler.Block = this.VisitBlock(faultHandler.Block);
+ return faultHandler;
+ }
+ public virtual FaultHandlerList VisitFaultHandlerList(FaultHandlerList faultHandlers)
+ {
+ if (faultHandlers == null) return null;
+ for (int i = 0, n = faultHandlers.Count; i < n; i++)
+ faultHandlers[i] = (FaultHandler)this.VisitFaultHandler(faultHandlers[i]);
+ return faultHandlers;
+ }
+#endif
+ public virtual Field VisitField(Field field)
+ {
+ if (field == null) return null;
+ field.Attributes = this.VisitAttributeList(field.Attributes);
+ field.Type = this.VisitTypeReference(field.Type);
+#if !MinimalReader
+ field.Initializer = this.VisitExpression(field.Initializer);
+ field.ImplementedInterfaces = this.VisitInterfaceReferenceList(field.ImplementedInterfaces);
+#endif
+ return field;
+ }
+#if !MinimalReader
+ public virtual Block VisitFieldInitializerBlock(FieldInitializerBlock block)
+ {
+ if (block == null) return null;
+ block.Type = this.VisitTypeReference(block.Type);
+ return this.VisitBlock(block);
+ }
+ public virtual FieldList VisitFieldList(FieldList fields)
+ {
+ if (fields == null) return null;
+ for (int i = 0, n = fields.Count; i < n; i++)
+ fields[i] = this.VisitField(fields[i]);
+ return fields;
+ }
+ public virtual Statement VisitFilter(Filter filter)
+ {
+ if (filter == null) return null;
+ filter.Expression = this.VisitExpression(filter.Expression);
+ filter.Block = this.VisitBlock(filter.Block);
+ return filter;
+ }
+ public virtual FilterList VisitFilterList(FilterList filters)
+ {
+ if (filters == null) return null;
+ for (int i = 0, n = filters.Count; i < n; i++)
+ filters[i] = (Filter)this.VisitFilter(filters[i]);
+ return filters;
+ }
+ public virtual Statement VisitFinally(Finally Finally)
+ {
+ if (Finally == null) return null;
+ Finally.Block = this.VisitBlock(Finally.Block);
+ return Finally;
+ }
+ public virtual Statement VisitFixed(Fixed Fixed)
+ {
+ if (Fixed == null) return null;
+ Fixed.Declarators = (Statement)this.Visit(Fixed.Declarators);
+ Fixed.Body = this.VisitBlock(Fixed.Body);
+ return Fixed;
+ }
+ public virtual Statement VisitFor(For For)
+ {
+ if (For == null) return null;
+ For.Initializer = this.VisitStatementList(For.Initializer);
+ For.Invariants = this.VisitLoopInvariantList(For.Invariants);
+ For.Condition = this.VisitExpression(For.Condition);
+ For.Incrementer = this.VisitStatementList(For.Incrementer);
+ For.Body = this.VisitBlock(For.Body);
+ return For;
+ }
+ public virtual Statement VisitForEach(ForEach forEach)
+ {
+ if (forEach == null) return null;
+ forEach.TargetVariableType = this.VisitTypeReference(forEach.TargetVariableType);
+ forEach.TargetVariable = this.VisitTargetExpression(forEach.TargetVariable);
+ forEach.SourceEnumerable = this.VisitExpression(forEach.SourceEnumerable);
+ forEach.InductionVariable = this.VisitTargetExpression(forEach.InductionVariable);
+ forEach.Invariants = this.VisitLoopInvariantList(forEach.Invariants);
+ forEach.Body = this.VisitBlock(forEach.Body);
+ return forEach;
+ }
+ public virtual Statement VisitFunctionDeclaration(FunctionDeclaration functionDeclaration)
+ {
+ if (functionDeclaration == null) return null;
+ functionDeclaration.Parameters = this.VisitParameterList(functionDeclaration.Parameters);
+ functionDeclaration.ReturnType = this.VisitTypeReference(functionDeclaration.ReturnType);
+ functionDeclaration.Body = this.VisitBlock(functionDeclaration.Body);
+ return functionDeclaration;
+ }
+ public virtual Expression VisitTemplateInstance(TemplateInstance templateInstance)
+ {
+ if (templateInstance == null) return null;
+ templateInstance.Expression = this.VisitExpression(templateInstance.Expression);
+ templateInstance.TypeArguments = this.VisitTypeReferenceList(templateInstance.TypeArguments);
+ return templateInstance;
+ }
+ public virtual Expression VisitStackAlloc(StackAlloc alloc)
+ {
+ if (alloc == null) return null;
+ alloc.ElementType = this.VisitTypeReference(alloc.ElementType);
+ alloc.NumberOfElements = this.VisitExpression(alloc.NumberOfElements);
+ return alloc;
+ }
+ public virtual Statement VisitGoto(Goto Goto)
+ {
+ return Goto;
+ }
+ public virtual Statement VisitGotoCase(GotoCase gotoCase)
+ {
+ if (gotoCase == null) return null;
+ gotoCase.CaseLabel = this.VisitExpression(gotoCase.CaseLabel);
+ return gotoCase;
+ }
+#endif
+ public virtual Expression VisitIdentifier(Identifier identifier)
+ {
+ return identifier;
+ }
+#if !MinimalReader
+ public virtual Statement VisitIf(If If)
+ {
+ if (If == null) return null;
+ If.Condition = this.VisitExpression(If.Condition);
+ If.TrueBlock = this.VisitBlock(If.TrueBlock);
+ If.FalseBlock = this.VisitBlock(If.FalseBlock);
+ return If;
+ }
+ public virtual Expression VisitImplicitThis(ImplicitThis implicitThis)
+ {
+ return implicitThis;
+ }
+#endif
+ public virtual Expression VisitIndexer(Indexer indexer)
+ {
+ if (indexer == null) return null;
+ indexer.Object = this.VisitExpression(indexer.Object);
+ indexer.Operands = this.VisitExpressionList(indexer.Operands);
+ return indexer;
+ }
+ public virtual Interface VisitInterface(Interface Interface)
+ {
+ return (Interface)this.VisitTypeNode(Interface);
+ }
+ public virtual Interface VisitInterfaceReference(Interface Interface)
+ {
+ return (Interface)this.VisitTypeReference(Interface);
+ }
+ public virtual InterfaceList VisitInterfaceReferenceList(InterfaceList interfaceReferences)
+ {
+ if (interfaceReferences == null) return null;
+ for (int i = 0, n = interfaceReferences.Count; i < n; i++)
+ interfaceReferences[i] = this.VisitInterfaceReference(interfaceReferences[i]);
+ return interfaceReferences;
+ }
+#if ExtendedRuntime
+ public virtual Invariant VisitInvariant(Invariant @invariant){
+ if (@invariant == null) return null;
+ @invariant.Condition = VisitExpression(@invariant.Condition);
+ return @invariant;
+ }
+ public virtual InvariantList VisitInvariantList(InvariantList invariants){
+ if (invariants == null) return null;
+ for (int i = 0, n = invariants.Count; i < n; i++)
+ invariants[i] = this.VisitInvariant(invariants[i]);
+ return invariants;
+ }
+ public virtual ModelfieldContract VisitModelfieldContract(ModelfieldContract mfC) {
+ if (mfC == null) return null;
+ mfC.Witness = this.VisitExpression(mfC.Witness);
+ for (int i = 0, n = mfC.SatisfiesList.Count; i < n; i++)
+ mfC.SatisfiesList[i] = this.VisitExpression(mfC.SatisfiesList[i]);
+ return mfC;
+ }
+ public virtual ModelfieldContractList VisitModelfieldContractList(ModelfieldContractList mfCs) {
+ if (mfCs == null) return null;
+ for (int i = 0, n = mfCs.Count; i < n; i++)
+ mfCs[i] = this.VisitModelfieldContract(mfCs[i]);
+ return mfCs;
+ }
+#endif
+ public virtual InstanceInitializer VisitInstanceInitializer(InstanceInitializer cons)
+ {
+ return (InstanceInitializer)this.VisitMethod(cons);
+ }
+#if !MinimalReader
+ public virtual Statement VisitLabeledStatement(LabeledStatement lStatement)
+ {
+ if (lStatement == null) return null;
+ lStatement.Statement = (Statement)this.Visit(lStatement.Statement);
+ return lStatement;
+ }
+#endif
+ public virtual Expression VisitLiteral(Literal literal)
+ {
+ return literal;
+ }
+ public virtual Expression VisitLocal(Local local)
+ {
+ if (local == null) return null;
+ local.Type = this.VisitTypeReference(local.Type);
+#if !MinimalReader
+ LocalBinding lb = local as LocalBinding;
+ if (lb != null)
+ {
+ Local loc = this.VisitLocal(lb.BoundLocal) as Local;
+ if (loc != null)
+ lb.BoundLocal = loc;
+ }
+#endif
+ return local;
+ }
+#if !MinimalReader
+ public virtual Statement VisitLocalDeclarationsStatement(LocalDeclarationsStatement localDeclarations)
+ {
+ if (localDeclarations == null) return null;
+ localDeclarations.Type = this.VisitTypeReference(localDeclarations.Type);
+ localDeclarations.Declarations = this.VisitLocalDeclarationList(localDeclarations.Declarations);
+ return localDeclarations;
+ }
+ public virtual LocalDeclarationList VisitLocalDeclarationList(LocalDeclarationList localDeclarations)
+ {
+ if (localDeclarations == null) return null;
+ for (int i = 0, n = localDeclarations.Count; i < n; i++)
+ localDeclarations[i] = this.VisitLocalDeclaration(localDeclarations[i]);
+ return localDeclarations;
+ }
+ public virtual LocalDeclaration VisitLocalDeclaration(LocalDeclaration localDeclaration)
+ {
+ if (localDeclaration == null) return null;
+ localDeclaration.InitialValue = this.VisitExpression(localDeclaration.InitialValue);
+ return localDeclaration;
+ }
+ public virtual Statement VisitLock(Lock Lock)
+ {
+ if (Lock == null) return null;
+ Lock.Guard = this.VisitExpression(Lock.Guard);
+ Lock.Body = this.VisitBlock(Lock.Body);
+ return Lock;
+ }
+ public virtual Expression VisitLRExpression(LRExpression expr)
+ {
+ if (expr == null) return null;
+ expr.Expression = this.VisitExpression(expr.Expression);
+ return expr;
+ }
+#endif
+ public virtual Expression VisitMemberBinding(MemberBinding memberBinding)
+ {
+ if (memberBinding == null) return null;
+ memberBinding.TargetObject = this.VisitExpression(memberBinding.TargetObject);
+ return memberBinding;
+ }
+ public virtual MemberList VisitMemberList(MemberList members)
+ {
+ this.memberListNamesChanged = false;
+ if (members == null) return null;
+ for (int i = 0, n = members.Count; i < n; i++)
+ {
+ Member oldm = members[i];
+ if (oldm != null)
+ {
+ Identifier oldId = oldm.Name;
+ members[i] = (Member)this.Visit(oldm);
+ if (members[i] != null)
+ {
+ if (oldId != null && members[i].Name != null && members[i].Name.UniqueIdKey != oldId.UniqueIdKey)
+ {
+ this.memberListNamesChanged = true;
+ }
+ }
+ }
+ }
+ return members;
+ }
+ public virtual Method VisitMethod(Method method)
+ {
+ if (method == null) return null;
+ method.Attributes = this.VisitAttributeList(method.Attributes);
+ method.ReturnAttributes = this.VisitAttributeList(method.ReturnAttributes);
+ method.SecurityAttributes = this.VisitSecurityAttributeList(method.SecurityAttributes);
+ method.ReturnType = this.VisitTypeReference(method.ReturnType);
+#if !MinimalReader
+ method.ImplementedTypes = this.VisitTypeReferenceList(method.ImplementedTypes);
+#endif
+ method.Parameters = this.VisitParameterList(method.Parameters);
+ if (TargetPlatform.UseGenerics)
+ {
+ method.TemplateArguments = this.VisitTypeReferenceList(method.TemplateArguments);
+ method.TemplateParameters = this.VisitTypeParameterList(method.TemplateParameters);
+ }
+#if ExtendedRuntime
+ method.Contract = this.VisitMethodContract(method.Contract);
+#endif
+ method.Body = this.VisitBlock(method.Body);
+ return method;
+ }
+ public virtual Expression VisitMethodCall(MethodCall call)
+ {
+ if (call == null) return null;
+ call.Callee = this.VisitExpression(call.Callee);
+ call.Operands = this.VisitExpressionList(call.Operands);
+ call.Constraint = this.VisitTypeReference(call.Constraint);
+ return call;
+ }
+#if !MinimalReader
+ public virtual Expression VisitArglistArgumentExpression(ArglistArgumentExpression argexp)
+ {
+ if (argexp == null) return null;
+ argexp.Operands = this.VisitExpressionList(argexp.Operands);
+ return argexp;
+ }
+ public virtual Expression VisitArglistExpression(ArglistExpression argexp)
+ {
+ if (argexp == null) return null;
+ return argexp;
+ }
+#endif
+#if ExtendedRuntime
+ public virtual MethodContract VisitMethodContract(MethodContract contract){
+ if (contract == null) return null;
+ // don't visit contract.DeclaringMethod
+ // don't visit contract.OverriddenMethods
+ contract.Requires = this.VisitRequiresList(contract.Requires);
+ contract.Ensures = this.VisitEnsuresList(contract.Ensures);
+ contract.Modifies = this.VisitExpressionList(contract.Modifies);
+ return contract;
+ }
+#endif
+ public virtual Module VisitModule(Module module)
+ {
+ if (module == null) return null;
+ module.Attributes = this.VisitAttributeList(module.Attributes);
+ module.Types = this.VisitTypeNodeList(module.Types);
+ return module;
+ }
+ public virtual ModuleReference VisitModuleReference(ModuleReference moduleReference)
+ {
+ return moduleReference;
+ }
+#if !MinimalReader
+ public virtual Expression VisitNameBinding(NameBinding nameBinding)
+ {
+ return nameBinding;
+ }
+#endif
+ public virtual Expression VisitNamedArgument(NamedArgument namedArgument)
+ {
+ if (namedArgument == null) return null;
+ namedArgument.Value = this.VisitExpression(namedArgument.Value);
+ return namedArgument;
+ }
+#if !MinimalReader
+ public virtual Namespace VisitNamespace(Namespace nspace)
+ {
+ if (nspace == null) return null;
+ nspace.AliasDefinitions = this.VisitAliasDefinitionList(nspace.AliasDefinitions);
+ nspace.UsedNamespaces = this.VisitUsedNamespaceList(nspace.UsedNamespaces);
+ nspace.Attributes = this.VisitAttributeList(nspace.Attributes);
+ nspace.Types = this.VisitTypeNodeList(nspace.Types);
+ nspace.NestedNamespaces = this.VisitNamespaceList(nspace.NestedNamespaces);
+ return nspace;
+ }
+ public virtual NamespaceList VisitNamespaceList(NamespaceList namespaces)
+ {
+ if (namespaces == null) return null;
+ for (int i = 0, n = namespaces.Count; i < n; i++)
+ namespaces[i] = this.VisitNamespace(namespaces[i]);
+ return namespaces;
+ }
+#endif
+#if ExtendedRuntime
+ public virtual EnsuresNormal VisitEnsuresNormal(EnsuresNormal normal) {
+ if (normal == null) return null;
+ normal.PostCondition = this.VisitExpression(normal.PostCondition);
+ return normal;
+ }
+ public virtual Expression VisitOldExpression(OldExpression oldExpression) {
+ if (oldExpression == null) return null;
+ oldExpression.expression = this.VisitExpression(oldExpression.expression);
+ return oldExpression;
+ }
+ public virtual RequiresOtherwise VisitRequiresOtherwise(RequiresOtherwise otherwise) {
+ if (otherwise == null) return null;
+ otherwise.Condition = this.VisitExpression(otherwise.Condition);
+ otherwise.ThrowException = this.VisitExpression(otherwise.ThrowException);
+ return otherwise;
+ }
+ public virtual RequiresPlain VisitRequiresPlain(RequiresPlain plain) {
+ if (plain == null) return null;
+ plain.Condition = this.VisitExpression(plain.Condition);
+ return plain;
+ }
+#endif
+ public virtual Expression VisitParameter(Parameter parameter)
+ {
+ if (parameter == null) return null;
+ parameter.Attributes = this.VisitAttributeList(parameter.Attributes);
+ parameter.Type = this.VisitTypeReference(parameter.Type);
+ parameter.DefaultValue = this.VisitExpression(parameter.DefaultValue);
+#if !MinimalReader
+ ParameterBinding pb = parameter as ParameterBinding;
+ if (pb != null)
+ {
+ Parameter par = this.VisitParameter(pb.BoundParameter) as Parameter;
+ if (par != null)
+ pb.BoundParameter = par;
+ }
+#endif
+ return parameter;
+ }
+ public virtual ParameterList VisitParameterList(ParameterList parameterList)
+ {
+ if (parameterList == null) return null;
+ for (int i = 0, n = parameterList.Count; i < n; i++)
+ parameterList[i] = (Parameter)this.VisitParameter(parameterList[i]);
+ return parameterList;
+ }
+#if !MinimalReader
+ public virtual Expression VisitPrefixExpression(PrefixExpression pExpr)
+ {
+ if (pExpr == null) return null;
+ pExpr.Expression = this.VisitExpression(pExpr.Expression);
+ return pExpr;
+ }
+ public virtual Expression VisitPostfixExpression(PostfixExpression pExpr)
+ {
+ if (pExpr == null) return null;
+ pExpr.Expression = this.VisitExpression(pExpr.Expression);
+ return pExpr;
+ }
+#endif
+ public virtual Property VisitProperty(Property property)
+ {
+ if (property == null) return null;
+ property.Attributes = this.VisitAttributeList(property.Attributes);
+ property.Parameters = this.VisitParameterList(property.Parameters);
+ property.Type = this.VisitTypeReference(property.Type);
+ return property;
+ }
+#if !MinimalReader
+ public virtual Expression VisitQuantifier(Quantifier quantifier)
+ {
+ if (quantifier == null) return null;
+ quantifier.Comprehension = (Comprehension)this.VisitComprehension(quantifier.Comprehension);
+ return quantifier;
+ }
+ public virtual Expression VisitComprehension(Comprehension comprehension)
+ {
+ if (comprehension == null) return null;
+ comprehension.BindingsAndFilters = this.VisitExpressionList(comprehension.BindingsAndFilters);
+ comprehension.Elements = this.VisitExpressionList(comprehension.Elements);
+ return comprehension;
+ }
+ public virtual ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding)
+ {
+ if (comprehensionBinding == null) return null;
+ comprehensionBinding.TargetVariableType = this.VisitTypeReference(comprehensionBinding.TargetVariableType);
+ comprehensionBinding.TargetVariable = this.VisitTargetExpression(comprehensionBinding.TargetVariable);
+ comprehensionBinding.AsTargetVariableType = this.VisitTypeReference(comprehensionBinding.AsTargetVariableType);
+ comprehensionBinding.SourceEnumerable = this.VisitExpression(comprehensionBinding.SourceEnumerable);
+ return comprehensionBinding;
+ }
+ public virtual Expression VisitQualifiedIdentifier(QualifiedIdentifier qualifiedIdentifier)
+ {
+ if (qualifiedIdentifier == null) return null;
+ qualifiedIdentifier.Qualifier = this.VisitExpression(qualifiedIdentifier.Qualifier);
+ return qualifiedIdentifier;
+ }
+ public virtual Expression VisitRefValueExpression(RefValueExpression refvalexp)
+ {
+ if (refvalexp == null) return null;
+ refvalexp.Operand1 = this.VisitExpression(refvalexp.Operand1);
+ refvalexp.Operand2 = this.VisitExpression(refvalexp.Operand2);
+ return refvalexp;
+ }
+ public virtual Expression VisitRefTypeExpression(RefTypeExpression reftypexp)
+ {
+ if (reftypexp == null) return null;
+ reftypexp.Operand = this.VisitExpression(reftypexp.Operand);
+ return reftypexp;
+ }
+ public virtual Statement VisitRepeat(Repeat repeat)
+ {
+ if (repeat == null) return null;
+ repeat.Body = this.VisitBlock(repeat.Body);
+ repeat.Condition = this.VisitExpression(repeat.Condition);
+ return repeat;
+ }
+#endif
+#if ExtendedRuntime
+ public virtual RequiresList VisitRequiresList(RequiresList Requires) {
+ if (Requires == null) return null;
+ for (int i = 0, n = Requires.Count; i < n; i++)
+ Requires[i] = (Requires) this.Visit(Requires[i]);
+ return Requires;
+ }
+#endif
+ public virtual Statement VisitReturn(Return Return)
+ {
+ if (Return == null) return null;
+ Return.Expression = this.VisitExpression(Return.Expression);
+ return Return;
+ }
+#if !MinimalReader
+ public virtual Statement VisitAcquire(Acquire @acquire)
+ {
+ if (@acquire == null) return null;
+ @acquire.Target = (Statement)this.Visit(@acquire.Target);
+ @acquire.Condition = this.VisitExpression(@acquire.Condition);
+ @acquire.ConditionFunction = this.VisitExpression(@acquire.ConditionFunction);
+ @acquire.Body = this.VisitBlock(@acquire.Body);
+ return @acquire;
+ }
+ public virtual Statement VisitResourceUse(ResourceUse resourceUse)
+ {
+ if (resourceUse == null) return null;
+ resourceUse.ResourceAcquisition = (Statement)this.Visit(resourceUse.ResourceAcquisition);
+ resourceUse.Body = this.VisitBlock(resourceUse.Body);
+ return resourceUse;
+ }
+#endif
+ public virtual SecurityAttribute VisitSecurityAttribute(SecurityAttribute attribute)
+ {
+ return attribute;
+ }
+ public virtual SecurityAttributeList VisitSecurityAttributeList(SecurityAttributeList attributes)
+ {
+ if (attributes == null) return null;
+ for (int i = 0, n = attributes.Count; i < n; i++)
+ attributes[i] = this.VisitSecurityAttribute(attributes[i]);
+ return attributes;
+ }
+#if !MinimalReader
+ public virtual Expression VisitSetterValue(SetterValue value)
+ {
+ return value;
+ }
+#endif
+ public virtual StatementList VisitStatementList(StatementList statements)
+ {
+ if (statements == null) return null;
+ for (int i = 0, n = statements.Count; i < n; i++)
+ statements[i] = (Statement)this.Visit(statements[i]);
+ return statements;
+ }
+#if !MinimalReader
+ public virtual StatementSnippet VisitStatementSnippet(StatementSnippet snippet)
+ {
+ return snippet;
+ }
+#endif
+ public virtual StaticInitializer VisitStaticInitializer(StaticInitializer cons)
+ {
+ return (StaticInitializer)this.VisitMethod(cons);
+ }
+ public virtual Struct VisitStruct(Struct Struct)
+ {
+ return (Struct)this.VisitTypeNode(Struct);
+ }
+#if !MinimalReader
+ public virtual Statement VisitSwitch(Switch Switch)
+ {
+ if (Switch == null) return null;
+ Switch.Expression = this.VisitExpression(Switch.Expression);
+ Switch.Cases = this.VisitSwitchCaseList(Switch.Cases);
+ return Switch;
+ }
+ public virtual SwitchCase VisitSwitchCase(SwitchCase switchCase)
+ {
+ if (switchCase == null) return null;
+ switchCase.Label = this.VisitExpression(switchCase.Label);
+ switchCase.Body = this.VisitBlock(switchCase.Body);
+ return switchCase;
+ }
+ public virtual SwitchCaseList VisitSwitchCaseList(SwitchCaseList switchCases)
+ {
+ if (switchCases == null) return null;
+ for (int i = 0, n = switchCases.Count; i < n; i++)
+ switchCases[i] = this.Visit(switchCases[i]) as SwitchCase;
+ return switchCases;
+ }
+#endif
+ public virtual Statement VisitSwitchInstruction(SwitchInstruction switchInstruction)
+ {
+ if (switchInstruction == null) return null;
+ switchInstruction.Expression = this.VisitExpression(switchInstruction.Expression);
+ return switchInstruction;
+ }
+#if !MinimalReader
+ public virtual Statement VisitTypeswitch(Typeswitch Typeswitch)
+ {
+ if (Typeswitch == null) return null;
+ Typeswitch.Expression = this.VisitExpression(Typeswitch.Expression);
+ Typeswitch.Cases = this.VisitTypeswitchCaseList(Typeswitch.Cases);
+ return Typeswitch;
+ }
+ public virtual TypeswitchCase VisitTypeswitchCase(TypeswitchCase typeswitchCase)
+ {
+ if (typeswitchCase == null) return null;
+ typeswitchCase.LabelType = this.VisitTypeReference(typeswitchCase.LabelType);
+ typeswitchCase.LabelVariable = this.VisitTargetExpression(typeswitchCase.LabelVariable);
+ typeswitchCase.Body = this.VisitBlock(typeswitchCase.Body);
+ return typeswitchCase;
+ }
+ public virtual TypeswitchCaseList VisitTypeswitchCaseList(TypeswitchCaseList typeswitchCases)
+ {
+ if (typeswitchCases == null) return null;
+ for (int i = 0, n = typeswitchCases.Count; i < n; i++)
+ typeswitchCases[i] = this.VisitTypeswitchCase(typeswitchCases[i]);
+ return typeswitchCases;
+ }
+#endif
+ public virtual Expression VisitTargetExpression(Expression expression)
+ {
+ return this.VisitExpression(expression);
+ }
+ public virtual Expression VisitTernaryExpression(TernaryExpression expression)
+ {
+ if (expression == null) return null;
+ expression.Operand1 = this.VisitExpression(expression.Operand1);
+ expression.Operand2 = this.VisitExpression(expression.Operand2);
+ expression.Operand3 = this.VisitExpression(expression.Operand3);
+ return expression;
+ }
+ public virtual Expression VisitThis(This This)
+ {
+ if (This == null) return null;
+ This.Type = this.VisitTypeReference(This.Type);
+#if !MinimalReader
+ ThisBinding tb = This as ThisBinding;
+ if (tb != null)
+ {
+ This boundThis = this.VisitThis(tb.BoundThis) as This;
+ if (boundThis != null)
+ tb.BoundThis = boundThis;
+ }
+#endif
+ return This;
+ }
+ public virtual Statement VisitThrow(Throw Throw)
+ {
+ if (Throw == null) return null;
+ Throw.Expression = this.VisitExpression(Throw.Expression);
+ return Throw;
+ }
+#if !MinimalReader
+ public virtual Statement VisitTry(Try Try)
+ {
+ if (Try == null) return null;
+ Try.TryBlock = this.VisitBlock(Try.TryBlock);
+ Try.Catchers = this.VisitCatchList(Try.Catchers);
+ Try.Filters = this.VisitFilterList(Try.Filters);
+ Try.FaultHandlers = this.VisitFaultHandlerList(Try.FaultHandlers);
+ Try.Finally = (Finally)this.VisitFinally(Try.Finally);
+ return Try;
+ }
+#endif
+#if ExtendedRuntime
+ public virtual TupleType VisitTupleType(TupleType tuple){
+ return (TupleType)this.VisitTypeNode(tuple);
+ }
+ public virtual TypeAlias VisitTypeAlias(TypeAlias tAlias){
+ if (tAlias == null) return null;
+ if (tAlias.AliasedType is ConstrainedType)
+ //The type alias defines the constrained type, rather than just referencing it
+ tAlias.AliasedType = this.VisitConstrainedType((ConstrainedType)tAlias.AliasedType);
+ else
+ tAlias.AliasedType = this.VisitTypeReference(tAlias.AliasedType);
+ return tAlias;
+ }
+ public virtual TypeContract VisitTypeContract(TypeContract contract){
+ if (contract == null) return null;
+ // don't visit contract.DeclaringType
+ // don't visit contract.InheritedContracts
+ contract.Invariants = this.VisitInvariantList(contract.Invariants);
+ contract.ModelfieldContracts = this.VisitModelfieldContractList(contract.ModelfieldContracts);
+ return contract;
+ }
+
+ public virtual TypeIntersection VisitTypeIntersection(TypeIntersection typeIntersection){
+ return (TypeIntersection)this.VisitTypeNode(typeIntersection);
+ }
+#endif
+#if !MinimalReader
+ public virtual TypeMemberSnippet VisitTypeMemberSnippet(TypeMemberSnippet snippet)
+ {
+ return snippet;
+ }
+#endif
+ public virtual TypeModifier VisitTypeModifier(TypeModifier typeModifier)
+ {
+ if (typeModifier == null) return null;
+ typeModifier.Modifier = this.VisitTypeReference(typeModifier.Modifier);
+ typeModifier.ModifiedType = this.VisitTypeReference(typeModifier.ModifiedType);
+ return typeModifier;
+ }
+ public virtual TypeNode VisitTypeNode(TypeNode typeNode)
+ {
+ if (typeNode == null) return null;
+ typeNode.Attributes = this.VisitAttributeList(typeNode.Attributes);
+ typeNode.SecurityAttributes = this.VisitSecurityAttributeList(typeNode.SecurityAttributes);
+ Class c = typeNode as Class;
+ if (c != null) c.BaseClass = (Class)this.VisitTypeReference(c.BaseClass);
+ typeNode.Interfaces = this.VisitInterfaceReferenceList(typeNode.Interfaces);
+ typeNode.TemplateArguments = this.VisitTypeReferenceList(typeNode.TemplateArguments);
+ typeNode.TemplateParameters = this.VisitTypeParameterList(typeNode.TemplateParameters);
+ this.VisitMemberList(typeNode.Members);
+ if (this.memberListNamesChanged) { typeNode.ClearMemberTable(); }
+#if ExtendedRuntime
+ // have to visit this *after* visiting the members since in Normalizer
+ // it creates normalized method bodies for the invariant methods and
+ // those shouldn't be visited again!!
+ // REVIEW!! I don't think the method bodies created in Normalizer are necessarily normalized anymore!!
+ typeNode.Contract = this.VisitTypeContract(typeNode.Contract);
+#endif
+ return typeNode;
+ }
+ public virtual TypeNodeList VisitTypeNodeList(TypeNodeList types)
+ {
+ if (types == null) return null;
+ for (int i = 0; i < types.Count; i++) //Visiting a type may result in a new type being appended to this list
+ types[i] = (TypeNode)this.Visit(types[i]);
+ return types;
+ }
+ public virtual TypeNode VisitTypeParameter(TypeNode typeParameter)
+ {
+ if (typeParameter == null) return null;
+ Class cl = typeParameter as Class;
+ if (cl != null) cl.BaseClass = (Class)this.VisitTypeReference(cl.BaseClass);
+ typeParameter.Attributes = this.VisitAttributeList(typeParameter.Attributes);
+ typeParameter.Interfaces = this.VisitInterfaceReferenceList(typeParameter.Interfaces);
+ return typeParameter;
+ }
+ public virtual TypeNodeList VisitTypeParameterList(TypeNodeList typeParameters)
+ {
+ if (typeParameters == null) return null;
+ for (int i = 0, n = typeParameters.Count; i < n; i++)
+ typeParameters[i] = this.VisitTypeParameter(typeParameters[i]);
+ return typeParameters;
+ }
+ public virtual TypeNode VisitTypeReference(TypeNode type)
+ {
+ return type;
+ }
+#if !MinimalReader
+ public virtual TypeReference VisitTypeReference(TypeReference type)
+ {
+ return type;
+ }
+#endif
+ public virtual TypeNodeList VisitTypeReferenceList(TypeNodeList typeReferences)
+ {
+ if (typeReferences == null) return null;
+ for (int i = 0, n = typeReferences.Count; i < n; i++)
+ typeReferences[i] = this.VisitTypeReference(typeReferences[i]);
+ return typeReferences;
+ }
+#if ExtendedRuntime
+ public virtual TypeUnion VisitTypeUnion(TypeUnion typeUnion){
+ return (TypeUnion)this.VisitTypeNode(typeUnion);
+ }
+#endif
+ public virtual Expression VisitUnaryExpression(UnaryExpression unaryExpression)
+ {
+ if (unaryExpression == null) return null;
+ unaryExpression.Operand = this.VisitExpression(unaryExpression.Operand);
+ return unaryExpression;
+ }
+#if !MinimalReader
+ public virtual Statement VisitVariableDeclaration(VariableDeclaration variableDeclaration)
+ {
+ if (variableDeclaration == null) return null;
+ variableDeclaration.Type = this.VisitTypeReference(variableDeclaration.Type);
+ variableDeclaration.Initializer = this.VisitExpression(variableDeclaration.Initializer);
+ return variableDeclaration;
+ }
+ public virtual UsedNamespace VisitUsedNamespace(UsedNamespace usedNamespace)
+ {
+ return usedNamespace;
+ }
+ public virtual UsedNamespaceList VisitUsedNamespaceList(UsedNamespaceList usedNspaces)
+ {
+ if (usedNspaces == null) return null;
+ for (int i = 0, n = usedNspaces.Count; i < n; i++)
+ usedNspaces[i] = this.VisitUsedNamespace(usedNspaces[i]);
+ return usedNspaces;
+ }
+ public virtual ExpressionList VisitLoopInvariantList(ExpressionList expressions)
+ {
+ if (expressions == null) return null;
+ for (int i = 0, n = expressions.Count; i < n; i++)
+ expressions[i] = this.VisitExpression(expressions[i]);
+ return expressions;
+ }
+ public virtual Statement VisitWhile(While While)
+ {
+ if (While == null) return null;
+ While.Condition = this.VisitExpression(While.Condition);
+ While.Invariants = this.VisitLoopInvariantList(While.Invariants);
+ While.Body = this.VisitBlock(While.Body);
+ return While;
+ }
+ public virtual Statement VisitYield(Yield Yield)
+ {
+ if (Yield == null) return null;
+ Yield.Expression = this.VisitExpression(Yield.Expression);
+ return Yield;
+ }
+#endif
+#if ExtendedRuntime
+ // query nodes
+ public virtual Node VisitQueryAggregate(QueryAggregate qa){
+ if (qa == null) return null;
+ qa.Expression = this.VisitExpression(qa.Expression);
+ return qa;
+ }
+ public virtual Node VisitQueryAlias(QueryAlias alias){
+ if (alias == null) return null;
+ alias.Expression = this.VisitExpression(alias.Expression);
+ return alias;
+ }
+ public virtual Node VisitQueryAxis(QueryAxis axis){
+ if (axis == null) return null;
+ axis.Source = this.VisitExpression( axis.Source );
+ return axis;
+ }
+ public virtual Node VisitQueryCommit(QueryCommit qc){
+ return qc;
+ }
+ public virtual Node VisitQueryContext(QueryContext context){
+ return context;
+ }
+ public virtual Node VisitQueryDelete(QueryDelete delete){
+ if (delete == null) return null;
+ delete.Source = this.VisitExpression(delete.Source);
+ /*delete.Target =*/ this.VisitExpression(delete.Target); //REVIEW: why should this not be updated?
+ return delete;
+ }
+ public virtual Node VisitQueryDifference(QueryDifference diff){
+ if (diff == null) return null;
+ diff.LeftSource = this.VisitExpression(diff.LeftSource);
+ diff.RightSource = this.VisitExpression(diff.RightSource);
+ return diff;
+ }
+ public virtual Node VisitQueryDistinct(QueryDistinct distinct){
+ if (distinct == null) return null;
+ distinct.Source = this.VisitExpression(distinct.Source);
+ return distinct;
+ }
+ public virtual Node VisitQueryExists(QueryExists exists){
+ if (exists == null) return null;
+ exists.Source = this.VisitExpression(exists.Source);
+ return exists;
+ }
+ public virtual Node VisitQueryFilter(QueryFilter filter){
+ if (filter == null) return null;
+ filter.Source = this.VisitExpression(filter.Source);
+ filter.Expression = this.VisitExpression(filter.Expression);
+ return filter;
+ }
+ public virtual Node VisitQueryGroupBy(QueryGroupBy groupby){
+ if (groupby == null) return null;
+ groupby.Source = this.VisitExpression(groupby.Source);
+ groupby.GroupList = this.VisitExpressionList(groupby.GroupList);
+ groupby.Having = this.VisitExpression(groupby.Having);
+ return groupby;
+ }
+ public virtual Statement VisitQueryGeneratedType(QueryGeneratedType qgt){
+ return qgt;
+ }
+ public virtual Node VisitQueryInsert(QueryInsert insert){
+ if (insert == null) return null;
+ insert.Location = this.VisitExpression(insert.Location);
+ insert.HintList = this.VisitExpressionList(insert.HintList);
+ insert.InsertList = this.VisitExpressionList(insert.InsertList);
+ return insert;
+ }
+ public virtual Node VisitQueryIntersection(QueryIntersection intersection){
+ if (intersection == null) return intersection;
+ intersection.LeftSource = this.VisitExpression(intersection.LeftSource);
+ intersection.RightSource = this.VisitExpression(intersection.RightSource);
+ intersection.Type = intersection.LeftSource == null ? null : intersection.LeftSource.Type;
+ return intersection;
+ }
+ public virtual Node VisitQueryIterator(QueryIterator xiterator){
+ if (xiterator == null) return xiterator;
+ xiterator.Expression = this.VisitExpression(xiterator.Expression);
+ xiterator.HintList = this.VisitExpressionList(xiterator.HintList);
+ return xiterator;
+ }
+ public virtual Node VisitQueryJoin(QueryJoin join){
+ if (join == null) return null;
+ join.LeftOperand = this.VisitExpression(join.LeftOperand);
+ join.RightOperand = this.VisitExpression(join.RightOperand);
+ join.JoinExpression = this.VisitExpression(join.JoinExpression);
+ return join;
+ }
+ public virtual Node VisitQueryLimit(QueryLimit limit){
+ if (limit == null) return null;
+ limit.Source = this.VisitExpression(limit.Source);
+ limit.Expression = this.VisitExpression(limit.Expression);
+ return limit;
+ }
+ public virtual Node VisitQueryOrderBy(QueryOrderBy orderby){
+ if (orderby == null) return null;
+ orderby.Source = this.VisitExpression(orderby.Source);
+ orderby.OrderList = this.VisitExpressionList(orderby.OrderList);
+ return orderby;
+ }
+ public virtual Node VisitQueryOrderItem(QueryOrderItem item){
+ if (item == null) return null;
+ item.Expression = this.VisitExpression(item.Expression);
+ return item;
+ }
+ public virtual Node VisitQueryPosition(QueryPosition position){
+ return position;
+ }
+ public virtual Node VisitQueryProject(QueryProject project){
+ if (project == null) return null;
+ project.Source = this.VisitExpression(project.Source);
+ project.ProjectionList = this.VisitExpressionList(project.ProjectionList);
+ return project;
+ }
+ public virtual Node VisitQueryRollback(QueryRollback qr){
+ return qr;
+ }
+ public virtual Node VisitQueryQuantifier(QueryQuantifier qq){
+ if (qq == null) return null;
+ qq.Expression = this.VisitExpression(qq.Expression);
+ return qq;
+ }
+ public virtual Node VisitQueryQuantifiedExpression(QueryQuantifiedExpression qqe){
+ if (qqe == null) return null;
+ qqe.Expression = this.VisitExpression(qqe.Expression);
+ return qqe;
+ }
+ public virtual Node VisitQuerySelect(QuerySelect select){
+ if (select == null) return null;
+ select.Source = this.VisitExpression(select.Source);
+ return select;
+ }
+ public virtual Node VisitQuerySingleton(QuerySingleton singleton){
+ if (singleton == null) return null;
+ singleton.Source = this.VisitExpression(singleton.Source);
+ return singleton;
+ }
+ public virtual Node VisitQueryTransact(QueryTransact qt){
+ if (qt == null) return null;
+ qt.Source = this.VisitExpression(qt.Source);
+ qt.Body = this.VisitBlock(qt.Body);
+ qt.CommitBody = this.VisitBlock(qt.CommitBody);
+ qt.RollbackBody = this.VisitBlock(qt.RollbackBody);
+ return qt;
+ }
+ public virtual Node VisitQueryTypeFilter(QueryTypeFilter filter){
+ if (filter == null) return null;
+ filter.Source = this.VisitExpression(filter.Source);
+ return filter;
+ }
+ public virtual Node VisitQueryUnion(QueryUnion union){
+ if (union == null) return null;
+ union.LeftSource = this.VisitExpression(union.LeftSource);
+ union.RightSource = this.VisitExpression(union.RightSource);
+ return union;
+ }
+ public virtual Node VisitQueryUpdate(QueryUpdate update){
+ if (update == null) return null;
+ update.Source = this.VisitExpression(update.Source);
+ update.UpdateList = this.VisitExpressionList(update.UpdateList);
+ return update;
+ }
+ public virtual Node VisitQueryYielder(QueryYielder yielder){
+ if (yielder == null) return null;
+ yielder.Source = this.VisitExpression(yielder.Source);
+ yielder.Target = this.VisitExpression(yielder.Target);
+ yielder.Body = this.VisitBlock(yielder.Body);
+ return yielder;
+ }
+#endif
+#if !MinimalReader
+ /// <summary>
+ /// Return a type viewer for the current scope.
+ /// [The type viewer acts like the identity function, except for dialects (e.g. Extensible Sing#)
+ /// that allow extensions and differing views of types.]
+ /// null can be returned to represent an identity-function type viewer.
+ /// </summary>
+ public virtual TypeViewer TypeViewer
+ {
+ get
+ {
+ return null;
+ }
+ }
+ /// <summary>
+ /// Return the current scope's view of the argument type, by asking the current scope's type viewer.
+ /// </summary>
+ public virtual TypeNode/*!*/ GetTypeView(TypeNode/*!*/ type)
+ {
+ return TypeViewer.GetTypeView(this.TypeViewer, type);
+ }
+#endif
+ }
+#if !MinimalReader
+ /// <summary>
+ /// Provides methods for invoking a parser to obtain AST nodes corresponding to various types of code snippets.
+ /// </summary>
+ public interface IParser
+ {
+ /// <summary>
+ /// Parses the parser's source document as an entire compilation unit and adds the resulting AST nodes to the
+ /// Nodes list of the given CompilationUnit instance.
+ /// </summary>
+ /// <param name="compilationUnit">The compilation unit whose Nodes list will receive the AST root node(s) that the parser produces.</param>
+ void ParseCompilationUnit(CompilationUnit compilationUnit);
+ Expression ParseExpression();
+ void ParseStatements(StatementList statements);
+ void ParseTypeMembers(TypeNode type);
+ }
+ ///<summary>Provides a way for general purpose code to construct parsers using an standard interface.
+ ///Useful for base classes without complete knowledge of all the different kinds of parsers that might be used in an application.</summary>
+ public interface IParserFactory
+ {
+ IParser CreateParser(string fileName, int lineNumber, DocumentText text, Module symbolTable, ErrorNodeList errorNodes, CompilerParameters options);
+ }
+ public class SnippetParser : StandardVisitor
+ {
+ public IParserFactory/*!*/ DefaultParserFactory;
+ public ErrorNodeList ErrorNodes;
+ public Module SymbolTable;
+ public StatementList CurrentStatementList;
+ public CompilerParameters Options;
+
+ public SnippetParser(IParserFactory/*!*/ defaultParserFactory, Module symbolTable, ErrorNodeList errorNodes, CompilerParameters options)
+ {
+ this.DefaultParserFactory = defaultParserFactory;
+ this.ErrorNodes = errorNodes;
+ this.SymbolTable = symbolTable;
+ this.Options = options;
+ this.CurrentStatementList = new StatementList(0);
+ //^ base();
+ }
+
+ public override Node VisitUnknownNodeType(Node node)
+ {
+ return node; //Do not look for snippets inside unknown node types
+ }
+ public override Block VisitBlock(Block block)
+ {
+ if (block == null) return null;
+ StatementList savedStatementList = this.CurrentStatementList;
+ try
+ {
+ StatementList oldStatements = block.Statements;
+ int n = oldStatements == null ? 0 : oldStatements.Count;
+ StatementList newStatements = this.CurrentStatementList = block.Statements = new StatementList(n);
+ for (int i = 0; i < n; i++)
+ {
+ //^ assert oldStatements != null;
+ newStatements.Add((Statement)this.Visit(oldStatements[i]));
+ }
+ return block;
+ }
+ finally
+ {
+ this.CurrentStatementList = savedStatementList;
+ }
+ }
+ public override CompilationUnit VisitCompilationUnitSnippet(CompilationUnitSnippet snippet)
+ {
+ if (snippet == null) return null;
+ Document doc = snippet.SourceContext.Document;
+ if (doc == null) return null;
+ string fileName = doc.Name;
+ int lineNumber = doc.LineNumber;
+ DocumentText sourceText = doc.Text;
+ IParserFactory pf = snippet.ParserFactory;
+ IParser p;
+ if (pf == null)
+ p = this.DefaultParserFactory.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ else
+ p = pf.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ if (p == null) return null;
+ p.ParseCompilationUnit(snippet);
+ return snippet;
+ }
+ public override Expression VisitExpressionSnippet(ExpressionSnippet snippet)
+ {
+ if (snippet == null) return null;
+ Document doc = snippet.SourceContext.Document;
+ if (doc == null) return null;
+ string fileName = doc.Name;
+ int lineNumber = doc.LineNumber;
+ DocumentText sourceText = doc.Text;
+ IParserFactory pf = snippet.ParserFactory;
+ IParser p;
+ if (pf == null)
+ p = this.DefaultParserFactory.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ else
+ p = pf.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ if (p == null) return null;
+ return p.ParseExpression();
+ }
+ public override StatementSnippet VisitStatementSnippet(StatementSnippet snippet)
+ {
+ if (snippet == null) return null;
+ Document doc = snippet.SourceContext.Document;
+ if (doc == null) return null;
+ string fileName = doc.Name;
+ int lineNumber = doc.LineNumber;
+ DocumentText sourceText = doc.Text;
+ IParserFactory pf = snippet.ParserFactory;
+ IParser p;
+ if (pf == null)
+ p = this.DefaultParserFactory.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ else
+ p = pf.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ if (p == null) return null;
+ p.ParseStatements(this.CurrentStatementList);
+ return null;
+ }
+ public override TypeMemberSnippet VisitTypeMemberSnippet(TypeMemberSnippet snippet)
+ {
+ if (snippet == null) return null;
+ Document doc = snippet.SourceContext.Document;
+ if (doc == null) return null;
+ string fileName = doc.Name;
+ int lineNumber = doc.LineNumber;
+ DocumentText sourceText = doc.Text;
+ IParserFactory pf = snippet.ParserFactory;
+ IParser p;
+ if (pf == null)
+ p = this.DefaultParserFactory.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ else
+ p = pf.CreateParser(fileName, lineNumber, sourceText, this.SymbolTable, this.ErrorNodes, this.Options);
+ if (p == null) return null;
+ p.ParseTypeMembers(snippet.DeclaringType);
+ return null;
+ }
+ }
+#endif
+}