5 // Alexander Chebaturkin (chebaturkin@gmail.com)
7 // Copyright (C) 2011 Alexander Chebaturkin
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.Collections.Generic;
31 namespace Mono.CodeContracts.Static.AST.Visitors {
33 public virtual void Visit (Node node)
37 switch (node.NodeType) {
65 VisitBinaryExpression ((BinaryExpression) node);
71 case NodeType.MethodCall:
72 VisitMethodCall ((MethodCall) node);
75 case NodeType.Conv_I1:
76 case NodeType.Conv_I2:
77 case NodeType.Conv_I8:
78 case NodeType.Conv_I4:
79 case NodeType.Conv_R4:
80 case NodeType.Conv_R8:
83 case NodeType.LogicalNot:
84 VisitUnaryExpression ((UnaryExpression) node);
86 case NodeType.Literal:
87 VisitLiteral ((Literal) node);
90 VisitThis ((This) node);
93 VisitBlock ((Block) node);
96 VisitBranch ((Branch) node);
99 VisitReturn ((Return) node);
101 case NodeType.AssignmentStatement:
102 VisitAssignmentStatement ((AssignmentStatement) node);
105 VisitLocal ((Local) node);
107 case NodeType.Parameter:
108 VisitParameter ((Parameter) node);
110 case NodeType.ExpressionStatement:
111 VisitExpressionStatement ((ExpressionStatement) node);
113 case NodeType.Method:
114 VisitMethod ((Method) node);
116 case NodeType.MethodContract:
117 VisitMethodContract ((MethodContract) node);
119 case NodeType.Requires:
120 VisitRequires ((Requires) node);
122 case NodeType.Ensures:
123 VisitEnsures ((Ensures) node);
125 case NodeType.TypeNode:
126 VisitTypeNode ((TypeNode) node);
128 case NodeType.Assembly:
129 VisitAssembly ((AssemblyNode) node);
131 case NodeType.Module:
132 VisitModule ((Module) node);
134 case NodeType.MemberBinding:
135 VisitMemberBinding ((MemberBinding) node);
137 case NodeType.Construct:
138 VisitConstruct ((Construct) node);
141 VisitUnknownNodeType (node);
146 public virtual void VisitAssembly (AssemblyNode node)
151 VisitModuleList (node.Modules);
154 public virtual void VisitModuleList (IEnumerable<Module> node)
159 foreach (Module module in node)
160 VisitModule (module);
163 public virtual void VisitModule (Module node)
168 VisitTypeNodeList (node.Types);
171 public virtual void VisitAssignmentStatement (AssignmentStatement node)
175 VisitTargetExpression (node.Target);
176 VisitExpression (node.Source);
179 public virtual void VisitBinaryExpression (BinaryExpression node)
184 VisitExpression (node.Left);
185 VisitExpression (node.Right);
188 public virtual void VisitBlock (Block node)
193 VisitStatementList (node.Statements);
196 public virtual void VisitStatementList (List<Statement> node)
201 for (int i = 0; i < node.Count; i++)
205 public virtual void VisitBranch (Branch node)
210 VisitExpression (node.Condition);
213 public virtual void VisitConstruct (Construct node)
218 VisitExpression (node.Constructor);
219 VisitExpressionList (node.Arguments);
222 public virtual void VisitExpressionList (List<Expression> list)
227 for (int i = 0; i < list.Count; ++i)
231 public virtual void VisitEnsures (Ensures node)
236 VisitExpression (node.Assertion);
237 VisitExpression (node.UserMessage);
240 public virtual void VisitExpression (Expression node)
245 //todo: maybe there will be something
248 public virtual void VisitExpressionStatement (ExpressionStatement node)
253 VisitExpression (node.Expression);
256 public virtual void VisitLiteral (Literal node)
260 public virtual void VisitLocal (Local node)
265 VisitTypeNode (node.Type);
267 //todo: maybe there should be something else
270 public virtual void VisitMemberBinding (MemberBinding node)
275 VisitExpression (node.TargetObject);
278 public virtual void VisitMethod (Method node)
283 VisitTypeNode (node.ReturnType);
284 VisitParameterList (node.Parameters);
285 VisitMethodContract (node.MethodContract);
286 VisitBlock (node.Body);
289 public virtual void VisitParameterList (List<Parameter> node)
294 for (int i = 0; i < node.Count; i++)
295 VisitParameter (node [i]);
298 public virtual void VisitMethodCall (MethodCall node)
303 VisitExpression (node.Callee);
304 VisitExpressionList (node.Arguments);
307 public virtual void VisitMethodContract (MethodContract node)
312 VisitRequiresList (node.Requires);
313 VisitEnsuresList (node.Ensures);
316 public virtual void VisitEnsuresList (List<Ensures> node)
321 for (int i = 0; i < node.Count; i++)
325 public virtual void VisitRequiresList (List<Requires> node)
330 for (int i = 0; i < node.Count; i++)
334 public virtual void VisitParameter (Parameter node)
339 VisitTypeNode (node.Type);
341 //todo: there may be something else
344 public virtual void VisitRequires (Requires node)
349 VisitExpression (node.Assertion);
350 VisitExpression (node.UserMessage);
353 public virtual void VisitReturn (Return node)
358 VisitExpression (node.Expression);
361 public virtual void VisitTargetExpression (Expression node)
363 VisitExpression (node);
366 public virtual void VisitThis (This node)
371 VisitTypeNode (node.Type);
374 public virtual void VisitTypeNode (TypeNode node)
379 var clazz = node as Class;
381 VisitTypeNode (clazz.BaseType);
383 VisitPropertiesList (node.Properties);
384 VisitMethodsList (node.Methods);
385 VisitTypeNodeList (node.NestedTypes);
388 public virtual void VisitPropertiesList (List<Property> node)
393 for (int i = 0; i < node.Count; i++) {
394 Property property = node [i];
395 if (property != null)
400 public virtual void VisitMethodsList (List<Method> node)
405 for (int i = 0; i < node.Count; i++) {
406 Method method = node [i];
412 public virtual void VisitTypeNodeList (List<TypeNode> node)
417 for (int i = 0; i < node.Count; i++) {
418 TypeNode typeNode = node [i];
419 if (typeNode != null)
424 public virtual void VisitUnaryExpression (UnaryExpression node)
429 VisitExpression (node.Operand);
432 public virtual void VisitUnknownNodeType (Node node)