2 // DefaultNodeVisitor.cs
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 {
32 class DefaultNodeVisitor : NodeVisitor {
33 #region Overrides of NodeVisitor
34 public override Node Visit (Node node)
38 switch (node.NodeType) {
66 return VisitBinaryExpression ((BinaryExpression) node);
71 case NodeType.MethodCall:
72 return 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 return VisitUnaryExpression ((UnaryExpression) node);
86 case NodeType.Literal:
87 return VisitLiteral ((Literal) node);
89 return VisitThis ((This) node);
92 return VisitBlock ((Block) node);
94 return VisitBranch ((Branch) node);
96 return VisitReturn ((Return) node);
97 case NodeType.AssignmentStatement:
98 return VisitAssignmentStatement ((AssignmentStatement) node);
100 return VisitLocal ((Local) node);
101 case NodeType.Parameter:
102 return VisitParameter ((Parameter) node);
103 case NodeType.ExpressionStatement:
104 return VisitExpressionStatement ((ExpressionStatement) node);
105 case NodeType.Method:
106 return VisitMethod ((Method) node);
107 case NodeType.MethodContract:
108 return VisitMethodContract ((MethodContract) node);
109 case NodeType.Requires:
110 return VisitRequires ((Requires) node);
111 case NodeType.Ensures:
112 return VisitEnsures ((Ensures) node);
113 case NodeType.TypeNode:
114 return VisitTypeNode ((TypeNode) node);
115 case NodeType.Assembly:
116 return VisitAssembly ((AssemblyNode) node);
117 case NodeType.Module:
118 return VisitModule ((Module) node);
119 case NodeType.MemberBinding:
120 return VisitMemberBinding ((MemberBinding) node);
121 case NodeType.Construct:
122 return VisitConstruct ((Construct) node);
125 return VisitUnknownNodeType (node);
128 public virtual AssemblyNode VisitAssembly (AssemblyNode node)
133 VisitModuleList (node.Modules);
139 public virtual void VisitModuleList (IEnumerable<Module> node)
144 foreach (Module module in node)
145 VisitModule (module);
148 private Module VisitModule (Module node)
153 VisitTypeNodeList (node.Types);
158 public virtual Statement VisitAssignmentStatement (AssignmentStatement node)
162 node.Target = VisitTargetExpression (node.Target);
163 node.Source = VisitExpression (node.Source);
168 public virtual Expression VisitBinaryExpression (BinaryExpression node)
173 node.Operand1 = VisitExpression (node.Operand1);
174 node.Operand2 = VisitExpression (node.Operand2);
179 public virtual Block VisitBlock (Block node)
184 node.Statements = VisitStatementList (node.Statements);
189 public virtual List<Statement> VisitStatementList (List<Statement> node)
194 for (int i = 0; i < node.Count; i++)
195 node [i] = (Statement) Visit (node [i]);
200 public virtual Statement VisitBranch (Branch node)
205 node.Condition = VisitExpression (node.Condition);
210 public virtual Expression VisitConstruct (Construct node)
215 node.Constructor = VisitExpression (node.Constructor);
216 node.Arguments = VisitExpressionList (node.Arguments);
221 public virtual Ensures VisitEnsures (Ensures node)
226 node.Assertion = VisitExpression (node.Assertion);
227 node.UserMessage = VisitExpression (node.UserMessage);
232 public virtual Expression VisitExpression (Expression node)
240 public virtual Statement VisitExpressionStatement (ExpressionStatement node)
245 node.Expression = VisitExpression (node.Expression);
250 public virtual Expression VisitLiteral (Literal node)
255 public virtual Expression VisitLocal (Local node)
260 node.Type = VisitTypeNode (node.Type);
262 //todo: maybe there should be something else
267 public virtual Expression VisitMemberBinding (MemberBinding node)
272 node.TargetObject = VisitExpression (node.TargetObject);
277 public virtual Method VisitMethod (Method node)
282 node.ReturnType = VisitTypeNode (node.ReturnType);
283 node.Parameters = VisitParameterList (node.Parameters);
284 node.MethodContract = VisitMethodContract (node.MethodContract);
285 node.Body = VisitBlock (node.Body);
290 public virtual List<Parameter> VisitParameterList (List<Parameter> node)
295 for (int i = 0; i < node.Count; i++)
296 node [i] = VisitParameter (node [i]);
301 public virtual Expression VisitMethodCall (MethodCall node)
306 node.Callee = VisitExpression (node.Callee);
307 node.Arguments = VisitExpressionList (node.Arguments);
312 public virtual MethodContract VisitMethodContract (MethodContract node)
317 node.Requires = VisitRequiresList (node.Requires);
318 node.Ensures = VisitEnsuresList (node.Ensures);
323 public virtual List<Ensures> VisitEnsuresList (List<Ensures> node)
328 for (int i = 0; i < node.Count; i++)
329 node [i] = (Ensures) Visit (node [i]);
334 public virtual List<Requires> VisitRequiresList (List<Requires> node)
339 for (int i = 0; i < node.Count; i++)
340 node [i] = (Requires) Visit (node [i]);
345 public virtual Parameter VisitParameter (Parameter node)
350 node.Type = VisitTypeNode (node.Type);
352 //todo: there may be something else
357 public virtual Requires VisitRequires (Requires node)
362 node.Assertion = VisitExpression (node.Assertion);
363 node.UserMessage = VisitExpression (node.UserMessage);
368 public virtual Return VisitReturn (Return node)
373 node.Expression = VisitExpression (node.Expression);
378 public virtual Expression VisitTargetExpression (Expression node)
380 return VisitExpression (node);
383 public virtual Expression VisitThis (This node)
388 node.Type = VisitTypeNode (node.Type);
393 public virtual TypeNode VisitTypeNode (TypeNode node)
398 var clazz = node as Class;
400 clazz.BaseType = VisitTypeNode (clazz.BaseType);
402 VisitPropertiesList (node.Properties);
403 VisitMethodsList (node.Methods);
404 VisitTypeNodeList (node.NestedTypes);
409 public virtual List<Property> VisitPropertiesList (List<Property> node)
414 for (int i = 0; i < node.Count; i++) {
415 Property property = node [i];
416 if (property != null)
417 node [i] = (Property) Visit (node [i]);
423 public virtual List<Method> VisitMethodsList (List<Method> node)
428 for (int i = 0; i < node.Count; i++) {
429 Method method = node [i];
431 node [i] = (Method) Visit (node [i]);
437 public virtual List<TypeNode> VisitTypeNodeList (List<TypeNode> node)
442 for (int i = 0; i < node.Count; i++) {
443 TypeNode method = node [i];
445 node [i] = (TypeNode) Visit (node [i]);
451 public virtual Expression VisitUnaryExpression (UnaryExpression node)
456 node.Operand = VisitExpression (node.Operand);
461 public virtual Node VisitUnknownNodeType (Node node)