summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/CCI/DoubleVisitor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/CCI/DoubleVisitor.cs')
-rw-r--r--tools/Sandcastle/Source/CCI/DoubleVisitor.cs2617
1 files changed, 2617 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/CCI/DoubleVisitor.cs b/tools/Sandcastle/Source/CCI/DoubleVisitor.cs
new file mode 100644
index 0000000..0e81e51
--- /dev/null
+++ b/tools/Sandcastle/Source/CCI/DoubleVisitor.cs
@@ -0,0 +1,2617 @@
+// 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.
+
+#if !MinimalReader
+using System;
+using System.Collections;
+using System.Diagnostics;
+
+#if CCINamespace
+namespace Microsoft.Cci{
+#else
+namespace System.Compiler
+{
+#endif
+ /// <summary>
+ /// Base for all classes that process two IR trees, possibily transforming one of them.
+ /// </summary>
+ public abstract class DoubleVisitor
+ {
+ /// <summary>
+ /// Switches on node.NodeType to call a visitor method that has been specialized for node.
+ /// </summary>
+ /// <returns> Returns null if node1 is null. Otherwise returns an updated node (possibly a different object).</returns>
+ public abstract Node Visit(Node node1, Node node2);
+
+ /// <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(DoubleVisitor targetVisitor)
+ {
+ }
+ }
+
+ /// <summary>
+ /// Walks an IR, mutuating it into a new form
+ /// </summary>
+ public abstract class StandardDoubleVisitor : DoubleVisitor
+ {
+ public DoubleVisitor callingVisitor;
+
+ protected StandardDoubleVisitor()
+ {
+ }
+ protected StandardDoubleVisitor(DoubleVisitor callingVisitor)
+ {
+ this.callingVisitor = callingVisitor;
+ }
+ public virtual Node VisitUnknownNodeType(Node node1, Node node2)
+ {
+ if (node1 == null) { Debug.Fail(""); return null; }
+ DoubleVisitor visitor = this.GetVisitorFor(node1);
+ if (visitor == null) return node1;
+ 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);
+ node1 = visitor.Visit(node1, node2);
+ visitor.TransferStateTo(this);
+ if (this.callingVisitor != null)
+ //Propagate specialized state (unknown to this visitor) all the way up the chain
+ visitor.TransferStateTo(this.callingVisitor);
+ return node1;
+ }
+ public virtual DoubleVisitor GetVisitorFor(Node/*!*/ node1)
+ {
+ if (node1 == null) { Debug.Fail(""); return null; }
+ return (DoubleVisitor)node1.GetVisitorFor(this, this.GetType().Name);
+ }
+ public override Node Visit(Node node1, Node node2)
+ {
+ if (node1 == null) return null;
+ switch (node1.NodeType)
+ {
+ case NodeType.AddressDereference:
+ return this.VisitAddressDereference((AddressDereference)node1, node2 as AddressDereference);
+ case NodeType.AliasDefinition:
+ return this.VisitAliasDefinition((AliasDefinition)node1, node2 as AliasDefinition);
+ case NodeType.AnonymousNestedFunction:
+ return this.VisitAnonymousNestedFunction((AnonymousNestedFunction)node1, node2 as AnonymousNestedFunction);
+ case NodeType.ApplyToAll:
+ return this.VisitApplyToAll((ApplyToAll)node1, node2 as ApplyToAll);
+ case NodeType.Arglist:
+ return this.VisitExpression((Expression)node1, node2 as Expression);
+ case NodeType.ArrayType:
+ Debug.Assert(false); return null;
+ case NodeType.Assembly:
+ return this.VisitAssembly((AssemblyNode)node1, node2 as AssemblyNode);
+ case NodeType.AssemblyReference:
+ return this.VisitAssemblyReference((AssemblyReference)node1, node2 as AssemblyReference);
+ case NodeType.Assertion:
+ return this.VisitAssertion((Assertion)node1, node2 as Assertion);
+ case NodeType.Assumption:
+ return this.VisitAssumption((Assumption)node1, node2 as Assumption);
+ case NodeType.AssignmentExpression:
+ return this.VisitAssignmentExpression((AssignmentExpression)node1, node2 as AssignmentExpression);
+ case NodeType.AssignmentStatement:
+ return this.VisitAssignmentStatement((AssignmentStatement)node1, node2 as AssignmentStatement);
+ case NodeType.Attribute:
+ return this.VisitAttributeNode((AttributeNode)node1, node2 as AttributeNode);
+ case NodeType.Base:
+ return this.VisitBase((Base)node1, node2 as Base);
+ case NodeType.Block:
+ return this.VisitBlock((Block)node1, node2 as Block);
+ case NodeType.BlockExpression:
+ return this.VisitBlockExpression((BlockExpression)node1, node2 as BlockExpression);
+ case NodeType.Branch:
+ return this.VisitBranch((Branch)node1, node2 as Branch);
+ case NodeType.Compilation:
+ return this.VisitCompilation((Compilation)node1, node2 as Compilation);
+ case NodeType.CompilationUnit:
+ return this.VisitCompilationUnit((CompilationUnit)node1, node2 as CompilationUnit);
+ case NodeType.CompilationUnitSnippet:
+ return this.VisitCompilationUnitSnippet((CompilationUnitSnippet)node1, node2 as CompilationUnitSnippet);
+#if ExtendedRuntime
+ case NodeType.ConstrainedType:
+ return this.VisitConstrainedType((ConstrainedType)node1, node2 as ConstrainedType);
+#endif
+ case NodeType.Continue:
+ return this.VisitContinue((Continue)node1, node2 as Continue);
+ case NodeType.CurrentClosure:
+ return this.VisitCurrentClosure((CurrentClosure)node1, node2 as CurrentClosure);
+ case NodeType.DebugBreak:
+ return node1;
+ case NodeType.Call:
+ case NodeType.Calli:
+ case NodeType.Callvirt:
+ case NodeType.Jmp:
+ case NodeType.MethodCall:
+ return this.VisitMethodCall((MethodCall)node1, node2 as MethodCall);
+ case NodeType.Catch:
+ return this.VisitCatch((Catch)node1, node2 as Catch);
+ case NodeType.Class:
+ return this.VisitClass((Class)node1, node2 as Class);
+ case NodeType.CoerceTuple:
+ return this.VisitCoerceTuple((CoerceTuple)node1, node2 as CoerceTuple);
+ case NodeType.CollectionEnumerator:
+ return this.VisitCollectionEnumerator((CollectionEnumerator)node1, node2 as CollectionEnumerator);
+ case NodeType.Composition:
+ return this.VisitComposition((Composition)node1, node2 as Composition);
+ case NodeType.Construct:
+ return this.VisitConstruct((Construct)node1, node2 as Construct);
+ case NodeType.ConstructArray:
+ return this.VisitConstructArray((ConstructArray)node1, node2 as ConstructArray);
+ case NodeType.ConstructDelegate:
+ return this.VisitConstructDelegate((ConstructDelegate)node1, node2 as ConstructDelegate);
+ case NodeType.ConstructFlexArray:
+ return this.VisitConstructFlexArray((ConstructFlexArray)node1, node2 as ConstructFlexArray);
+ case NodeType.ConstructIterator:
+ return this.VisitConstructIterator((ConstructIterator)node1, node2 as ConstructIterator);
+ case NodeType.ConstructTuple:
+ return this.VisitConstructTuple((ConstructTuple)node1, node2 as ConstructTuple);
+ case NodeType.DelegateNode:
+ return this.VisitDelegateNode((DelegateNode)node1, node2 as DelegateNode);
+ case NodeType.DoWhile:
+ return this.VisitDoWhile((DoWhile)node1, node2 as DoWhile);
+ case NodeType.Dup:
+ return this.VisitExpression((Expression)node1, node2 as Expression);
+ case NodeType.EndFilter:
+ return this.VisitEndFilter((EndFilter)node1, node2 as EndFilter);
+ case NodeType.EndFinally:
+ return this.VisitEndFinally((EndFinally)node1, node2 as EndFinally);
+ case NodeType.EnumNode:
+ return this.VisitEnumNode((EnumNode)node1, node2 as EnumNode);
+ case NodeType.Event:
+ return this.VisitEvent((Event)node1, node2 as Event);
+#if ExtendedRuntime
+ case NodeType.EnsuresExceptional :
+ return this.VisitEnsuresExceptional((EnsuresExceptional)node1, node2 as EnsuresExceptional);
+#endif
+ case NodeType.Exit:
+ return this.VisitExit((Exit)node1, node2 as Exit);
+ case NodeType.Read:
+ case NodeType.Write:
+ return this.VisitExpose((Expose)node1, node2 as Expose);
+ case NodeType.ExpressionSnippet:
+ return this.VisitExpressionSnippet((ExpressionSnippet)node1, node2 as ExpressionSnippet);
+ case NodeType.ExpressionStatement:
+ return this.VisitExpressionStatement((ExpressionStatement)node1, node2 as ExpressionStatement);
+ case NodeType.FaultHandler:
+ return this.VisitFaultHandler((FaultHandler)node1, node2 as FaultHandler);
+ case NodeType.Field:
+ return this.VisitField((Field)node1, node2 as Field);
+ case NodeType.FieldInitializerBlock:
+ return this.VisitFieldInitializerBlock((FieldInitializerBlock)node1, node2 as FieldInitializerBlock);
+ case NodeType.Finally:
+ return this.VisitFinally((Finally)node1, node2 as Finally);
+ case NodeType.Filter:
+ return this.VisitFilter((Filter)node1, node2 as Filter);
+ case NodeType.Fixed:
+ return this.VisitFixed((Fixed)node1, node2 as Fixed);
+ case NodeType.For:
+ return this.VisitFor((For)node1, node2 as For);
+ case NodeType.ForEach:
+ return this.VisitForEach((ForEach)node1, node2 as ForEach);
+ case NodeType.FunctionDeclaration:
+ return this.VisitFunctionDeclaration((FunctionDeclaration)node1, node2 as FunctionDeclaration);
+ case NodeType.Goto:
+ return this.VisitGoto((Goto)node1, node2 as Goto);
+ case NodeType.GotoCase:
+ return this.VisitGotoCase((GotoCase)node1, node2 as GotoCase);
+ case NodeType.Identifier:
+ return this.VisitIdentifier((Identifier)node1, node2 as Identifier);
+ case NodeType.If:
+ return this.VisitIf((If)node1, node2 as If);
+ case NodeType.ImplicitThis:
+ return this.VisitImplicitThis((ImplicitThis)node1, node2 as ImplicitThis);
+ case NodeType.Indexer:
+ return this.VisitIndexer((Indexer)node1, node2 as Indexer);
+ case NodeType.InstanceInitializer:
+ return this.VisitInstanceInitializer((InstanceInitializer)node1, node2 as InstanceInitializer);
+ case NodeType.Interface:
+ return this.VisitInterface((Interface)node1, node2 as Interface);
+#if ExtendedRuntime
+ case NodeType.Invariant :
+ return this.VisitInvariant((Invariant)node1, node2 as Invariant);
+#endif
+ case NodeType.LabeledStatement:
+ return this.VisitLabeledStatement((LabeledStatement)node1, node2 as LabeledStatement);
+ case NodeType.Literal:
+ return this.VisitLiteral((Literal)node1, node2 as Literal);
+ case NodeType.Local:
+ return this.VisitLocal((Local)node1, node2 as Local);
+ case NodeType.LocalDeclaration:
+ return this.VisitLocalDeclaration((LocalDeclaration)node1, node2 as LocalDeclaration);
+ case NodeType.LocalDeclarationsStatement:
+ return this.VisitLocalDeclarationsStatement((LocalDeclarationsStatement)node1, node2 as LocalDeclarationsStatement);
+ case NodeType.Lock:
+ return this.VisitLock((Lock)node1, node2 as Lock);
+ case NodeType.LRExpression:
+ return this.VisitLRExpression((LRExpression)node1, node2 as LRExpression);
+ case NodeType.MemberBinding:
+ return this.VisitMemberBinding((MemberBinding)node1, node2 as MemberBinding);
+ case NodeType.Method:
+ return this.VisitMethod((Method)node1, node2 as Method);
+#if ExtendedRuntime
+ case NodeType.MethodContract :
+ return this.VisitMethodContract((MethodContract)node1, node2 as MethodContract);
+#endif
+ case NodeType.TemplateInstance:
+ return this.VisitTemplateInstance((TemplateInstance)node1, node2 as TemplateInstance);
+ case NodeType.StackAlloc:
+ return this.VisitStackAlloc((StackAlloc)node1, node2 as StackAlloc);
+ case NodeType.Module:
+ return this.VisitModule((Module)node1, node2 as Module);
+ case NodeType.ModuleReference:
+ return this.VisitModuleReference((ModuleReference)node1, node2 as ModuleReference);
+ case NodeType.NameBinding:
+ return this.VisitNameBinding((NameBinding)node1, node2 as NameBinding);
+ case NodeType.NamedArgument:
+ return this.VisitNamedArgument((NamedArgument)node1, node2 as NamedArgument);
+ case NodeType.Namespace:
+ return this.VisitNamespace((Namespace)node1, node2 as Namespace);
+ case NodeType.Nop:
+ return node1;
+#if ExtendedRuntime
+ case NodeType.EnsuresNormal :
+ return this.VisitEnsuresNormal((EnsuresNormal)node1, node2 as EnsuresNormal);
+ case NodeType.OldExpression :
+ return this.VisitOldExpression((OldExpression)node1, node2 as OldExpression);
+ case NodeType.RequiresOtherwise :
+ return this.VisitRequiresOtherwise((RequiresOtherwise)node1, node2 as RequiresOtherwise);
+ case NodeType.RequiresPlain :
+ return this.VisitRequiresPlain((RequiresPlain)node1, node2 as RequiresPlain);
+#endif
+ case NodeType.OptionalModifier:
+ case NodeType.RequiredModifier:
+ return this.VisitTypeModifier((TypeModifier)node1, node2 as TypeModifier);
+ case NodeType.Parameter:
+ return this.VisitParameter((Parameter)node1, node2 as Parameter);
+ case NodeType.Pop:
+ return this.VisitExpression((Expression)node1, node2 as Expression);
+ case NodeType.PrefixExpression:
+ return this.VisitPrefixExpression((PrefixExpression)node1, node2 as PrefixExpression);
+ case NodeType.PostfixExpression:
+ return this.VisitPostfixExpression((PostfixExpression)node1, node2 as PostfixExpression);
+ case NodeType.Property:
+ return this.VisitProperty((Property)node1, node2 as Property);
+ case NodeType.Quantifier:
+ return this.VisitQuantifier((Quantifier)node1, node2 as Quantifier);
+ case NodeType.Comprehension:
+ return this.VisitComprehension((Comprehension)node1, node2 as Comprehension);
+ case NodeType.ComprehensionBinding:
+ return this.VisitComprehensionBinding((ComprehensionBinding)node1, node2 as ComprehensionBinding);
+ case NodeType.QualifiedIdentifer:
+ return this.VisitQualifiedIdentifier((QualifiedIdentifier)node1, node2 as QualifiedIdentifier);
+ case NodeType.Rethrow:
+ case NodeType.Throw:
+ return this.VisitThrow((Throw)node1, node2 as Throw);
+ case NodeType.Return:
+ return this.VisitReturn((Return)node1, node2 as Return);
+ case NodeType.ResourceUse:
+ return this.VisitResourceUse((ResourceUse)node1, node2 as ResourceUse);
+ case NodeType.Repeat:
+ return this.VisitRepeat((Repeat)node1, node2 as Repeat);
+ case NodeType.SecurityAttribute:
+ return this.VisitSecurityAttribute((SecurityAttribute)node1, node2 as SecurityAttribute);
+ case NodeType.SetterValue:
+ return this.VisitSetterValue((SetterValue)node1, node2 as SetterValue);
+ case NodeType.StaticInitializer:
+ return this.VisitStaticInitializer((StaticInitializer)node1, node2 as StaticInitializer);
+ case NodeType.StatementSnippet:
+ return this.VisitStatementSnippet((StatementSnippet)node1, node2 as StatementSnippet);
+ case NodeType.Struct:
+ return this.VisitStruct((Struct)node1, node2 as Struct);
+ case NodeType.Switch:
+ return this.VisitSwitch((Switch)node1, node2 as Switch);
+ case NodeType.SwitchCase:
+ return this.VisitSwitchCase((SwitchCase)node1, node2 as SwitchCase);
+ case NodeType.SwitchInstruction:
+ return this.VisitSwitchInstruction((SwitchInstruction)node1, node2 as SwitchInstruction);
+ case NodeType.Typeswitch:
+ return this.VisitTypeswitch((Typeswitch)node1, node2 as Typeswitch);
+ case NodeType.TypeswitchCase:
+ return this.VisitTypeswitchCase((TypeswitchCase)node1, node2 as TypeswitchCase);
+ case NodeType.This:
+ return this.VisitThis((This)node1, node2 as This);
+ case NodeType.Try:
+ return this.VisitTry((Try)node1, node2 as Try);
+#if ExtendedRuntime
+ case NodeType.TupleType:
+ return this.VisitTupleType((TupleType)node1, node2 as TupleType);
+ case NodeType.TypeAlias:
+ return this.VisitTypeAlias((TypeAlias)node1, node2 as TypeAlias);
+ case NodeType.TypeIntersection:
+ return this.VisitTypeIntersection((TypeIntersection)node1, node2 as TypeIntersection);
+ case NodeType.TypeContract :
+ return this.VisitTypeContract((TypeContract)node1, node2 as TypeContract);
+#endif
+ case NodeType.TypeMemberSnippet:
+ return this.VisitTypeMemberSnippet((TypeMemberSnippet)node1, node2 as TypeMemberSnippet);
+ case NodeType.ClassParameter:
+ case NodeType.TypeParameter:
+ return this.VisitTypeParameter((TypeNode)node1, node2 as TypeNode);
+#if ExtendedRuntime
+ case NodeType.TypeUnion:
+ return this.VisitTypeUnion((TypeUnion)node1, node2 as TypeUnion);
+#endif
+ case NodeType.TypeReference:
+ return this.VisitTypeReference((TypeReference)node1, node2 as TypeReference);
+ case NodeType.UsedNamespace:
+ return this.VisitUsedNamespace((UsedNamespace)node1, node2 as UsedNamespace);
+ case NodeType.VariableDeclaration:
+ return this.VisitVariableDeclaration((VariableDeclaration)node1, node2 as VariableDeclaration);
+ case NodeType.While:
+ return this.VisitWhile((While)node1, node2 as While);
+ case NodeType.Yield:
+ return this.VisitYield((Yield)node1, node2 as Yield);
+
+ case NodeType.Conditional:
+ case NodeType.Cpblk:
+ case NodeType.Initblk:
+ return this.VisitTernaryExpression((TernaryExpression)node1, node2 as TernaryExpression);
+
+ case NodeType.Add:
+ case NodeType.Add_Ovf:
+ case NodeType.Add_Ovf_Un:
+ case NodeType.AddEventHandler:
+ case NodeType.And:
+ case NodeType.As:
+ case NodeType.Box:
+ case NodeType.Castclass:
+ case NodeType.Ceq:
+ case NodeType.Cgt:
+ case NodeType.Cgt_Un:
+ case NodeType.Clt:
+ case NodeType.Clt_Un:
+ case NodeType.Comma:
+ case NodeType.Div:
+ case NodeType.Div_Un:
+ case NodeType.Eq:
+ case NodeType.ExplicitCoercion:
+ case NodeType.Ge:
+ case NodeType.Gt:
+ case NodeType.Is:
+ case NodeType.Iff:
+ case NodeType.Implies:
+ case NodeType.Isinst:
+ case NodeType.Ldvirtftn:
+ case NodeType.Le:
+ case NodeType.LogicalAnd:
+ case NodeType.LogicalOr:
+ case NodeType.Lt:
+ case NodeType.Mkrefany:
+ case NodeType.Maplet:
+ case NodeType.Mul:
+ case NodeType.Mul_Ovf:
+ case NodeType.Mul_Ovf_Un:
+ case NodeType.Ne:
+ case NodeType.Or:
+ case NodeType.Range:
+ case NodeType.Refanyval:
+ case NodeType.Rem:
+ case NodeType.Rem_Un:
+ case NodeType.RemoveEventHandler:
+ 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)node1, node2 as BinaryExpression);
+
+ case NodeType.AddressOf:
+ case NodeType.OutAddress:
+ case NodeType.RefAddress:
+ 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:
+ case NodeType.Decrement:
+ case NodeType.DefaultValue:
+ case NodeType.Increment:
+ case NodeType.Ldftn:
+ case NodeType.Ldlen:
+ case NodeType.Ldtoken:
+ case NodeType.Localloc:
+ case NodeType.LogicalNot:
+ case NodeType.Neg:
+ case NodeType.Not:
+ case NodeType.Parentheses:
+ case NodeType.Refanytype:
+ case NodeType.Sizeof:
+ case NodeType.SkipCheck:
+ case NodeType.Typeof:
+ case NodeType.UnaryPlus:
+ return this.VisitUnaryExpression((UnaryExpression)node1, node2 as UnaryExpression);
+#if ExtendedRuntime
+ // query node1 types
+ case NodeType.QueryAggregate:
+ return this.VisitQueryAggregate((QueryAggregate)node1, node2 as QueryAggregate);
+ case NodeType.QueryAlias:
+ return this.VisitQueryAlias((QueryAlias)node1, node2 as QueryAlias);
+ case NodeType.QueryAll:
+ case NodeType.QueryAny:
+ return this.VisitQueryQuantifier((QueryQuantifier)node1, node2 as QueryQuantifier);
+ case NodeType.QueryAxis:
+ return this.VisitQueryAxis((QueryAxis)node1, node2 as QueryAxis);
+ case NodeType.QueryCommit:
+ return this.VisitQueryCommit((QueryCommit)node1, node2 as QueryCommit);
+ case NodeType.QueryContext:
+ return this.VisitQueryContext((QueryContext)node1, node2 as QueryContext);
+ case NodeType.QueryDelete:
+ return this.VisitQueryDelete((QueryDelete)node1, node2 as QueryDelete);
+ case NodeType.QueryDifference:
+ return this.VisitQueryDifference((QueryDifference)node1, node2 as QueryDifference);
+ case NodeType.QueryDistinct:
+ return this.VisitQueryDistinct((QueryDistinct)node1, node2 as QueryDistinct);
+ case NodeType.QueryExists:
+ return this.VisitQueryExists((QueryExists)node1, node2 as QueryExists);
+ case NodeType.QueryFilter:
+ return this.VisitQueryFilter((QueryFilter)node1, node2 as QueryFilter);
+ case NodeType.QueryGeneratedType:
+ return this.VisitQueryGeneratedType((QueryGeneratedType)node1, node2 as QueryGeneratedType);
+ case NodeType.QueryGroupBy:
+ return this.VisitQueryGroupBy((QueryGroupBy)node1, node2 as QueryGroupBy);
+ case NodeType.QueryInsert:
+ return this.VisitQueryInsert((QueryInsert)node1, node2 as QueryInsert);
+ case NodeType.QueryIntersection:
+ return this.VisitQueryIntersection((QueryIntersection)node1, node2 as QueryIntersection);
+ case NodeType.QueryIterator:
+ return this.VisitQueryIterator((QueryIterator)node1, node2 as QueryIterator);
+ case NodeType.QueryJoin:
+ return this.VisitQueryJoin((QueryJoin)node1, node2 as QueryJoin);
+ case NodeType.QueryLimit:
+ return this.VisitQueryLimit((QueryLimit)node1, node2 as QueryLimit);
+ case NodeType.QueryOrderBy:
+ return this.VisitQueryOrderBy((QueryOrderBy)node1, node2 as QueryOrderBy);
+ case NodeType.QueryOrderItem:
+ return this.VisitQueryOrderItem((QueryOrderItem)node1, node2 as QueryOrderItem);
+ case NodeType.QueryPosition:
+ return this.VisitQueryPosition((QueryPosition)node1, node2 as QueryPosition);
+ case NodeType.QueryProject:
+ return this.VisitQueryProject((QueryProject)node1, node2 as QueryProject);
+ case NodeType.QueryQuantifiedExpression:
+ return this.VisitQueryQuantifiedExpression((QueryQuantifiedExpression)node1, node2 as QueryQuantifiedExpression);
+ case NodeType.QueryRollback:
+ return this.VisitQueryRollback((QueryRollback)node1, node2 as QueryRollback);
+ case NodeType.QuerySelect:
+ return this.VisitQuerySelect((QuerySelect)node1, node2 as QuerySelect);
+ case NodeType.QuerySingleton:
+ return this.VisitQuerySingleton((QuerySingleton)node1, node2 as QuerySingleton);
+ case NodeType.QueryTransact:
+ return this.VisitQueryTransact((QueryTransact)node1, node2 as QueryTransact);
+ case NodeType.QueryTypeFilter:
+ return this.VisitQueryTypeFilter((QueryTypeFilter)node1, node2 as QueryTypeFilter);
+ case NodeType.QueryUnion:
+ return this.VisitQueryUnion((QueryUnion)node1, node2 as QueryUnion);
+ case NodeType.QueryUpdate:
+ return this.VisitQueryUpdate((QueryUpdate)node1, node2 as QueryUpdate);
+ case NodeType.QueryYielder:
+ return this.VisitQueryYielder((QueryYielder)node1, node2 as QueryYielder);
+#endif
+ default:
+ return this.VisitUnknownNodeType(node1, node2);
+ }
+ }
+ public virtual Expression VisitAddressDereference(AddressDereference addr1, AddressDereference addr2)
+ {
+ if (addr1 == null) return null;
+ if (addr2 == null)
+ addr1.Address = this.VisitExpression(addr1.Address, null);
+ else
+ addr1.Address = this.VisitExpression(addr1.Address, addr2.Address);
+ return addr1;
+ }
+ public virtual AliasDefinition VisitAliasDefinition(AliasDefinition aliasDefinition1, AliasDefinition aliasDefinition2)
+ {
+ if (aliasDefinition1 == null) return null;
+ if (aliasDefinition2 == null)
+ aliasDefinition1.AliasedType = this.VisitTypeReference(aliasDefinition1.AliasedType, null);
+ else
+ aliasDefinition1.AliasedType = this.VisitTypeReference(aliasDefinition1.AliasedType, aliasDefinition2.AliasedType);
+ return aliasDefinition1;
+ }
+ public virtual AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions1, AliasDefinitionList aliasDefinitions2)
+ {
+ if (aliasDefinitions1 == null) return null;
+ for (int i = 0, n = aliasDefinitions1.Count, m = aliasDefinitions2 == null ? 0 : aliasDefinitions2.Count; i < n; i++)
+ {
+ //^ assert aliasDefinitions2 != null;
+ if (i >= m)
+ aliasDefinitions1[i] = this.VisitAliasDefinition(aliasDefinitions1[i], null);
+ else
+ aliasDefinitions1[i] = this.VisitAliasDefinition(aliasDefinitions1[i], aliasDefinitions2[i]);
+ }
+ return aliasDefinitions1;
+ }
+ public virtual Expression VisitAnonymousNestedFunction(AnonymousNestedFunction func1, AnonymousNestedFunction func2)
+ {
+ if (func1 == null) return null;
+ if (func2 == null)
+ {
+ func1.Parameters = this.VisitParameterList(func1.Parameters, null);
+ func1.Body = this.VisitBlock(func1.Body, null);
+ }
+ else
+ {
+ func1.Parameters = this.VisitParameterList(func1.Parameters, func2.Parameters);
+ func1.Body = this.VisitBlock(func1.Body, func2.Body);
+ }
+ return func1;
+ }
+ public virtual Expression VisitApplyToAll(ApplyToAll applyToAll1, ApplyToAll applyToAll2)
+ {
+ if (applyToAll1 == null) return null;
+ if (applyToAll2 == null)
+ {
+ applyToAll1.Operand1 = this.VisitExpression(applyToAll1.Operand1, null);
+ applyToAll1.Operand2 = this.VisitExpression(applyToAll1.Operand2, null);
+ }
+ else
+ {
+ applyToAll1.Operand1 = this.VisitExpression(applyToAll1.Operand1, applyToAll2.Operand1);
+ applyToAll1.Operand2 = this.VisitExpression(applyToAll1.Operand2, applyToAll2.Operand2);
+ }
+ return applyToAll1;
+ }
+ public ArrayType VisitArrayType(ArrayType array1, ArrayType array2)
+ {
+ Debug.Assert(false, "An array type exists only at runtime. It should be referred to, but never visited.");
+ return null;
+ }
+ public virtual AssemblyNode VisitAssembly(AssemblyNode assembly1, AssemblyNode assembly2)
+ {
+ if (assembly1 == null) return null;
+ this.VisitModule(assembly1, assembly2);
+ if (assembly2 == null)
+ {
+ assembly1.ModuleAttributes = this.VisitAttributeList(assembly1.ModuleAttributes, null);
+ assembly1.SecurityAttributes = this.VisitSecurityAttributeList(assembly1.SecurityAttributes, null);
+ }
+ else
+ {
+ assembly1.ModuleAttributes = this.VisitAttributeList(assembly1.ModuleAttributes, assembly2.ModuleAttributes);
+ assembly1.SecurityAttributes = this.VisitSecurityAttributeList(assembly1.SecurityAttributes, assembly2.SecurityAttributes);
+ }
+ return assembly1;
+ }
+ public virtual AssemblyReference VisitAssemblyReference(AssemblyReference assemblyReference1, AssemblyReference assemblyReference2)
+ {
+ return assemblyReference1;
+ }
+ public virtual Statement VisitAssertion(Assertion assertion1, Assertion assertion2)
+ {
+ if (assertion1 == null) return null;
+ if (assertion2 == null)
+ assertion1.Condition = this.VisitExpression(assertion1.Condition, null);
+ else
+ assertion1.Condition = this.VisitExpression(assertion1.Condition, assertion2.Condition);
+ return assertion1;
+ }
+ public virtual Statement VisitAssumption(Assumption Assumption1, Assumption Assumption2)
+ {
+ if (Assumption1 == null) return null;
+ if (Assumption2 == null)
+ Assumption1.Condition = this.VisitExpression(Assumption1.Condition, null);
+ else
+ Assumption1.Condition = this.VisitExpression(Assumption1.Condition, Assumption2.Condition);
+ return Assumption1;
+ }
+ public virtual Expression VisitAssignmentExpression(AssignmentExpression assignment1, AssignmentExpression assignment2)
+ {
+ if (assignment1 == null) return null;
+ if (assignment2 == null)
+ assignment1.AssignmentStatement = (Statement)this.Visit(assignment1.AssignmentStatement, null);
+ else
+ assignment1.AssignmentStatement = (Statement)this.Visit(assignment1.AssignmentStatement, assignment2.AssignmentStatement);
+ return assignment1;
+ }
+ public virtual Statement VisitAssignmentStatement(AssignmentStatement assignment1, AssignmentStatement assignment2)
+ {
+ if (assignment1 == null) return null;
+ if (assignment2 == null)
+ {
+ assignment1.Target = this.VisitTargetExpression(assignment1.Target, null);
+ assignment1.Source = this.VisitExpression(assignment1.Source, null);
+ }
+ else
+ {
+ assignment1.Target = this.VisitTargetExpression(assignment1.Target, assignment2.Target);
+ assignment1.Source = this.VisitExpression(assignment1.Source, assignment2.Source);
+ }
+ return assignment1;
+ }
+ public virtual Expression VisitAttributeConstructor(AttributeNode attribute1, AttributeNode attribute2)
+ {
+ if (attribute1 == null) return null;
+ if (attribute2 == null)
+ return this.VisitExpression(attribute1.Constructor, null);
+ else
+ return this.VisitExpression(attribute1.Constructor, attribute2.Constructor);
+ }
+ public virtual AttributeNode VisitAttributeNode(AttributeNode attribute1, AttributeNode attribute2)
+ {
+ if (attribute1 == null) return null;
+ if (attribute2 == null)
+ {
+ attribute1.Constructor = this.VisitAttributeConstructor(attribute1, null);
+ attribute1.Expressions = this.VisitExpressionList(attribute1.Expressions, null);
+ }
+ else
+ {
+ attribute1.Constructor = this.VisitAttributeConstructor(attribute1, attribute2);
+ attribute1.Expressions = this.VisitExpressionList(attribute1.Expressions, attribute2.Expressions);
+ }
+ return attribute1;
+ }
+ public virtual AttributeList VisitAttributeList(AttributeList attributes1, AttributeList attributes2)
+ {
+ if (attributes1 == null) return null;
+ for (int i = 0, n = attributes1.Count, m = attributes2 == null ? 0 : attributes2.Count; i < n; i++)
+ {
+ //^ assert attributes2 != null;
+ if (i >= m)
+ attributes1[i] = this.VisitAttributeNode(attributes1[i], null);
+ else
+ attributes1[i] = this.VisitAttributeNode(attributes1[i], attributes2[i]);
+ }
+ return attributes1;
+ }
+ public virtual Expression VisitBase(Base Base1, Base Base2)
+ {
+ return Base1;
+ }
+ public virtual Expression VisitBinaryExpression(BinaryExpression binaryExpression1, BinaryExpression binaryExpression2)
+ {
+ if (binaryExpression1 == null) return null;
+ if (binaryExpression2 == null)
+ {
+ binaryExpression1.Operand1 = this.VisitExpression(binaryExpression1.Operand1, null);
+ binaryExpression1.Operand2 = this.VisitExpression(binaryExpression1.Operand2, null);
+ }
+ else
+ {
+ binaryExpression1.Operand1 = this.VisitExpression(binaryExpression1.Operand1, binaryExpression2.Operand1);
+ binaryExpression1.Operand2 = this.VisitExpression(binaryExpression1.Operand2, binaryExpression2.Operand2);
+ }
+ return binaryExpression1;
+ }
+ public virtual Block VisitBlock(Block block1, Block block2)
+ {
+ if (block1 == null) return null;
+ if (block2 == null)
+ block1.Statements = this.VisitStatementList(block1.Statements, null);
+ else
+ block1.Statements = this.VisitStatementList(block1.Statements, block2.Statements);
+ return block1;
+ }
+ public virtual Expression VisitBlockExpression(BlockExpression blockExpression1, BlockExpression blockExpression2)
+ {
+ if (blockExpression1 == null) return null;
+ if (blockExpression2 == null)
+ blockExpression1.Block = this.VisitBlock(blockExpression1.Block, null);
+ else
+ blockExpression1.Block = this.VisitBlock(blockExpression1.Block, blockExpression2.Block);
+ return blockExpression1;
+ }
+ public virtual BlockList VisitBlockList(BlockList blockList1, BlockList blockList2)
+ {
+ if (blockList1 == null) return null;
+ for (int i = 0, n = blockList1.Count, m = blockList2 == null ? 0 : blockList2.Count; i < n; i++)
+ {
+ //^ assert blockList2 != null;
+ if (i >= m)
+ blockList1[i] = this.VisitBlock(blockList1[i], null);
+ else
+ blockList1[i] = this.VisitBlock(blockList1[i], blockList2[i]);
+ }
+ return blockList1;
+ }
+ public virtual Statement VisitBranch(Branch branch1, Branch branch2)
+ {
+ if (branch1 == null) return null;
+ if (branch2 == null)
+ branch1.Condition = this.VisitExpression(branch1.Condition, null);
+ else
+ branch1.Condition = this.VisitExpression(branch1.Condition, branch2.Condition);
+ return branch1;
+ }
+ public virtual Statement VisitCatch(Catch Catch1, Catch Catch2)
+ {
+ if (Catch1 == null) return null;
+ if (Catch2 == null)
+ {
+ Catch1.Variable = this.VisitTargetExpression(Catch1.Variable, null);
+ Catch1.Type = this.VisitTypeReference(Catch1.Type, null);
+ Catch1.Block = this.VisitBlock(Catch1.Block, null);
+ }
+ else
+ {
+ Catch1.Variable = this.VisitTargetExpression(Catch1.Variable, Catch2.Variable);
+ Catch1.Type = this.VisitTypeReference(Catch1.Type, Catch2.Type);
+ Catch1.Block = this.VisitBlock(Catch1.Block, Catch2.Block);
+ }
+ return Catch1;
+ }
+ public virtual CatchList VisitCatchList(CatchList catchers1, CatchList catchers2)
+ {
+ if (catchers1 == null) return null;
+ for (int i = 0, n = catchers1.Count, m = catchers2 == null ? 0 : catchers2.Count; i < n; i++)
+ {
+ //^ assert catchers2 != null;
+ if (i >= m)
+ catchers1[i] = (Catch)this.VisitCatch(catchers1[i], null);
+ else
+ catchers1[i] = (Catch)this.VisitCatch(catchers1[i], catchers2[i]);
+ }
+ return catchers1;
+ }
+ public virtual Class VisitClass(Class Class1, Class Class2)
+ {
+ return (Class)this.VisitTypeNode(Class1, Class2);
+ }
+ public virtual Expression VisitCoerceTuple(CoerceTuple coerceTuple1, CoerceTuple coerceTuple2)
+ {
+ if (coerceTuple1 == null) return null;
+ if (coerceTuple2 == null)
+ coerceTuple1.OriginalTuple = this.VisitExpression(coerceTuple1.OriginalTuple, null);
+ else
+ coerceTuple1.OriginalTuple = this.VisitExpression(coerceTuple1.OriginalTuple, coerceTuple2.OriginalTuple);
+ return this.VisitConstructTuple(coerceTuple1, coerceTuple2);
+ }
+ public virtual CollectionEnumerator VisitCollectionEnumerator(CollectionEnumerator ce1, CollectionEnumerator ce2)
+ {
+ if (ce1 == null) return null;
+ if (ce2 == null)
+ ce1.Collection = this.VisitExpression(ce1.Collection, null);
+ else
+ ce1.Collection = this.VisitExpression(ce1.Collection, ce2.Collection);
+ return ce1;
+ }
+ public virtual Compilation VisitCompilation(Compilation compilation1, Compilation compilation2)
+ {
+ if (compilation1 == null) return null;
+ Module module1 = compilation1.TargetModule;
+ AssemblyNode assem1 = module1 as AssemblyNode;
+ Module module2 = compilation2 == null ? null : compilation2.TargetModule;
+ AssemblyNode assem2 = module2 as AssemblyNode;
+ if (module1 != null)
+ {
+ if (module2 == null)
+ module1.Attributes = this.VisitAttributeList(module1.Attributes, null);
+ else
+ module1.Attributes = this.VisitAttributeList(module1.Attributes, module2.Attributes);
+ }
+ if (assem1 != null)
+ {
+ if (assem2 == null)
+ assem1.ModuleAttributes = this.VisitAttributeList(assem1.ModuleAttributes, null);
+ else
+ assem1.ModuleAttributes = this.VisitAttributeList(assem1.ModuleAttributes, assem2.ModuleAttributes);
+ }
+ compilation1.CompilationUnits = this.VisitCompilationUnitList(compilation1.CompilationUnits, compilation2 == null ? null : compilation2.CompilationUnits);
+ return null;
+ }
+ public virtual CompilationUnit VisitCompilationUnit(CompilationUnit cUnit1, CompilationUnit cUnit2)
+ {
+ if (cUnit1 == null) return null;
+ cUnit1.Nodes = this.VisitNodeList(cUnit1.Nodes, cUnit2 == null ? null : cUnit2.Nodes);
+ return cUnit1;
+ }
+ public virtual CompilationUnitList VisitCompilationUnitList(CompilationUnitList cUnits1, CompilationUnitList cUnits2)
+ {
+ if (cUnits1 == null) return null;
+ for (int i = 0, n = cUnits1.Count, m = cUnits2 == null ? 0 : cUnits2.Count; i < n; i++)
+ {
+ //^ assert cUnits2 != null;
+ if (i >= m)
+ cUnits1[i] = (CompilationUnit)this.VisitCompilationUnit(cUnits1[i], null);
+ else
+ cUnits1[i] = (CompilationUnit)this.VisitCompilationUnit(cUnits1[i], cUnits2[i]);
+ }
+ return cUnits1;
+ }
+ public virtual CompilationUnitSnippet VisitCompilationUnitSnippet(CompilationUnitSnippet snippet1, CompilationUnitSnippet snippet2)
+ {
+ return snippet1;
+ }
+ public virtual Node VisitComposition(Composition comp1, Composition comp2)
+ {
+ if (comp1 == null) return null;
+ if (comp1.GetType() == typeof(Composition))
+ {
+ comp1.Expression = (Expression)this.Visit(comp1.Expression, comp2 == null ? null : comp2.Expression);
+ return comp1;
+ }
+ return this.VisitUnknownNodeType(comp1, comp2);
+ }
+ public virtual Expression VisitConstruct(Construct cons1, Construct cons2)
+ {
+ if (cons1 == null) return null;
+ if (cons2 == null)
+ {
+ cons1.Constructor = this.VisitExpression(cons1.Constructor, null);
+ cons1.Operands = this.VisitExpressionList(cons1.Operands, null);
+ cons1.Owner = this.VisitExpression(cons1.Owner, null);
+ }
+ else
+ {
+ cons1.Constructor = this.VisitExpression(cons1.Constructor, cons2.Constructor);
+ cons1.Operands = this.VisitExpressionList(cons1.Operands, cons2.Operands);
+ cons1.Owner = this.VisitExpression(cons1.Owner, cons2.Owner);
+ }
+ return cons1;
+ }
+ public virtual Expression VisitConstructArray(ConstructArray consArr1, ConstructArray consArr2)
+ {
+ if (consArr1 == null) return null;
+ if (consArr2 == null)
+ {
+ consArr1.ElementType = this.VisitTypeReference(consArr1.ElementType, null);
+ consArr1.Operands = this.VisitExpressionList(consArr1.Operands, null);
+ consArr1.Initializers = this.VisitExpressionList(consArr1.Initializers, null);
+ consArr1.Owner = this.VisitExpression(consArr1.Owner, null);
+ }
+ else
+ {
+ consArr1.ElementType = this.VisitTypeReference(consArr1.ElementType, consArr2.ElementType);
+ consArr1.Operands = this.VisitExpressionList(consArr1.Operands, consArr2.Operands);
+ consArr1.Initializers = this.VisitExpressionList(consArr1.Initializers, consArr2.Initializers);
+ consArr1.Owner = this.VisitExpression(consArr1.Owner, consArr2.Owner);
+ }
+ return consArr1;
+ }
+ public virtual Expression VisitConstructDelegate(ConstructDelegate consDelegate1, ConstructDelegate consDelegate2)
+ {
+ if (consDelegate1 == null) return null;
+ if (consDelegate2 == null)
+ {
+ consDelegate1.DelegateType = this.VisitTypeReference(consDelegate1.DelegateType, null);
+ consDelegate1.TargetObject = this.VisitExpression(consDelegate1.TargetObject, null);
+ }
+ else
+ {
+ consDelegate1.DelegateType = this.VisitTypeReference(consDelegate1.DelegateType, consDelegate2.DelegateType);
+ consDelegate1.TargetObject = this.VisitExpression(consDelegate1.TargetObject, consDelegate2.TargetObject);
+ }
+ return consDelegate1;
+ }
+ public virtual Expression VisitConstructFlexArray(ConstructFlexArray consArr1, ConstructFlexArray consArr2)
+ {
+ if (consArr1 == null) return null;
+ if (consArr2 == null)
+ {
+ consArr1.ElementType = this.VisitTypeReference(consArr1.ElementType, null);
+ consArr1.Operands = this.VisitExpressionList(consArr1.Operands, null);
+ consArr1.Initializers = this.VisitExpressionList(consArr1.Initializers, null);
+ }
+ else
+ {
+ consArr1.ElementType = this.VisitTypeReference(consArr1.ElementType, consArr2.ElementType);
+ consArr1.Operands = this.VisitExpressionList(consArr1.Operands, consArr2.Operands);
+ consArr1.Initializers = this.VisitExpressionList(consArr1.Initializers, consArr2.Initializers);
+ }
+ return consArr1;
+ }
+ public virtual Expression VisitConstructIterator(ConstructIterator consIterator1, ConstructIterator consIterator2)
+ {
+ return consIterator1;
+ }
+ public virtual Expression VisitConstructTuple(ConstructTuple consTuple1, ConstructTuple consTuple2)
+ {
+ if (consTuple1 == null) return null;
+ if (consTuple2 == null)
+ consTuple1.Fields = this.VisitFieldList(consTuple1.Fields, null);
+ else
+ consTuple1.Fields = this.VisitFieldList(consTuple1.Fields, consTuple2.Fields);
+ return consTuple1;
+ }
+#if ExtendedRuntime
+ public virtual TypeNode VisitConstrainedType(ConstrainedType cType1, ConstrainedType cType2){
+ if (cType1 == null) return null;
+ if (cType2 == null){
+ cType1.UnderlyingType = this.VisitTypeReference(cType1.UnderlyingType, null);
+ cType1.Constraint = this.VisitExpression(cType1.Constraint, null);
+ }else{
+ cType1.UnderlyingType = this.VisitTypeReference(cType1.UnderlyingType, cType2.UnderlyingType);
+ cType1.Constraint = this.VisitExpression(cType1.Constraint, cType2.Constraint);
+ }
+ return cType1;
+ }
+#endif
+ public virtual Statement VisitContinue(Continue Continue1, Continue Continue2)
+ {
+ return Continue1;
+ }
+ public virtual Expression VisitCurrentClosure(CurrentClosure currentClosure1, CurrentClosure currentClosure2)
+ {
+ return currentClosure1;
+ }
+ public virtual DelegateNode VisitDelegateNode(DelegateNode delegateNode1, DelegateNode delegateNode2)
+ {
+ if (delegateNode1 == null) return null;
+ if (delegateNode2 == null)
+ {
+ delegateNode1 = (DelegateNode)this.VisitTypeNode(delegateNode1, null);
+ if (delegateNode1 == null) return null;
+ delegateNode1.Parameters = this.VisitParameterList(delegateNode1.Parameters, null);
+ delegateNode1.ReturnType = this.VisitTypeReference(delegateNode1.ReturnType, null);
+ }
+ else
+ {
+ delegateNode1 = (DelegateNode)this.VisitTypeNode(delegateNode1, delegateNode2);
+ if (delegateNode1 == null) return null;
+ delegateNode1.Parameters = this.VisitParameterList(delegateNode1.Parameters, delegateNode2.Parameters);
+ delegateNode1.ReturnType = this.VisitTypeReference(delegateNode1.ReturnType, delegateNode2.ReturnType);
+ }
+ return delegateNode1;
+ }
+ public virtual Statement VisitDoWhile(DoWhile doWhile1, DoWhile doWhile2)
+ {
+ if (doWhile1 == null) return null;
+ if (doWhile2 == null)
+ {
+ doWhile1.Invariants = this.VisitExpressionList(doWhile1.Invariants, null);
+ doWhile1.Body = this.VisitBlock(doWhile1.Body, null);
+ doWhile1.Condition = this.VisitExpression(doWhile1.Condition, null);
+ }
+ else
+ {
+ doWhile1.Invariants = this.VisitExpressionList(doWhile1.Invariants, doWhile2.Invariants);
+ doWhile1.Body = this.VisitBlock(doWhile1.Body, doWhile2.Body);
+ doWhile1.Condition = this.VisitExpression(doWhile1.Condition, doWhile2.Condition);
+ }
+ return doWhile1;
+ }
+ public virtual Statement VisitEndFilter(EndFilter endFilter1, EndFilter endFilter2)
+ {
+ if (endFilter1 == null) return null;
+ if (endFilter2 == null)
+ endFilter1.Value = this.VisitExpression(endFilter1.Value, null);
+ else
+ endFilter1.Value = this.VisitExpression(endFilter1.Value, endFilter2.Value);
+ return endFilter1;
+ }
+ public virtual Statement VisitEndFinally(EndFinally endFinally1, EndFinally endFinally2)
+ {
+ return endFinally1;
+ }
+#if ExtendedRuntime
+ public virtual EnsuresList VisitEnsuresList(EnsuresList ensures1, EnsuresList ensures2) {
+ if (ensures1 == null) return null;
+ for (int i = 0, n = ensures1.Count, m = ensures2 == null ? 0 : ensures2.Count; i < n; i++) {
+ //^ assert ensures2 != null;
+ if (i >= m)
+ ensures1[i] = (Ensures)this.Visit(ensures1[i], null);
+ else
+ ensures1[i] = (Ensures)this.Visit(ensures1[i], ensures2[i]);
+ }
+ return ensures1;
+ }
+#endif
+ public virtual EnumNode VisitEnumNode(EnumNode enumNode1, EnumNode enumNode2)
+ {
+ return (EnumNode)this.VisitTypeNode(enumNode1, enumNode2);
+ }
+ public virtual Event VisitEvent(Event evnt1, Event evnt2)
+ {
+ if (evnt1 == null) return null;
+ if (evnt2 == null)
+ {
+ evnt1.Attributes = this.VisitAttributeList(evnt1.Attributes, null);
+ evnt1.HandlerType = this.VisitTypeReference(evnt1.HandlerType, null);
+ }
+ else
+ {
+ evnt1.Attributes = this.VisitAttributeList(evnt1.Attributes, evnt2.Attributes);
+ evnt1.HandlerType = this.VisitTypeReference(evnt1.HandlerType, evnt2.HandlerType);
+ }
+ return evnt1;
+ }
+#if ExtendedRuntime
+ public virtual EnsuresExceptional VisitEnsuresExceptional(EnsuresExceptional exceptional1, EnsuresExceptional exceptional2) {
+ if (exceptional1 == null) return null;
+ if (exceptional2 == null) {
+ exceptional1.PostCondition = this.VisitExpression(exceptional1.PostCondition, null);
+ exceptional1.Type = this.VisitTypeReference(exceptional1.Type, null);
+ exceptional1.Variable = this.VisitExpression(exceptional1.Variable, null);
+ }else{
+ exceptional1.PostCondition = this.VisitExpression(exceptional1.PostCondition, exceptional2.PostCondition);
+ exceptional1.Type = this.VisitTypeReference(exceptional1.Type, exceptional2.Type);
+ exceptional1.Variable = this.VisitExpression(exceptional1.Variable, exceptional2.Variable);
+ }
+ return exceptional1;
+ }
+#endif
+ public virtual Statement VisitExit(Exit exit1, Exit exit2)
+ {
+ return exit1;
+ }
+
+ public virtual Statement VisitExpose(Expose expose1, Expose expose2)
+ {
+ if (expose1 == null) return null;
+ if (expose2 == null)
+ {
+ expose1.Instance = this.VisitExpression(expose1.Instance, null);
+ expose1.Body = this.VisitBlock(expose1.Body, null);
+ }
+ else
+ {
+ expose1.Instance = this.VisitExpression(expose1.Instance, expose1.Instance);
+ expose1.Body = this.VisitBlock(expose1.Body, expose2.Body);
+ }
+ return expose1;
+ }
+
+ public virtual Expression VisitExpression(Expression expression1, Expression expression2)
+ {
+ if (expression1 == null) return null;
+ switch (expression1.NodeType)
+ {
+ case NodeType.Dup:
+ case NodeType.Arglist:
+ return expression1;
+ case NodeType.Pop:
+ UnaryExpression uex1 = expression1 as UnaryExpression;
+ UnaryExpression uex2 = expression2 as UnaryExpression;
+ if (uex1 != null)
+ {
+ uex1.Operand = this.VisitExpression(uex1.Operand, uex2 == null ? null : uex2.Operand);
+ return uex1;
+ }
+ return expression1;
+ default:
+ return (Expression)this.Visit(expression1, expression2);
+ }
+ }
+ public virtual ExpressionList VisitExpressionList(ExpressionList list1, ExpressionList list2)
+ {
+ if (list1 == null) return null;
+ for (int i = 0, n = list1.Count, m = list2 == null ? 0 : list2.Count; i < n; i++)
+ {
+ //^ assert list2 != null;
+ if (i >= m)
+ list1[i] = (Expression)this.Visit(list1[i], null);
+ else
+ list1[i] = (Expression)this.Visit(list1[i], list2[i]);
+ }
+ return list1;
+ }
+ public virtual Expression VisitExpressionSnippet(ExpressionSnippet snippet1, ExpressionSnippet snippet2)
+ {
+ return snippet1;
+ }
+ public virtual Statement VisitExpressionStatement(ExpressionStatement statement1, ExpressionStatement statement2)
+ {
+ if (statement1 == null) return null;
+ if (statement2 == null)
+ statement1.Expression = this.VisitExpression(statement1.Expression, null);
+ else
+ statement1.Expression = this.VisitExpression(statement1.Expression, statement2.Expression);
+ return statement1;
+ }
+ public virtual Statement VisitFaultHandler(FaultHandler faultHandler1, FaultHandler faultHandler2)
+ {
+ if (faultHandler1 == null) return null;
+ if (faultHandler2 == null)
+ faultHandler1.Block = this.VisitBlock(faultHandler1.Block, null);
+ else
+ faultHandler1.Block = this.VisitBlock(faultHandler1.Block, faultHandler2.Block);
+ return faultHandler1;
+ }
+ public virtual FaultHandlerList VisitFaultHandlerList(FaultHandlerList faultHandlers1, FaultHandlerList faultHandlers2)
+ {
+ if (faultHandlers1 == null) return null;
+ for (int i = 0, n = faultHandlers1.Count, m = faultHandlers2 == null ? 0 : faultHandlers2.Count; i < n; i++)
+ {
+ //^ assert faultHandlers2 != null;
+ if (i >= m)
+ faultHandlers1[i] = (FaultHandler)this.VisitFaultHandler(faultHandlers1[i], null);
+ else
+ faultHandlers1[i] = (FaultHandler)this.VisitFaultHandler(faultHandlers1[i], faultHandlers2[i]);
+ }
+ return faultHandlers1;
+ }
+ public virtual Field VisitField(Field field1, Field field2)
+ {
+ if (field1 == null) return null;
+ if (field2 == null)
+ {
+ field1.Attributes = this.VisitAttributeList(field1.Attributes, null);
+ field1.Type = this.VisitTypeReference(field1.Type, null);
+ field1.Initializer = this.VisitExpression(field1.Initializer, null);
+ field1.ImplementedInterfaces = this.VisitInterfaceReferenceList(field1.ImplementedInterfaces, null);
+ }
+ else
+ {
+ field1.Attributes = this.VisitAttributeList(field1.Attributes, field2.Attributes);
+ field1.Type = this.VisitTypeReference(field1.Type, field2.Type);
+ field1.Initializer = this.VisitExpression(field1.Initializer, field2.Initializer);
+ field1.ImplementedInterfaces = this.VisitInterfaceReferenceList(field1.ImplementedInterfaces, field2.ImplementedInterfaces);
+ }
+ return field1;
+ }
+ public virtual Block VisitFieldInitializerBlock(FieldInitializerBlock block1, FieldInitializerBlock block2)
+ {
+ if (block1 == null) return null;
+ if (block2 == null)
+ block1.Type = this.VisitTypeReference(block1.Type, null);
+ else
+ block1.Type = this.VisitTypeReference(block1.Type, block2.Type);
+ return this.VisitBlock(block1, block2);
+ }
+ public virtual FieldList VisitFieldList(FieldList fields1, FieldList fields2)
+ {
+ if (fields1 == null) return null;
+ for (int i = 0, n = fields1.Count, m = fields2 == null ? 0 : fields2.Count; i < n; i++)
+ {
+ //^ assert fields2 != null;
+ if (i >= m)
+ fields1[i] = this.VisitField(fields1[i], null);
+ else
+ fields1[i] = this.VisitField(fields1[i], fields2[i]);
+ }
+ return fields1;
+ }
+ public virtual Statement VisitFilter(Filter filter1, Filter filter2)
+ {
+ if (filter1 == null) return null;
+ if (filter2 == null)
+ {
+ filter1.Expression = this.VisitExpression(filter1.Expression, null);
+ filter1.Block = this.VisitBlock(filter1.Block, null);
+ }
+ else
+ {
+ filter1.Expression = this.VisitExpression(filter1.Expression, filter2.Expression);
+ filter1.Block = this.VisitBlock(filter1.Block, filter2.Block);
+ }
+ return filter1;
+ }
+ public virtual FilterList VisitFilterList(FilterList filters1, FilterList filters2)
+ {
+ if (filters1 == null) return null;
+ for (int i = 0, n = filters1.Count, m = filters2 == null ? 0 : filters2.Count; i < n; i++)
+ {
+ //^ assert filters2 != null;
+ if (i >= m)
+ filters1[i] = (Filter)this.VisitFilter(filters1[i], null);
+ else
+ filters1[i] = (Filter)this.VisitFilter(filters1[i], filters2[i]);
+ }
+ return filters1;
+ }
+ public virtual Statement VisitFinally(Finally Finally1, Finally Finally2)
+ {
+ if (Finally1 == null) return null;
+ if (Finally2 == null)
+ Finally1.Block = this.VisitBlock(Finally1.Block, null);
+ else
+ Finally1.Block = this.VisitBlock(Finally1.Block, Finally2.Block);
+ return Finally1;
+ }
+ public virtual Statement VisitFixed(Fixed fixed1, Fixed fixed2)
+ {
+ if (fixed1 == null) return null;
+ if (fixed2 == null)
+ {
+ fixed1.Declarators = (Statement)this.Visit(fixed1.Declarators, null);
+ fixed1.Body = this.VisitBlock(fixed1.Body, null);
+ }
+ else
+ {
+ fixed1.Declarators = (Statement)this.Visit(fixed1.Declarators, fixed2.Declarators);
+ fixed1.Body = this.VisitBlock(fixed1.Body, fixed2.Body);
+ }
+ return fixed1;
+ }
+ public virtual Statement VisitFor(For For1, For For2)
+ {
+ if (For1 == null) return null;
+ if (For2 == null)
+ {
+ For1.Initializer = this.VisitStatementList(For1.Initializer, null);
+ For1.Invariants = this.VisitExpressionList(For1.Invariants, null);
+ For1.Condition = this.VisitExpression(For1.Condition, null);
+ For1.Incrementer = this.VisitStatementList(For1.Incrementer, null);
+ For1.Body = this.VisitBlock(For1.Body, null);
+ }
+ else
+ {
+ For1.Initializer = this.VisitStatementList(For1.Initializer, For2.Initializer);
+ For1.Invariants = this.VisitExpressionList(For1.Invariants, For2.Invariants);
+ For1.Condition = this.VisitExpression(For1.Condition, For2.Condition);
+ For1.Incrementer = this.VisitStatementList(For1.Incrementer, For2.Incrementer);
+ For1.Body = this.VisitBlock(For1.Body, For2.Body);
+ }
+ return For1;
+ }
+ public virtual Statement VisitForEach(ForEach forEach1, ForEach forEach2)
+ {
+ if (forEach1 == null) return null;
+ if (forEach2 == null)
+ {
+ forEach1.TargetVariableType = this.VisitTypeReference(forEach1.TargetVariableType, null);
+ forEach1.TargetVariable = this.VisitTargetExpression(forEach1.TargetVariable, null);
+ forEach1.SourceEnumerable = this.VisitExpression(forEach1.SourceEnumerable, null);
+ forEach1.InductionVariable = this.VisitTargetExpression(forEach1.InductionVariable, null);
+ forEach1.Invariants = this.VisitExpressionList(forEach1.Invariants, null);
+ forEach1.Body = this.VisitBlock(forEach1.Body, null);
+ }
+ else
+ {
+ forEach1.TargetVariableType = this.VisitTypeReference(forEach1.TargetVariableType, forEach2.TargetVariableType);
+ forEach1.TargetVariable = this.VisitTargetExpression(forEach1.TargetVariable, forEach2.TargetVariable);
+ forEach1.SourceEnumerable = this.VisitExpression(forEach1.SourceEnumerable, forEach2.SourceEnumerable);
+ forEach1.InductionVariable = this.VisitTargetExpression(forEach1.InductionVariable, forEach2.InductionVariable);
+ forEach1.Invariants = this.VisitExpressionList(forEach1.Invariants, forEach2.Invariants);
+ forEach1.Body = this.VisitBlock(forEach1.Body, forEach2.Body);
+ }
+ return forEach1;
+ }
+ public virtual Statement VisitFunctionDeclaration(FunctionDeclaration functionDeclaration1, FunctionDeclaration functionDeclaration2)
+ {
+ if (functionDeclaration1 == null) return null;
+ if (functionDeclaration2 == null)
+ {
+ functionDeclaration1.Parameters = this.VisitParameterList(functionDeclaration1.Parameters, null);
+ functionDeclaration1.ReturnType = this.VisitTypeReference(functionDeclaration1.ReturnType, null);
+ functionDeclaration1.Body = this.VisitBlock(functionDeclaration1.Body, null);
+ }
+ else
+ {
+ functionDeclaration1.Parameters = this.VisitParameterList(functionDeclaration1.Parameters, functionDeclaration2.Parameters);
+ functionDeclaration1.ReturnType = this.VisitTypeReference(functionDeclaration1.ReturnType, functionDeclaration2.ReturnType);
+ functionDeclaration1.Body = this.VisitBlock(functionDeclaration1.Body, functionDeclaration2.Body);
+ }
+ return functionDeclaration1;
+ }
+ public virtual Expression VisitTemplateInstance(TemplateInstance genericInstance1, TemplateInstance genericInstance2)
+ {
+ if (genericInstance1 == null) return null;
+ if (genericInstance2 == null)
+ {
+ genericInstance1.Expression = this.VisitExpression(genericInstance1.Expression, null);
+ genericInstance1.TypeArguments = this.VisitTypeReferenceList(genericInstance1.TypeArguments, null);
+ }
+ else
+ {
+ genericInstance1.Expression = this.VisitExpression(genericInstance1.Expression, genericInstance2.Expression);
+ genericInstance1.TypeArguments = this.VisitTypeReferenceList(genericInstance1.TypeArguments, genericInstance2.TypeArguments);
+ }
+ return genericInstance1;
+ }
+ public virtual Expression VisitStackAlloc(StackAlloc alloc1, StackAlloc alloc2)
+ {
+ if (alloc1 == null) return null;
+ if (alloc2 == null)
+ {
+ alloc1.ElementType = this.VisitTypeReference(alloc1.ElementType, null);
+ alloc1.NumberOfElements = this.VisitExpression(alloc1.NumberOfElements, null);
+ }
+ else
+ {
+ alloc1.ElementType = this.VisitTypeReference(alloc1.ElementType, alloc2.ElementType);
+ alloc1.NumberOfElements = this.VisitExpression(alloc1.NumberOfElements, alloc2.NumberOfElements);
+ }
+ return alloc1;
+ }
+ public virtual Statement VisitGoto(Goto Goto1, Goto Goto2)
+ {
+ return Goto1;
+ }
+ public virtual Statement VisitGotoCase(GotoCase gotoCase1, GotoCase gotoCase2)
+ {
+ if (gotoCase1 == null) return null;
+ if (gotoCase2 == null)
+ {
+ gotoCase1.CaseLabel = this.VisitExpression(gotoCase1.CaseLabel, null);
+ }
+ else
+ {
+ gotoCase1.CaseLabel = this.VisitExpression(gotoCase1.CaseLabel, gotoCase2.CaseLabel);
+ }
+ return gotoCase1;
+ }
+ public virtual Expression VisitIdentifier(Identifier identifier1, Identifier identifier2)
+ {
+ return identifier1;
+ }
+ public virtual Statement VisitIf(If If1, If If2)
+ {
+ if (If1 == null) return null;
+ if (If2 == null)
+ {
+ If1.Condition = this.VisitExpression(If1.Condition, null);
+ If1.TrueBlock = this.VisitBlock(If1.TrueBlock, null);
+ If1.FalseBlock = this.VisitBlock(If1.FalseBlock, null);
+ }
+ else
+ {
+ If1.Condition = this.VisitExpression(If1.Condition, If2.Condition);
+ If1.TrueBlock = this.VisitBlock(If1.TrueBlock, If2.TrueBlock);
+ If1.FalseBlock = this.VisitBlock(If1.FalseBlock, If2.FalseBlock);
+ }
+ return If1;
+ }
+ public virtual Expression VisitImplicitThis(ImplicitThis implicitThis1, ImplicitThis implicitThis2)
+ {
+ return implicitThis1;
+ }
+ public virtual Expression VisitIndexer(Indexer indexer1, Indexer indexer2)
+ {
+ if (indexer1 == null) return null;
+ if (indexer2 == null)
+ {
+ indexer1.Object = this.VisitExpression(indexer1.Object, null);
+ indexer1.Operands = this.VisitExpressionList(indexer1.Operands, null);
+ }
+ else
+ {
+ indexer1.Object = this.VisitExpression(indexer1.Object, indexer2.Object);
+ indexer1.Operands = this.VisitExpressionList(indexer1.Operands, indexer2.Operands);
+ }
+ return indexer1;
+ }
+ public virtual Interface VisitInterface(Interface Interface1, Interface Interface2)
+ {
+ return (Interface)this.VisitTypeNode(Interface1, Interface2);
+ }
+ public virtual Interface VisitInterfaceReference(Interface Interface1, Interface Interface2)
+ {
+ return (Interface)this.VisitTypeReference(Interface1, Interface2);
+ }
+ public virtual InterfaceList VisitInterfaceReferenceList(InterfaceList interfaceReferences1, InterfaceList interfaceReferences2)
+ {
+ if (interfaceReferences1 == null) return null;
+ for (int i = 0, n = interfaceReferences1.Count, m = interfaceReferences2 == null ? 0 : interfaceReferences2.Count; i < n; i++)
+ {
+ //^ assert interfaceReferences2 != null;
+ if (i >= m)
+ interfaceReferences1[i] = this.VisitInterfaceReference(interfaceReferences1[i], null);
+ else
+ interfaceReferences1[i] = this.VisitInterfaceReference(interfaceReferences1[i], interfaceReferences2[i]);
+ }
+ return interfaceReferences1;
+ }
+#if ExtendedRuntime
+ public virtual Invariant VisitInvariant(Invariant invariant1, Invariant invariant2){
+ if (invariant1 == null) return null;
+ if (invariant2 == null){
+ invariant1.Condition = this.VisitExpression(invariant1.Condition, null);
+ }else{
+ invariant1.Condition = this.VisitExpression(invariant1.Condition, invariant2.Condition);
+ }
+ return invariant1;
+ }
+ public virtual InvariantList VisitInvariantList(InvariantList Invariants1, InvariantList Invariants2){
+ if (Invariants1 == null) return null;
+ for (int i = 0, n = Invariants1.Count, m = Invariants2 == null ? 0 : Invariants2.Count; i < n; i++){
+ //^ assert Invariants2 != null;
+ if (i >= m)
+ Invariants1[i] = this.VisitInvariant(Invariants1[i], null);
+ else
+ Invariants1[i] = this.VisitInvariant(Invariants1[i], Invariants2[i]);
+ }
+ return Invariants1;
+ }
+#endif
+ public virtual InstanceInitializer VisitInstanceInitializer(InstanceInitializer cons1, InstanceInitializer cons2)
+ {
+ return (InstanceInitializer)this.VisitMethod(cons1, cons2);
+ }
+ public virtual Statement VisitLabeledStatement(LabeledStatement lStatement1, LabeledStatement lStatement2)
+ {
+ if (lStatement1 == null) return null;
+ if (lStatement2 == null)
+ lStatement1.Statement = (Statement)this.Visit(lStatement1.Statement, null);
+ else
+ lStatement1.Statement = (Statement)this.Visit(lStatement1.Statement, lStatement2.Statement);
+ return lStatement1;
+ }
+ public virtual Expression VisitLiteral(Literal literal1, Literal literal2)
+ {
+ return literal1;
+ }
+ public virtual Expression VisitLocal(Local local1, Local local2)
+ {
+ if (local1 == null) return null;
+ if (local2 == null)
+ local1.Type = this.VisitTypeReference(local1.Type, null);
+ else
+ local1.Type = this.VisitTypeReference(local1.Type, local2.Type);
+ return local1;
+ }
+ public virtual LocalDeclaration VisitLocalDeclaration(LocalDeclaration localDeclaration1, LocalDeclaration localDeclaration2)
+ {
+ if (localDeclaration1 == null) return null;
+ if (localDeclaration2 == null)
+ localDeclaration1.InitialValue = this.VisitExpression(localDeclaration1.InitialValue, null);
+ else
+ localDeclaration1.InitialValue = this.VisitExpression(localDeclaration1.InitialValue, localDeclaration2.InitialValue);
+ return localDeclaration1;
+ }
+ public virtual LocalDeclarationList VisitLocalDeclarationList(LocalDeclarationList localDeclarations1, LocalDeclarationList localDeclarations2)
+ {
+ if (localDeclarations1 == null) return null;
+ for (int i = 0, n = localDeclarations1.Count, m = localDeclarations2 == null ? 0 : localDeclarations2.Count; i < n; i++)
+ {
+ //^ assert localDeclarations2 != null;
+ if (i >= m)
+ localDeclarations1[i] = this.VisitLocalDeclaration(localDeclarations1[i], null);
+ else
+ localDeclarations1[i] = this.VisitLocalDeclaration(localDeclarations1[i], localDeclarations2[i]);
+ }
+ return localDeclarations1;
+ }
+ public virtual Statement VisitLocalDeclarationsStatement(LocalDeclarationsStatement localDeclarations1, LocalDeclarationsStatement localDeclarations2)
+ {
+ if (localDeclarations1 == null) return null;
+ if (localDeclarations2 == null)
+ {
+ localDeclarations1.Type = this.VisitTypeReference(localDeclarations1.Type, null);
+ localDeclarations1.Declarations = this.VisitLocalDeclarationList(localDeclarations1.Declarations, null);
+ }
+ else
+ {
+ localDeclarations1.Type = this.VisitTypeReference(localDeclarations1.Type, localDeclarations2.Type);
+ localDeclarations1.Declarations = this.VisitLocalDeclarationList(localDeclarations1.Declarations, localDeclarations2.Declarations);
+ }
+ return localDeclarations1;
+ }
+ public virtual Statement VisitLock(Lock lock1, Lock lock2)
+ {
+ if (lock1 == null) return null;
+ if (lock2 == null)
+ {
+ lock1.Guard = this.VisitExpression(lock1.Guard, null);
+ lock1.Body = this.VisitBlock(lock1.Body, null);
+ }
+ else
+ {
+ lock1.Guard = this.VisitExpression(lock1.Guard, lock2.Guard);
+ lock1.Body = this.VisitBlock(lock1.Body, lock2.Body);
+ }
+ return lock1;
+ }
+ public virtual Expression VisitLRExpression(LRExpression expr1, LRExpression expr2)
+ {
+ if (expr1 == null) return null;
+ if (expr2 == null)
+ expr1.Expression = this.VisitExpression(expr1.Expression, null);
+ else
+ expr1.Expression = this.VisitExpression(expr1.Expression, expr2.Expression);
+ return expr1;
+ }
+ public virtual Expression VisitMemberBinding(MemberBinding memberBinding1, MemberBinding memberBinding2)
+ {
+ if (memberBinding1 == null) return null;
+ if (memberBinding2 == null)
+ memberBinding1.TargetObject = this.VisitExpression(memberBinding1.TargetObject, null);
+ else
+ memberBinding1.TargetObject = this.VisitExpression(memberBinding1.TargetObject, memberBinding2.TargetObject);
+ return memberBinding1;
+ }
+ public virtual MemberList VisitMemberList(MemberList members1, MemberList members2)
+ {
+ if (members1 == null) return null;
+ for (int i = 0, n = members1.Count, m = members2 == null ? 0 : members2.Count; i < n; i++)
+ {
+ //^ assert members2 != null;
+ if (i >= m)
+ members1[i] = (Member)this.Visit(members1[i], null);
+ else
+ members1[i] = (Member)this.Visit(members1[i], members2[i]);
+ }
+ return members1;
+ }
+ public virtual Method VisitMethod(Method method1, Method method2)
+ {
+ if (method1 == null) return null;
+ if (method2 == null)
+ {
+ method1.Attributes = this.VisitAttributeList(method1.Attributes, null);
+ method1.ReturnAttributes = this.VisitAttributeList(method1.ReturnAttributes, null);
+ method1.SecurityAttributes = this.VisitSecurityAttributeList(method1.SecurityAttributes, null);
+ method1.ReturnType = this.VisitTypeReference(method1.ReturnType, null);
+ method1.ImplementedTypes = this.VisitTypeReferenceList(method1.ImplementedTypes, null);
+ method1.Parameters = this.VisitParameterList(method1.Parameters, null);
+ method1.Body = this.VisitBlock(method1.Body, null);
+ }
+ else
+ {
+ method1.Attributes = this.VisitAttributeList(method1.Attributes, method2.Attributes);
+ method1.ReturnAttributes = this.VisitAttributeList(method1.ReturnAttributes, method2.ReturnAttributes);
+ method1.SecurityAttributes = this.VisitSecurityAttributeList(method1.SecurityAttributes, method2.SecurityAttributes);
+ method1.ReturnType = this.VisitTypeReference(method1.ReturnType, method2.ReturnType);
+ method1.ImplementedTypes = this.VisitTypeReferenceList(method1.ImplementedTypes, method2.ImplementedTypes);
+ method1.Parameters = this.VisitParameterList(method1.Parameters, method2.Parameters);
+#if ExtendedRuntime
+ method1.Contract = this.VisitMethodContract(method1.Contract, method2.Contract);
+#endif
+ method1.Body = this.VisitBlock(method1.Body, method2.Body);
+ }
+ return method1;
+ }
+ public virtual Expression VisitMethodCall(MethodCall call1, MethodCall call2)
+ {
+ if (call1 == null) return null;
+ if (call2 == null)
+ {
+ call1.Callee = this.VisitExpression(call1.Callee, null);
+ call1.Operands = this.VisitExpressionList(call1.Operands, null);
+ }
+ else
+ {
+ call1.Callee = this.VisitExpression(call1.Callee, call2.Callee);
+ call1.Operands = this.VisitExpressionList(call1.Operands, call2.Operands);
+ }
+ return call1;
+ }
+#if ExtendedRuntime
+ public virtual MethodContract VisitMethodContract(MethodContract contract1, MethodContract contract2) {
+ if (contract1 == null) return null;
+ if (contract2 == null) {
+ // don't visit contract.DeclaringMethod
+ // don't visit contract.OverriddenMethods
+ contract1.Requires = this.VisitRequiresList(contract1.Requires, null);
+ contract1.Ensures = this.VisitEnsuresList(contract1.Ensures, null);
+ contract1.Modifies = this.VisitExpressionList(contract1.Modifies, null);
+ }else{
+ // don't visit contract.DeclaringMethod
+ // don't visit contract.OverriddenMethods
+ contract1.Requires = this.VisitRequiresList(contract1.Requires,contract2.Requires);
+ contract1.Ensures = this.VisitEnsuresList(contract1.Ensures,contract2.Ensures);
+ contract1.Modifies = this.VisitExpressionList(contract1.Modifies,contract2.Modifies);
+ }
+ return contract1;
+ }
+#endif
+ public virtual Module VisitModule(Module module1, Module module2)
+ {
+ if (module1 == null) return null;
+ if (module2 == null)
+ {
+ module1.Attributes = this.VisitAttributeList(module1.Attributes, null);
+ module1.Types = this.VisitTypeNodeList(module1.Types, null);
+ }
+ else
+ {
+ module1.Attributes = this.VisitAttributeList(module1.Attributes, module2.Attributes);
+ module1.Types = this.VisitTypeNodeList(module1.Types, module2.Types);
+ }
+ return module1;
+ }
+ public virtual ModuleReference VisitModuleReference(ModuleReference moduleReference1, ModuleReference moduleReference2)
+ {
+ return moduleReference1;
+ }
+ public virtual Expression VisitNameBinding(NameBinding nameBinding1, NameBinding nameBinding2)
+ {
+ return nameBinding1;
+ }
+ public virtual Expression VisitNamedArgument(NamedArgument namedArgument1, NamedArgument namedArgument2)
+ {
+ if (namedArgument1 == null) return null;
+ if (namedArgument2 == null)
+ namedArgument1.Value = this.VisitExpression(namedArgument1.Value, null);
+ else
+ namedArgument1.Value = this.VisitExpression(namedArgument1.Value, namedArgument2.Value);
+ return namedArgument1;
+ }
+ public virtual Namespace VisitNamespace(Namespace nspace1, Namespace nspace2)
+ {
+ if (nspace1 == null) return null;
+ if (nspace2 == null)
+ {
+ nspace1.AliasDefinitions = this.VisitAliasDefinitionList(nspace1.AliasDefinitions, null);
+ nspace1.UsedNamespaces = this.VisitUsedNamespaceList(nspace1.UsedNamespaces, null);
+ nspace1.Attributes = this.VisitAttributeList(nspace1.Attributes, null);
+ nspace1.Types = this.VisitTypeNodeList(nspace1.Types, null);
+ nspace1.NestedNamespaces = this.VisitNamespaceList(nspace1.NestedNamespaces, null);
+ }
+ else
+ {
+ nspace1.AliasDefinitions = this.VisitAliasDefinitionList(nspace1.AliasDefinitions, nspace2.AliasDefinitions);
+ nspace1.UsedNamespaces = this.VisitUsedNamespaceList(nspace1.UsedNamespaces, nspace2.UsedNamespaces);
+ nspace1.Attributes = this.VisitAttributeList(nspace1.Attributes, nspace2.Attributes);
+ nspace1.Types = this.VisitTypeNodeList(nspace1.Types, nspace2.Types);
+ nspace1.NestedNamespaces = this.VisitNamespaceList(nspace1.NestedNamespaces, nspace2.NestedNamespaces);
+ }
+ return nspace1;
+ }
+ public virtual NamespaceList VisitNamespaceList(NamespaceList namespaces1, NamespaceList namespaces2)
+ {
+ if (namespaces1 == null) return null;
+ for (int i = 0, n = namespaces1.Count, m = namespaces2 == null ? 0 : namespaces2.Count; i < n; i++)
+ {
+ //^ assert namespaces2 != null;
+ if (i >= m)
+ namespaces1[i] = this.VisitNamespace(namespaces1[i], null);
+ else
+ namespaces1[i] = this.VisitNamespace(namespaces1[i], namespaces2[i]);
+ }
+ return namespaces1;
+ }
+ public virtual NodeList VisitNodeList(NodeList nodes1, NodeList nodes2)
+ {
+ if (nodes1 == null) return null;
+ for (int i = 0, n = nodes1.Count, m = nodes2 == null ? 0 : nodes2.Count; i < n; i++)
+ {
+ //^ assert nodes2 != null;
+ if (i >= m)
+ nodes1[i] = (CompilationUnit)this.Visit(nodes1[i], null);
+ else
+ nodes1[i] = (CompilationUnit)this.Visit(nodes1[i], nodes2[i]);
+ }
+ return nodes1;
+ }
+#if ExtendedRuntime
+ public virtual EnsuresNormal VisitEnsuresNormal(EnsuresNormal normal1, EnsuresNormal normal2) {
+ if (normal1 == null) return null;
+ if (normal2 == null)
+ normal1.PostCondition = this.VisitExpression(normal1.PostCondition, null);
+ else
+ normal1.PostCondition = this.VisitExpression(normal1.PostCondition, normal2.PostCondition);
+ return normal1;
+ }
+ public virtual Expression VisitOldExpression(OldExpression oldExpression1, OldExpression oldExpression2) {
+ if (oldExpression1 == null) return null;
+ if (oldExpression2 == null)
+ oldExpression1.expression = this.VisitExpression(oldExpression1.expression, null);
+ else
+ oldExpression1.expression = this.VisitExpression(oldExpression1.expression, oldExpression2.expression);
+ return oldExpression1;
+ }
+ public virtual RequiresOtherwise VisitRequiresOtherwise(RequiresOtherwise otherwise1, RequiresOtherwise otherwise2) {
+ if (otherwise1 == null) return null;
+ if (otherwise2 == null) {
+ otherwise1.Condition = this.VisitExpression(otherwise1.Condition, null);
+ otherwise1.ThrowException = this.VisitExpression(otherwise1.ThrowException, null);
+ }else{
+ otherwise1.Condition = this.VisitExpression(otherwise1.Condition, otherwise2.Condition);
+ otherwise1.ThrowException = this.VisitExpression(otherwise1.ThrowException, otherwise2.ThrowException);
+ }
+ return otherwise1;
+ }
+#endif
+ public virtual Expression VisitParameter(Parameter parameter1, Parameter parameter2)
+ {
+ if (parameter1 == null) return null;
+ if (parameter2 == null)
+ {
+ parameter1.Attributes = this.VisitAttributeList(parameter1.Attributes, null);
+ parameter1.Type = this.VisitTypeReference(parameter1.Type, null);
+ parameter1.DefaultValue = this.VisitExpression(parameter1.DefaultValue, null);
+ }
+ else
+ {
+ parameter1.Attributes = this.VisitAttributeList(parameter1.Attributes, parameter2.Attributes);
+ parameter1.Type = this.VisitTypeReference(parameter1.Type, parameter2.Type);
+ parameter1.DefaultValue = this.VisitExpression(parameter1.DefaultValue, parameter2.DefaultValue);
+ }
+ return parameter1;
+ }
+ public virtual ParameterList VisitParameterList(ParameterList parameterList1, ParameterList parameterList2)
+ {
+ if (parameterList1 == null) return null;
+ for (int i = 0, n = parameterList1.Count, m = parameterList2 == null ? 0 : parameterList2.Count; i < n; i++)
+ {
+ //^ assert parameterList2 != null;
+ if (i >= m)
+ parameterList1[i] = (Parameter)this.VisitParameter(parameterList1[i], null);
+ else
+ parameterList1[i] = (Parameter)this.VisitParameter(parameterList1[i], parameterList2[i]);
+ }
+ return parameterList1;
+ }
+#if ExtendedRuntime
+ public virtual RequiresPlain VisitRequiresPlain(RequiresPlain plain1, RequiresPlain plain2) {
+ if (plain1 == null) return null;
+ if (plain2 == null)
+ plain1.Condition = this.VisitExpression(plain1.Condition, null);
+ else
+ plain1.Condition = this.VisitExpression(plain1.Condition, plain2.Condition);
+ return plain1;
+ }
+#endif
+ public virtual Expression VisitPrefixExpression(PrefixExpression pExpr1, PrefixExpression pExpr2)
+ {
+ if (pExpr1 == null) return null;
+ if (pExpr2 == null)
+ pExpr1.Expression = this.VisitExpression(pExpr1.Expression, null);
+ else
+ pExpr1.Expression = this.VisitExpression(pExpr1.Expression, pExpr2.Expression);
+ return pExpr1;
+ }
+ public virtual Expression VisitPostfixExpression(PostfixExpression pExpr1, PostfixExpression pExpr2)
+ {
+ if (pExpr1 == null) return null;
+ if (pExpr2 == null)
+ pExpr1.Expression = this.VisitExpression(pExpr1.Expression, null);
+ else
+ pExpr1.Expression = this.VisitExpression(pExpr1.Expression, pExpr2.Expression);
+ return pExpr1;
+ }
+ public virtual Property VisitProperty(Property property1, Property property2)
+ {
+ if (property1 == null) return null;
+ if (property2 == null)
+ {
+ property1.Attributes = this.VisitAttributeList(property1.Attributes, null);
+ property1.Parameters = this.VisitParameterList(property1.Parameters, null);
+ property1.Type = this.VisitTypeReference(property1.Type, null);
+ }
+ else
+ {
+ property1.Attributes = this.VisitAttributeList(property1.Attributes, property2.Attributes);
+ property1.Parameters = this.VisitParameterList(property1.Parameters, property2.Parameters);
+ property1.Type = this.VisitTypeReference(property1.Type, property2.Type);
+ }
+ return property1;
+ }
+ public virtual Expression VisitQuantifier(Quantifier quantifier1, Quantifier quantifier2)
+ {
+ if (quantifier1 == null) return null;
+ if (quantifier2 == null)
+ {
+ quantifier1.Comprehension = (Comprehension)this.VisitComprehension(quantifier1.Comprehension, null);
+ }
+ else
+ {
+ quantifier1.Comprehension = (Comprehension)this.VisitComprehension(quantifier1.Comprehension, quantifier2.Comprehension);
+ }
+ return quantifier1;
+ }
+ public virtual Expression VisitComprehension(Comprehension comprehension1, Comprehension comprehension2)
+ {
+ if (comprehension1 == null) return null;
+ if (comprehension2 == null)
+ {
+ comprehension1.BindingsAndFilters = this.VisitExpressionList(comprehension1.BindingsAndFilters, null);
+ comprehension1.Elements = this.VisitExpressionList(comprehension1.Elements, null);
+ }
+ else
+ {
+ comprehension1.BindingsAndFilters = this.VisitExpressionList(comprehension1.BindingsAndFilters, comprehension2.BindingsAndFilters);
+ comprehension1.Elements = this.VisitExpressionList(comprehension1.Elements, comprehension2.Elements);
+ }
+ return comprehension1;
+ }
+ public virtual ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding1, ComprehensionBinding comprehensionBinding2)
+ {
+ if (comprehensionBinding1 == null) return null;
+ if (comprehensionBinding2 == null)
+ {
+ comprehensionBinding1.TargetVariableType = this.VisitTypeReference(comprehensionBinding1.TargetVariableType, null);
+ comprehensionBinding1.TargetVariable = this.VisitTargetExpression(comprehensionBinding1.TargetVariable, null);
+ comprehensionBinding1.SourceEnumerable = this.VisitExpression(comprehensionBinding1.SourceEnumerable, null);
+ }
+ else
+ {
+ comprehensionBinding1.TargetVariableType = this.VisitTypeReference(comprehensionBinding1.TargetVariableType, comprehensionBinding2.TargetVariableType);
+ comprehensionBinding1.TargetVariable = this.VisitTargetExpression(comprehensionBinding1.TargetVariable, comprehensionBinding2.TargetVariable);
+ comprehensionBinding1.SourceEnumerable = this.VisitExpression(comprehensionBinding1.SourceEnumerable, comprehensionBinding2.SourceEnumerable);
+ }
+ return comprehensionBinding1;
+ }
+ public virtual Expression VisitQualifiedIdentifier(QualifiedIdentifier qualifiedIdentifier1, QualifiedIdentifier qualifiedIdentifier2)
+ {
+ if (qualifiedIdentifier1 == null) return null;
+ if (qualifiedIdentifier2 == null)
+ qualifiedIdentifier1.Qualifier = this.VisitExpression(qualifiedIdentifier1.Qualifier, null);
+ else
+ qualifiedIdentifier1.Qualifier = this.VisitExpression(qualifiedIdentifier1.Qualifier, qualifiedIdentifier2.Qualifier);
+ return qualifiedIdentifier1;
+ }
+ public virtual Statement VisitRepeat(Repeat repeat1, Repeat repeat2)
+ {
+ if (repeat1 == null) return null;
+ if (repeat2 == null)
+ {
+ repeat1.Body = this.VisitBlock(repeat1.Body, null);
+ repeat1.Condition = this.VisitExpression(repeat1.Condition, null);
+ }
+ else
+ {
+ repeat1.Body = this.VisitBlock(repeat1.Body, repeat2.Body);
+ repeat1.Condition = this.VisitExpression(repeat1.Condition, repeat2.Condition);
+ }
+ return repeat1;
+ }
+#if ExtendedRuntime
+ public virtual RequiresList VisitRequiresList(RequiresList requires1, RequiresList requires2) {
+ if (requires1 == null) return null;
+ for (int i = 0, n = requires1.Count, m = requires2 == null ? 0 : requires2.Count; i < n; i++) {
+ //^ assert requires2 != null;
+ if (i >= m)
+ requires1[i] = (Requires)this.Visit(requires1[i], null);
+ else
+ requires1[i] = (Requires)this.Visit(requires1[i], requires2[i]);
+ }
+ return requires1;
+ }
+#endif
+ public virtual Statement VisitResourceUse(ResourceUse resourceUse1, ResourceUse resourceUse2)
+ {
+ if (resourceUse1 == null) return null;
+ if (resourceUse2 == null)
+ {
+ resourceUse1.ResourceAcquisition = (Statement)this.Visit(resourceUse1.ResourceAcquisition, null);
+ resourceUse1.Body = this.VisitBlock(resourceUse1.Body, null);
+ }
+ else
+ {
+ resourceUse1.ResourceAcquisition = (Statement)this.Visit(resourceUse1.ResourceAcquisition, resourceUse2.ResourceAcquisition);
+ resourceUse1.Body = this.VisitBlock(resourceUse1.Body, resourceUse2.Body);
+ }
+ return resourceUse1;
+ }
+ public virtual Statement VisitReturn(Return Return1, Return Return2)
+ {
+ if (Return1 == null) return null;
+ if (Return2 == null)
+ Return1.Expression = this.VisitExpression(Return1.Expression, null);
+ else
+ Return1.Expression = this.VisitExpression(Return1.Expression, Return2.Expression);
+ return Return1;
+ }
+ public virtual SecurityAttribute VisitSecurityAttribute(SecurityAttribute attribute1, SecurityAttribute attribute2)
+ {
+ return attribute1;
+ }
+ public virtual SecurityAttributeList VisitSecurityAttributeList(SecurityAttributeList attributes1, SecurityAttributeList attributes2)
+ {
+ if (attributes1 == null) return null;
+ for (int i = 0, n = attributes1.Count, m = attributes2 == null ? 0 : attributes2.Count; i < n; i++)
+ {
+ //^ assert attributes2 != null;
+ if (i >= m)
+ attributes1[i] = this.VisitSecurityAttribute(attributes1[i], null);
+ else
+ attributes1[i] = this.VisitSecurityAttribute(attributes1[i], attributes2[i]);
+ }
+ return attributes1;
+ }
+ public virtual Expression VisitSetterValue(SetterValue value1, SetterValue value2)
+ {
+ return value1;
+ }
+ public virtual StatementList VisitStatementList(StatementList statements1, StatementList statements2)
+ {
+ if (statements1 == null) return null;
+ for (int i = 0, n = statements1.Count, m = statements2 == null ? 0 : statements2.Count; i < n; i++)
+ {
+ //^ assert statements2 != null;
+ if (i >= m)
+ statements1[i] = (Statement)this.Visit(statements1[i], null);
+ else
+ statements1[i] = (Statement)this.Visit(statements1[i], statements2[i]);
+ }
+ return statements1;
+ }
+ public virtual StatementSnippet VisitStatementSnippet(StatementSnippet snippet1, StatementSnippet snippet2)
+ {
+ return snippet1;
+ }
+ public virtual StaticInitializer VisitStaticInitializer(StaticInitializer cons1, StaticInitializer cons2)
+ {
+ return (StaticInitializer)this.VisitMethod(cons1, cons2);
+ }
+ public virtual Struct VisitStruct(Struct Struct1, Struct Struct2)
+ {
+ return (Struct)this.VisitTypeNode(Struct1, Struct2);
+ }
+ public virtual Statement VisitSwitch(Switch Switch1, Switch Switch2)
+ {
+ if (Switch1 == null) return null;
+ if (Switch2 == null)
+ {
+ Switch1.Expression = this.VisitExpression(Switch1.Expression, null);
+ Switch1.Cases = this.VisitSwitchCaseList(Switch1.Cases, null);
+ }
+ else
+ {
+ Switch1.Expression = this.VisitExpression(Switch1.Expression, Switch2.Expression);
+ Switch1.Cases = this.VisitSwitchCaseList(Switch1.Cases, Switch2.Cases);
+ }
+ return Switch1;
+ }
+ public virtual SwitchCase VisitSwitchCase(SwitchCase switchCase1, SwitchCase switchCase2)
+ {
+ if (switchCase1 == null) return null;
+ if (switchCase2 == null)
+ {
+ switchCase1.Label = this.VisitExpression(switchCase1.Label, null);
+ switchCase1.Body = this.VisitBlock(switchCase1.Body, null);
+ }
+ else
+ {
+ switchCase1.Label = this.VisitExpression(switchCase1.Label, switchCase2.Label);
+ switchCase1.Body = this.VisitBlock(switchCase1.Body, switchCase2.Body);
+ }
+ return switchCase1;
+ }
+ public virtual SwitchCaseList VisitSwitchCaseList(SwitchCaseList switchCases1, SwitchCaseList switchCases2)
+ {
+ if (switchCases1 == null) return null;
+ for (int i = 0, n = switchCases1.Count, m = switchCases2 == null ? 0 : switchCases2.Count; i < n; i++)
+ {
+ //^ assert switchCases2 != null;
+ if (i >= m)
+ switchCases1[i] = this.VisitSwitchCase(switchCases1[i], null);
+ else
+ switchCases1[i] = this.VisitSwitchCase(switchCases1[i], switchCases2[i]);
+ }
+ return switchCases1;
+ }
+ public virtual Statement VisitSwitchInstruction(SwitchInstruction switchInstruction1, SwitchInstruction switchInstruction2)
+ {
+ if (switchInstruction1 == null) return null;
+ if (switchInstruction2 == null)
+ switchInstruction1.Expression = this.VisitExpression(switchInstruction1.Expression, null);
+ else
+ switchInstruction1.Expression = this.VisitExpression(switchInstruction1.Expression, switchInstruction2.Expression);
+ return switchInstruction1;
+ }
+ public virtual Statement VisitTypeswitch(Typeswitch Typeswitch1, Typeswitch Typeswitch2)
+ {
+ if (Typeswitch1 == null) return null;
+ if (Typeswitch2 == null)
+ {
+ Typeswitch1.Expression = this.VisitExpression(Typeswitch1.Expression, null);
+ Typeswitch1.Cases = this.VisitTypeswitchCaseList(Typeswitch1.Cases, null);
+ }
+ else
+ {
+ Typeswitch1.Expression = this.VisitExpression(Typeswitch1.Expression, Typeswitch2.Expression);
+ Typeswitch1.Cases = this.VisitTypeswitchCaseList(Typeswitch1.Cases, Typeswitch2.Cases);
+ }
+ return Typeswitch1;
+ }
+ public virtual TypeswitchCase VisitTypeswitchCase(TypeswitchCase typeswitchCase1, TypeswitchCase typeswitchCase2)
+ {
+ if (typeswitchCase1 == null) return null;
+ if (typeswitchCase2 == null)
+ {
+ typeswitchCase1.LabelType = this.VisitTypeReference(typeswitchCase1.LabelType, null);
+ typeswitchCase1.LabelVariable = this.VisitTargetExpression(typeswitchCase1.LabelVariable, null);
+ typeswitchCase1.Body = this.VisitBlock(typeswitchCase1.Body, null);
+ }
+ else
+ {
+ typeswitchCase1.LabelType = this.VisitTypeReference(typeswitchCase1.LabelType, typeswitchCase2.LabelType);
+ typeswitchCase1.LabelVariable = this.VisitTargetExpression(typeswitchCase1.LabelVariable, typeswitchCase2.LabelVariable);
+ typeswitchCase1.Body = this.VisitBlock(typeswitchCase1.Body, typeswitchCase2.Body);
+ }
+ return typeswitchCase1;
+ }
+ public virtual TypeswitchCaseList VisitTypeswitchCaseList(TypeswitchCaseList typeswitchCases1, TypeswitchCaseList typeswitchCases2)
+ {
+ if (typeswitchCases1 == null) return null;
+ for (int i = 0, n = typeswitchCases1.Count, m = typeswitchCases2 == null ? 0 : typeswitchCases2.Count; i < n; i++)
+ {
+ //^ assert typeswitchCases2 != null;
+ if (i >= m)
+ typeswitchCases1[i] = this.VisitTypeswitchCase(typeswitchCases1[i], null);
+ else
+ typeswitchCases1[i] = this.VisitTypeswitchCase(typeswitchCases1[i], typeswitchCases2[i]);
+ }
+ return typeswitchCases1;
+ }
+ public virtual Expression VisitTargetExpression(Expression expression1, Expression expression2)
+ {
+ return this.VisitExpression(expression1, expression2);
+ }
+ public virtual Expression VisitTernaryExpression(TernaryExpression expression1, TernaryExpression expression2)
+ {
+ if (expression1 == null) return null;
+ if (expression2 == null)
+ {
+ expression1.Operand1 = this.VisitExpression(expression1.Operand1, null);
+ expression1.Operand2 = this.VisitExpression(expression1.Operand2, null);
+ expression1.Operand3 = this.VisitExpression(expression1.Operand3, null);
+ }
+ else
+ {
+ expression1.Operand1 = this.VisitExpression(expression1.Operand1, expression2.Operand1);
+ expression1.Operand2 = this.VisitExpression(expression1.Operand2, expression2.Operand2);
+ expression1.Operand3 = this.VisitExpression(expression1.Operand3, expression2.Operand3);
+ }
+ return expression1;
+ }
+ public virtual Expression VisitThis(This This1, This This2)
+ {
+ if (This1 == null) return null;
+ if (This2 == null)
+ This1.Type = this.VisitTypeReference(This1.Type, null);
+ else
+ This1.Type = this.VisitTypeReference(This1.Type, This2.Type);
+ return This1;
+ }
+ public virtual Statement VisitThrow(Throw Throw1, Throw Throw2)
+ {
+ if (Throw1 == null) return null;
+ if (Throw2 == null)
+ Throw1.Expression = this.VisitExpression(Throw1.Expression, null);
+ else
+ Throw1.Expression = this.VisitExpression(Throw1.Expression, Throw2.Expression);
+ return Throw1;
+ }
+ public virtual Statement VisitTry(Try Try1, Try Try2)
+ {
+ if (Try1 == null) return null;
+ if (Try2 == null)
+ {
+ Try1.TryBlock = this.VisitBlock(Try1.TryBlock, null);
+ Try1.Catchers = this.VisitCatchList(Try1.Catchers, null);
+ Try1.Filters = this.VisitFilterList(Try1.Filters, null);
+ Try1.FaultHandlers = this.VisitFaultHandlerList(Try1.FaultHandlers, null);
+ Try1.Finally = (Finally)this.VisitFinally(Try1.Finally, null);
+ }
+ else
+ {
+ Try1.TryBlock = this.VisitBlock(Try1.TryBlock, Try2.TryBlock);
+ Try1.Catchers = this.VisitCatchList(Try1.Catchers, Try2.Catchers);
+ Try1.Filters = this.VisitFilterList(Try1.Filters, Try2.Filters);
+ Try1.FaultHandlers = this.VisitFaultHandlerList(Try1.FaultHandlers, Try2.FaultHandlers);
+ Try1.Finally = (Finally)this.VisitFinally(Try1.Finally, Try2.Finally);
+ }
+ return Try1;
+ }
+#if ExtendedRuntime
+ public virtual TupleType VisitTupleType(TupleType tuple1, TupleType tuple2){
+ return (TupleType)this.VisitTypeNode(tuple1, tuple2);
+ }
+ public virtual TypeAlias VisitTypeAlias(TypeAlias tAlias1, TypeAlias tAlias2){
+ if (tAlias1 == null) return null;
+ if (tAlias2 == null){
+ if (tAlias1.AliasedType is ConstrainedType)
+ //The type alias defines the constrained type, rather than just referencing it
+ tAlias1.AliasedType = this.VisitConstrainedType((ConstrainedType)tAlias1.AliasedType, null);
+ else
+ tAlias1.AliasedType = this.VisitTypeReference(tAlias1.AliasedType, null);
+ }else{
+ if (tAlias1.AliasedType is ConstrainedType)
+ //The type alias defines the constrained type, rather than just referencing it
+ tAlias1.AliasedType = this.VisitConstrainedType((ConstrainedType)tAlias1.AliasedType, tAlias2.AliasedType as ConstrainedType);
+ else
+ tAlias1.AliasedType = this.VisitTypeReference(tAlias1.AliasedType, tAlias2.AliasedType);
+ }
+ return tAlias1;
+ }
+ public virtual TypeIntersection VisitTypeIntersection(TypeIntersection typeIntersection1, TypeIntersection typeIntersection2){
+ return (TypeIntersection)this.VisitTypeNode(typeIntersection1, typeIntersection2);
+ }
+ public virtual TypeContract VisitTypeContract(TypeContract contract1, TypeContract contract2) {
+ if (contract1 == null) return null;
+ if (contract2 == null) {
+ // don't visit contract.DeclaringType
+ // don't visit contract.InheitedContracts
+ contract1.Invariants = this.VisitInvariantList(contract1.Invariants, null);
+ }else{
+ // don't visit contract.DeclaringType
+ // don't visit contract.InheitedContracts
+ contract1.Invariants = this.VisitInvariantList(contract1.Invariants, contract2.Invariants);
+ }
+ return contract1;
+ }
+#endif
+ public virtual TypeMemberSnippet VisitTypeMemberSnippet(TypeMemberSnippet snippet1, TypeMemberSnippet snippet2)
+ {
+ return snippet1;
+ }
+ public virtual TypeModifier VisitTypeModifier(TypeModifier typeModifier1, TypeModifier typeModifier2)
+ {
+ if (typeModifier1 == null) return null;
+ if (typeModifier2 == null)
+ {
+ typeModifier1.Modifier = this.VisitTypeReference(typeModifier1.Modifier, null);
+ typeModifier1.ModifiedType = this.VisitTypeReference(typeModifier1.ModifiedType, null);
+ }
+ else
+ {
+ typeModifier1.Modifier = this.VisitTypeReference(typeModifier1.Modifier, typeModifier2.Modifier);
+ typeModifier1.ModifiedType = this.VisitTypeReference(typeModifier1.ModifiedType, typeModifier2.ModifiedType);
+ }
+ return typeModifier1;
+ }
+ public virtual TypeNode VisitTypeNode(TypeNode typeNode1, TypeNode typeNode2)
+ {
+ if (typeNode1 == null) return null;
+ if (typeNode2 == null)
+ {
+ typeNode1.Attributes = this.VisitAttributeList(typeNode1.Attributes, null);
+ typeNode1.SecurityAttributes = this.VisitSecurityAttributeList(typeNode1.SecurityAttributes, null);
+ Class c = typeNode1 as Class;
+ if (c != null) c.BaseClass = (Class)this.VisitTypeReference(c.BaseClass, null);
+ typeNode1.Interfaces = this.VisitInterfaceReferenceList(typeNode1.Interfaces, null);
+ typeNode1.TemplateArguments = this.VisitTypeReferenceList(typeNode1.TemplateArguments, null);
+ typeNode1.TemplateParameters = this.VisitTypeParameterList(typeNode1.TemplateParameters, null);
+ typeNode1.Members = this.VisitMemberList(typeNode1.Members, null);
+ }
+ else
+ {
+ typeNode1.Attributes = this.VisitAttributeList(typeNode1.Attributes, typeNode2.Attributes);
+ typeNode1.SecurityAttributes = this.VisitSecurityAttributeList(typeNode1.SecurityAttributes, typeNode2.SecurityAttributes);
+ Class c1 = typeNode1 as Class;
+ Class c2 = typeNode2 as Class;
+ if (c1 != null) c1.BaseClass = (Class)this.VisitTypeReference(c1.BaseClass, c2 == null ? null : c2.BaseClass);
+ typeNode1.Interfaces = this.VisitInterfaceReferenceList(typeNode1.Interfaces, typeNode2.Interfaces);
+ typeNode1.TemplateArguments = this.VisitTypeReferenceList(typeNode1.TemplateArguments, typeNode2.TemplateArguments);
+ typeNode1.TemplateParameters = this.VisitTypeParameterList(typeNode1.TemplateParameters, typeNode2.TemplateParameters);
+ typeNode1.Members = this.VisitMemberList(typeNode1.Members, typeNode2.Members);
+ }
+ return typeNode1;
+ }
+ public virtual TypeNodeList VisitTypeNodeList(TypeNodeList types1, TypeNodeList types2)
+ {
+ if (types1 == null) return null;
+ if (types2 == null)
+ {
+ for (int i = 0; i < types1.Count; i++) //Visiting a type may result in a new type being appended to this list
+ types1[i] = (TypeNode)this.Visit(types1[i], null);
+ }
+ else
+ {
+ for (int i = 0; i < types1.Count; i++)
+ { //Visiting a type may result in a new type being appended to this list
+ if (i >= types2.Count)
+ types1[i] = (TypeNode)this.Visit(types1[i], null);
+ else
+ types1[i] = (TypeNode)this.Visit(types1[i], types2[i]);
+ }
+ }
+ return types1;
+ }
+ public virtual TypeNode VisitTypeParameter(TypeNode typeParameter1, TypeNode typeParameter2)
+ {
+ if (typeParameter1 == null) return null;
+ if (typeParameter2 == null)
+ typeParameter1.Interfaces = this.VisitInterfaceReferenceList(typeParameter1.Interfaces, null);
+ else
+ typeParameter1.Interfaces = this.VisitInterfaceReferenceList(typeParameter1.Interfaces, typeParameter2.Interfaces);
+ return typeParameter1;
+ }
+ public virtual TypeNodeList VisitTypeParameterList(TypeNodeList typeParameters1, TypeNodeList typeParameters2)
+ {
+ if (typeParameters1 == null) return null;
+ for (int i = 0, n = typeParameters1.Count, m = typeParameters2 == null ? 0 : typeParameters2.Count; i < n; i++)
+ {
+ //^ assert typeParameters2 != null;
+ if (i >= m)
+ typeParameters1[i] = this.VisitTypeParameter(typeParameters1[i], null);
+ else
+ typeParameters1[i] = this.VisitTypeParameter(typeParameters1[i], typeParameters2[i]);
+ }
+ return typeParameters1;
+ }
+ public virtual TypeNode VisitTypeReference(TypeNode type1, TypeNode type2)
+ {
+ return type1;
+ }
+ public virtual TypeReference VisitTypeReference(TypeReference typeReference1, TypeReference variableDeclaration2)
+ {
+ if (typeReference1 == null) return null;
+ if (variableDeclaration2 == null)
+ {
+ typeReference1.Type = this.VisitTypeReference(typeReference1.Type, null);
+ typeReference1.Expression = this.VisitTypeReference(typeReference1.Expression, null);
+ }
+ else
+ {
+ typeReference1.Type = this.VisitTypeReference(typeReference1.Type, variableDeclaration2.Type);
+ typeReference1.Expression = this.VisitTypeReference(typeReference1.Expression, variableDeclaration2.Expression);
+ }
+ return typeReference1;
+ }
+ public virtual TypeNodeList VisitTypeReferenceList(TypeNodeList typeReferences1, TypeNodeList typeReferences2)
+ {
+ if (typeReferences1 == null) return null;
+ for (int i = 0, n = typeReferences1.Count, m = typeReferences2 == null ? 0 : typeReferences2.Count; i < n; i++)
+ {
+ //^ assert typeReferences2 != null;
+ if (i >= m)
+ typeReferences1[i] = this.VisitTypeReference(typeReferences1[i], null);
+ else
+ typeReferences1[i] = this.VisitTypeReference(typeReferences1[i], typeReferences2[i]);
+ }
+ return typeReferences1;
+ }
+#if ExtendedRuntime
+ public virtual TypeUnion VisitTypeUnion(TypeUnion typeUnion1, TypeUnion typeUnion2){
+ return (TypeUnion)this.VisitTypeNode(typeUnion1, typeUnion2);
+ }
+#endif
+ public virtual Expression VisitUnaryExpression(UnaryExpression unaryExpression1, UnaryExpression unaryExpression2)
+ {
+ if (unaryExpression1 == null) return null;
+ if (unaryExpression2 == null)
+ unaryExpression1.Operand = this.VisitExpression(unaryExpression1.Operand, null);
+ else
+ unaryExpression1.Operand = this.VisitExpression(unaryExpression1.Operand, unaryExpression2.Operand);
+ return unaryExpression1;
+ }
+ public virtual Statement VisitVariableDeclaration(VariableDeclaration variableDeclaration1, VariableDeclaration variableDeclaration2)
+ {
+ if (variableDeclaration1 == null) return null;
+ if (variableDeclaration2 == null)
+ {
+ variableDeclaration1.Type = this.VisitTypeReference(variableDeclaration1.Type, null);
+ variableDeclaration1.Initializer = this.VisitExpression(variableDeclaration1.Initializer, null);
+ }
+ else
+ {
+ variableDeclaration1.Type = this.VisitTypeReference(variableDeclaration1.Type, variableDeclaration2.Type);
+ variableDeclaration1.Initializer = this.VisitExpression(variableDeclaration1.Initializer, variableDeclaration2.Initializer);
+ }
+ return variableDeclaration1;
+ }
+ public virtual UsedNamespace VisitUsedNamespace(UsedNamespace usedNamespace1, UsedNamespace usedNamespace2)
+ {
+ return usedNamespace1;
+ }
+ public virtual UsedNamespaceList VisitUsedNamespaceList(UsedNamespaceList usedNspaces1, UsedNamespaceList usedNspaces2)
+ {
+ if (usedNspaces1 == null) return null;
+ for (int i = 0, n = usedNspaces1.Count, m = usedNspaces2 == null ? 0 : usedNspaces2.Count; i < n; i++)
+ {
+ //^ assert usedNspaces2 != null;
+ if (i >= m)
+ usedNspaces1[i] = this.VisitUsedNamespace(usedNspaces1[i], null);
+ else
+ usedNspaces1[i] = this.VisitUsedNamespace(usedNspaces1[i], usedNspaces2[i]);
+ }
+ return usedNspaces1;
+ }
+ public virtual Statement VisitWhile(While While1, While While2)
+ {
+ if (While1 == null) return null;
+ if (While2 == null)
+ {
+ While1.Invariants = this.VisitExpressionList(While1.Invariants, null);
+ While1.Condition = this.VisitExpression(While1.Condition, null);
+ While1.Body = this.VisitBlock(While1.Body, null);
+ }
+ else
+ {
+ While1.Invariants = this.VisitExpressionList(While1.Invariants, While2.Invariants);
+ While1.Condition = this.VisitExpression(While1.Condition, While2.Condition);
+ While1.Body = this.VisitBlock(While1.Body, While2.Body);
+ }
+ return While1;
+ }
+ public virtual Statement VisitYield(Yield Yield1, Yield Yield2)
+ {
+ if (Yield1 == null) return null;
+ if (Yield2 == null)
+ Yield1.Expression = this.VisitExpression(Yield1.Expression, null);
+ else
+ Yield1.Expression = this.VisitExpression(Yield1.Expression, Yield2.Expression);
+ return Yield1;
+ }
+#if ExtendedRuntime
+ // query nodes
+ public virtual Node VisitQueryAggregate(QueryAggregate qa1, QueryAggregate qa2){
+ if (qa1 == null) return null;
+ if (qa2 == null)
+ qa1.Expression = this.VisitExpression(qa1.Expression, null);
+ else
+ qa1.Expression = this.VisitExpression(qa1.Expression, qa2.Expression);
+ return qa1;
+ }
+ public virtual Node VisitQueryAlias(QueryAlias alias1, QueryAlias alias2){
+ if (alias1 == null) return null;
+ if (alias2 == null)
+ alias1.Expression = this.VisitExpression(alias1.Expression, null);
+ else
+ alias1.Expression = this.VisitExpression(alias1.Expression, alias2.Expression);
+ return alias1;
+ }
+ public virtual Node VisitQueryAxis(QueryAxis axis1, QueryAxis axis2){
+ if (axis1 == null) return null;
+ if (axis2 == null)
+ axis1.Source = this.VisitExpression(axis1.Source, null);
+ else
+ axis1.Source = this.VisitExpression(axis1.Source, axis2.Source);
+ return axis1;
+ }
+ public virtual Node VisitQueryCommit(QueryCommit qc1, QueryCommit qc2){
+ return qc1;
+ }
+ public virtual Node VisitQueryContext(QueryContext context1, QueryContext context2){
+ return context1;
+ }
+ public virtual Node VisitQueryDelete(QueryDelete delete1, QueryDelete delete2){
+ if (delete1 == null) return null;
+ if (delete2 == null){
+ delete1.Source = this.VisitExpression(delete1.Source, null);
+ /*delete1.Target =*/ this.VisitExpression(delete1.Target, null); //REVIEW: why should this not be updated?
+ }else{
+ delete1.Source = this.VisitExpression(delete1.Source, delete2.Source);
+ /*delete1.Target =*/ this.VisitExpression(delete1.Target, delete2.Target); //REVIEW: why should this not be updated?
+ }
+ return delete1;
+ }
+ public virtual Node VisitQueryDifference(QueryDifference diff1, QueryDifference diff2){
+ if (diff1 == null) return null;
+ if (diff2 == null){
+ diff1.LeftSource = this.VisitExpression(diff1.LeftSource, null);
+ diff1.RightSource = this.VisitExpression(diff1.RightSource, null);
+ }else{
+ diff1.LeftSource = this.VisitExpression(diff1.LeftSource, diff2.LeftSource);
+ diff1.RightSource = this.VisitExpression(diff1.RightSource, diff2.RightSource);
+ }
+ return diff1;
+ }
+ public virtual Node VisitQueryDistinct(QueryDistinct distinct1, QueryDistinct distinct2){
+ if (distinct1 == null) return null;
+ if (distinct2 == null)
+ distinct1.Source = this.VisitExpression(distinct1.Source, null);
+ else
+ distinct1.Source = this.VisitExpression(distinct1.Source, distinct2.Source);
+ return distinct1;
+ }
+ public virtual Node VisitQueryExists(QueryExists exists1, QueryExists exists2){
+ if (exists1 == null) return null;
+ if (exists2 == null)
+ exists1.Source = this.VisitExpression(exists1.Source, null);
+ else
+ exists1.Source = this.VisitExpression(exists1.Source, exists2.Source);
+ return exists1;
+ }
+ public virtual Node VisitQueryFilter(QueryFilter filter1, QueryFilter filter2){
+ if (filter1 == null) return null;
+ if (filter2 == null){
+ filter1.Source = this.VisitExpression(filter1.Source, null);
+ filter1.Expression = this.VisitExpression(filter1.Expression, null);
+ }else{
+ filter1.Source = this.VisitExpression(filter1.Source, filter2.Source);
+ filter1.Expression = this.VisitExpression(filter1.Expression, filter2.Expression);
+ }
+ return filter1;
+ }
+ public virtual Node VisitQueryGroupBy(QueryGroupBy groupby1, QueryGroupBy groupby2){
+ if (groupby1 == null) return null;
+ if (groupby2 == null){
+ groupby1.Source = this.VisitExpression(groupby1.Source, null);
+ groupby1.GroupList = this.VisitExpressionList(groupby1.GroupList, null);
+ groupby1.Having = this.VisitExpression(groupby1.Having, null);
+ }else{
+ groupby1.Source = this.VisitExpression(groupby1.Source, groupby2.Source);
+ groupby1.GroupList = this.VisitExpressionList(groupby1.GroupList, groupby2.GroupList);
+ groupby1.Having = this.VisitExpression(groupby1.Having, groupby2.Having);
+ }
+ return groupby1;
+ }
+ public virtual Statement VisitQueryGeneratedType(QueryGeneratedType qgt1, QueryGeneratedType qgt2){
+ return qgt1;
+ }
+ public virtual Node VisitQueryInsert(QueryInsert insert1, QueryInsert insert2){
+ if (insert1 == null) return null;
+ if (insert2 == null){
+ insert1.Location = this.VisitExpression(insert1.Location, null);
+ insert1.HintList = this.VisitExpressionList(insert1.HintList, null);
+ insert1.InsertList = this.VisitExpressionList(insert1.InsertList, null);
+ }else{
+ insert1.Location = this.VisitExpression(insert1.Location, insert2.Location);
+ insert1.HintList = this.VisitExpressionList(insert1.HintList, insert2.HintList);
+ insert1.InsertList = this.VisitExpressionList(insert1.InsertList, insert2.InsertList);
+ }
+ return insert1;
+ }
+ public virtual Node VisitQueryIntersection(QueryIntersection intersection1, QueryIntersection intersection2){
+ if (intersection1 == null) return null;
+ if (intersection2 == null){
+ intersection1.LeftSource = this.VisitExpression(intersection1.LeftSource, null);
+ intersection1.RightSource = this.VisitExpression(intersection1.RightSource, null);
+ intersection1.Type = intersection1.LeftSource == null ? null : intersection1.LeftSource.Type;
+ }else{
+ intersection1.LeftSource = this.VisitExpression(intersection1.LeftSource, intersection2.LeftSource);
+ intersection1.RightSource = this.VisitExpression(intersection1.RightSource, intersection2.RightSource);
+ intersection1.Type = intersection1.LeftSource == null ? null : intersection1.LeftSource.Type;
+ }
+ return intersection1;
+ }
+ public virtual Node VisitQueryIterator(QueryIterator xiterator1, QueryIterator xiterator2){
+ if (xiterator1 == null) return null;
+ if (xiterator2 == null){
+ xiterator1.Expression = this.VisitExpression(xiterator1.Expression, null);
+ xiterator1.HintList = this.VisitExpressionList(xiterator1.HintList, null);
+ }else{
+ xiterator1.Expression = this.VisitExpression(xiterator1.Expression, xiterator2.Expression);
+ xiterator1.HintList = this.VisitExpressionList(xiterator1.HintList, xiterator2.HintList);
+ }
+ return xiterator1;
+ }
+ public virtual Node VisitQueryJoin(QueryJoin join1, QueryJoin join2){
+ if (join1 == null) return null;
+ if (join2 == null){
+ join1.LeftOperand = this.VisitExpression(join1.LeftOperand, null);
+ join1.RightOperand = this.VisitExpression(join1.RightOperand, null);
+ join1.JoinExpression = this.VisitExpression(join1.JoinExpression, null);
+ }else{
+ join1.LeftOperand = this.VisitExpression(join1.LeftOperand, join2.LeftOperand);
+ join1.RightOperand = this.VisitExpression(join1.RightOperand, join2.RightOperand);
+ join1.JoinExpression = this.VisitExpression(join1.JoinExpression, join2.JoinExpression);
+ }
+ return join1;
+ }
+ public virtual Node VisitQueryLimit(QueryLimit limit1, QueryLimit limit2){
+ if (limit1 == null) return null;
+ if (limit2 == null){
+ limit1.Source = this.VisitExpression(limit1.Source, null);
+ limit1.Expression = this.VisitExpression(limit1.Expression, null);
+ }else{
+ limit1.Source = this.VisitExpression(limit1.Source, limit2.Source);
+ limit1.Expression = this.VisitExpression(limit1.Expression, limit2.Expression);
+ }
+ return limit1;
+ }
+ public virtual Node VisitQueryOrderBy(QueryOrderBy orderby1, QueryOrderBy orderby2){
+ if (orderby1 == null) return null;
+ if (orderby2 == null){
+ orderby1.Source = this.VisitExpression(orderby1.Source, null);
+ orderby1.OrderList = this.VisitExpressionList(orderby1.OrderList, null);
+ }else{
+ orderby1.Source = this.VisitExpression(orderby1.Source, orderby2.Source);
+ orderby1.OrderList = this.VisitExpressionList(orderby1.OrderList, orderby2.OrderList);
+ }
+ return orderby1;
+ }
+ public virtual Node VisitQueryOrderItem(QueryOrderItem item1, QueryOrderItem item2){
+ if (item1 == null) return null;
+ if (item2 == null)
+ item1.Expression = this.VisitExpression(item1.Expression, null);
+ else
+ item1.Expression = this.VisitExpression(item1.Expression, item2.Expression);
+ return item1;
+ }
+ public virtual Node VisitQueryPosition(QueryPosition position1, QueryPosition position2){
+ return position1;
+ }
+ public virtual Node VisitQueryProject(QueryProject project1, QueryProject project2){
+ if (project1 == null) return null;
+ if (project2 == null){
+ project1.Source = this.VisitExpression(project1.Source, null);
+ project1.ProjectionList = this.VisitExpressionList(project1.ProjectionList, null);
+ }else{
+ project1.Source = this.VisitExpression(project1.Source, project2.Source);
+ project1.ProjectionList = this.VisitExpressionList(project1.ProjectionList, project2.ProjectionList);
+ }
+ return project1;
+ }
+ public virtual Node VisitQueryRollback(QueryRollback qr1, QueryRollback qr2){
+ return qr1;
+ }
+ public virtual Node VisitQueryQuantifier(QueryQuantifier qq1, QueryQuantifier qq2){
+ if (qq1 == null) return null;
+ if (qq2 == null)
+ qq1.Expression = this.VisitExpression(qq1.Expression, null);
+ else
+ qq1.Expression = this.VisitExpression(qq1.Expression, qq2.Expression);
+ return qq1;
+ }
+ public virtual Node VisitQueryQuantifiedExpression(QueryQuantifiedExpression qqe1, QueryQuantifiedExpression qqe2){
+ if (qqe1 == null) return null;
+ if (qqe2 == null)
+ qqe1.Expression = this.VisitExpression(qqe1.Expression, null);
+ else
+ qqe1.Expression = this.VisitExpression(qqe1.Expression, qqe2.Expression);
+ return qqe1;
+ }
+ public virtual Node VisitQuerySelect(QuerySelect select1, QuerySelect select2){
+ if (select1 == null) return null;
+ if (select2 == null)
+ select1.Source = this.VisitExpression(select1.Source, null);
+ else
+ select1.Source = this.VisitExpression(select1.Source, select2.Source);
+ return select1;
+ }
+ public virtual Node VisitQuerySingleton(QuerySingleton singleton1, QuerySingleton singleton2){
+ if (singleton1 == null) return null;
+ if (singleton2 == null)
+ singleton1.Source = this.VisitExpression(singleton1.Source, null);
+ else
+ singleton1.Source = this.VisitExpression(singleton1.Source, singleton2.Source);
+ return singleton1;
+ }
+ public virtual Node VisitQueryTransact(QueryTransact qt1, QueryTransact qt2){
+ if (qt1 == null) return null;
+ if (qt2 == null){
+ qt1.Source = this.VisitExpression(qt1.Source, null);
+ qt1.Body = this.VisitBlock(qt1.Body, null);
+ qt1.CommitBody = this.VisitBlock(qt1.CommitBody, null);
+ qt1.RollbackBody = this.VisitBlock(qt1.RollbackBody, null);
+ }else{
+ qt1.Source = this.VisitExpression(qt1.Source, qt2.Source);
+ qt1.Body = this.VisitBlock(qt1.Body, qt2.Body);
+ qt1.CommitBody = this.VisitBlock(qt1.CommitBody, qt2.CommitBody);
+ qt1.RollbackBody = this.VisitBlock(qt1.RollbackBody, qt2.RollbackBody);
+ }
+ return qt1;
+ }
+ public virtual Node VisitQueryTypeFilter(QueryTypeFilter filter1, QueryTypeFilter filter2){
+ if (filter1 == null) return null;
+ if (filter2 == null)
+ filter1.Source = this.VisitExpression(filter1.Source, null);
+ else
+ filter1.Source = this.VisitExpression(filter1.Source, filter2.Source);
+ return filter1;
+ }
+ public virtual Node VisitQueryUnion(QueryUnion union1, QueryUnion union2){
+ if (union1 == null) return null;
+ if (union2 == null){
+ union1.LeftSource = this.VisitExpression(union1.LeftSource, null);
+ union1.RightSource = this.VisitExpression(union1.RightSource, null);
+ }else{
+ union1.LeftSource = this.VisitExpression(union1.LeftSource, union2.LeftSource);
+ union1.RightSource = this.VisitExpression(union1.RightSource, union2.RightSource);
+ }
+ return union1;
+ }
+ public virtual Node VisitQueryUpdate(QueryUpdate update1, QueryUpdate update2){
+ if (update1 == null) return null;
+ if (update2 == null){
+ update1.Source = this.VisitExpression(update1.Source, null);
+ update1.UpdateList = this.VisitExpressionList(update1.UpdateList, null);
+ }else{
+ update1.Source = this.VisitExpression(update1.Source, update2.Source);
+ update1.UpdateList = this.VisitExpressionList(update1.UpdateList, update2.UpdateList);
+ }
+ return update1;
+ }
+ public virtual Node VisitQueryYielder(QueryYielder yielder1, QueryYielder yielder2){
+ if (yielder1 == null) return null;
+ if (yielder2 == null){
+ yielder1.Source = this.VisitExpression(yielder1.Source, null);
+ yielder1.Target = this.VisitExpression(yielder1.Target, null);
+ yielder1.Body = this.VisitBlock(yielder1.Body, null);
+ }else{
+ yielder1.Source = this.VisitExpression(yielder1.Source, yielder2.Source);
+ yielder1.Target = this.VisitExpression(yielder1.Target, yielder2.Target);
+ yielder1.Body = this.VisitBlock(yielder1.Body, yielder2.Body);
+ }
+ return yielder1;
+ }
+#endif
+ }
+}
+#endif