The base architecture for code-contracts analysis
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Static.AST.Visitors / ILVisitorBase.cs
1 // 
2 // ILVisitorBase.cs
3 // 
4 // Authors:
5 //      Alexander Chebaturkin (chebaturkin@gmail.com)
6 // 
7 // Copyright (C) 2011 Alexander Chebaturkin
8 // 
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:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //  
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.
27 // 
28
29 using System.Collections.Generic;
30 using Mono.CodeContracts.Static.ControlFlow;
31 using Mono.CodeContracts.Static.DataStructures;
32
33 namespace Mono.CodeContracts.Static.AST.Visitors
34 {
35         /// <summary>
36         /// Abstract base implementation of ILVisitor
37         /// </summary>
38         /// <remarks> Each (non-overriden) operation returns DefaultVisit(pc, data) </remarks>
39         abstract class ILVisitorBase<Label, Source, Dest, Data, Result>
40                 : IILVisitor<Label, Source, Dest, Data, Result>
41         {
42                 public abstract Result DefaultVisit(Label pc, Data data);
43
44                 #region Implementation of IExpressionILVisitor<Label,Type,Source,Dest,Data,Result>
45                 public virtual Result Binary(Label pc, BinaryOperator bop, Dest dest, Source operand1, Source operand2, Data data)
46                 {
47                         return DefaultVisit (pc, data);
48                 }
49
50                 public virtual Result Isinst(Label pc, TypeNode type, Dest dest, Source obj, Data data)
51                 {
52                         return DefaultVisit (pc, data);
53                 }
54
55                 public virtual Result LoadNull(Label pc, Dest dest, Data polarity)
56                 {
57                         return DefaultVisit (pc, polarity);
58                 }
59
60                 public virtual Result LoadConst(Label pc, TypeNode type, object constant, Dest dest, Data data)
61                 {
62                         return DefaultVisit (pc, data);
63                 }
64
65                 public virtual Result Sizeof(Label pc, TypeNode type, Dest dest, Data data)
66                 {
67                         return DefaultVisit (pc, data);
68                 }
69
70                 public virtual Result Unary(Label pc, UnaryOperator uop, bool unsigned, Dest dest, Source source, Data data)
71                 {
72                         return DefaultVisit (pc, data);
73                 }
74                 #endregion
75
76                 #region Implementation of IILVisitor<Label,Local,Parameter,Method,Field,Type,Source,Dest,Data,Result>
77                 public virtual Result Arglist(Label pc, Dest dest, Data data)
78                 {
79                         return DefaultVisit (pc, data);
80                 }
81
82                 public virtual Result Branch(Label pc, Label target, bool leavesExceptionBlock, Data data)
83                 {
84                         return DefaultVisit (pc, data);
85                 }
86
87                 public virtual Result BranchCond(Label pc, Label target, BranchOperator bop, Source value1, Source value2, Data data)
88                 {
89                         return DefaultVisit (pc, data);
90                 }
91
92                 public virtual Result BranchTrue(Label pc, Label target, Source cond, Data data)
93                 {
94                         return DefaultVisit (pc, data);
95                 }
96
97                 public virtual Result BranchFalse(Label pc, Label target, Source cond, Data data)
98                 {
99                         return DefaultVisit (pc, data);
100                 }
101
102                 public virtual Result Break(Label pc, Data data)
103                 {
104                         return DefaultVisit (pc, data);
105                 }
106
107                 public virtual Result Call<TypeList, ArgList>(Label pc, Method method, bool virt, TypeList extraVarargs, Dest dest, ArgList args, Data data)
108                         where TypeList : IIndexable<TypeNode> where ArgList : IIndexable<Source>
109                 {
110                         return DefaultVisit (pc, data);
111                 }
112
113                 public virtual Result Calli<TypeList, ArgList>(Label pc, TypeNode returnType, TypeList argTypes, bool instance, Dest dest, Source functionPointer, ArgList args, Data data)
114                         where TypeList : IIndexable<TypeNode> where ArgList : IIndexable<Source>
115                 {
116                         return DefaultVisit (pc, data);
117                 }
118
119                 public virtual Result CheckFinite(Label pc, Dest dest, Source source, Data data)
120                 {
121                         return DefaultVisit (pc, data);
122                 }
123
124                 public virtual Result CopyBlock(Label pc, Source destAddress, Source srcAddress, Source len, Data data)
125                 {
126                         return DefaultVisit (pc, data);
127                 }
128
129                 public virtual Result EndFilter(Label pc, Source decision, Data data)
130                 {
131                         return DefaultVisit (pc, data);
132                 }
133
134                 public virtual Result EndFinally(Label pc, Data data)
135                 {
136                         return DefaultVisit (pc, data);
137                 }
138
139                 public virtual Result Jmp(Label pc, Method method, Data data)
140                 {
141                         return DefaultVisit (pc, data);
142                 }
143
144                 public virtual Result LoadArg(Label pc, Parameter param, bool isOld, Dest dest, Data data)
145                 {
146                         return DefaultVisit (pc, data);
147                 }
148
149                 public virtual Result LoadArgAddress(Label pc, Parameter param, bool isOld, Dest dest, Data data)
150                 {
151                         return DefaultVisit (pc, data);
152                 }
153
154                 public virtual Result LoadLocal(Label pc, Local local, Dest dest, Data data)
155                 {
156                         return DefaultVisit (pc, data);
157                 }
158
159                 public virtual Result LoadLocalAddress(Label pc, Local local, Dest dest, Data data)
160                 {
161                         return DefaultVisit (pc, data);
162                 }
163
164                 public virtual Result Nop(Label pc, Data data)
165                 {
166                         return DefaultVisit (pc, data);
167                 }
168
169                 public virtual Result Pop(Label pc, Source source, Data data)
170                 {
171                         return DefaultVisit (pc, data);
172                 }
173
174                 public virtual Result Return(Label pc, Source source, Data data)
175                 {
176                         return DefaultVisit (pc, data);
177                 }
178
179                 public virtual Result StoreArg(Label pc, Parameter param, Source source, Data data)
180                 {
181                         return DefaultVisit (pc, data);
182                 }
183
184                 public virtual Result StoreLocal(Label pc, Local local, Source source, Data data)
185                 {
186                         return DefaultVisit (pc, data);
187                 }
188
189                 public virtual Result Switch(Label pc, TypeNode type, IEnumerable<Pair<object, Label>> cases, Source value, Data data)
190                 {
191                         return DefaultVisit (pc, data);
192                 }
193
194                 public virtual Result Box(Label pc, TypeNode type, Dest dest, Source source, Data data)
195                 {
196                         return DefaultVisit (pc, data);
197                 }
198
199                 public virtual Result ConstrainedCallvirt<TypeList, ArgList>(Label pc, Method method, TypeNode constraint, TypeList extraVarargs, Dest dest, ArgList args, Data data)
200                         where TypeList : IIndexable<TypeNode>
201                         where ArgList : IIndexable<Source>
202                 {
203                         return DefaultVisit (pc, data);
204                 }
205
206                 public virtual Result CastClass(Label pc, TypeNode type, Dest dest, Source obj, Data data)
207                 {
208                         return DefaultVisit (pc, data);
209                 }
210
211                 public virtual Result CopyObj(Label pc, TypeNode type, Source destPtr, Source sourcePtr, Data data)
212                 {
213                         return DefaultVisit (pc, data);
214                 }
215
216                 public virtual Result Initobj(Label pc, TypeNode type, Source ptr, Data data)
217                 {
218                         return DefaultVisit (pc, data);
219                 }
220
221                 public virtual Result LoadElement(Label pc, TypeNode type, Dest dest, Source array, Source index, Data data)
222                 {
223                         return DefaultVisit (pc, data);
224                 }
225
226                 public virtual Result LoadField(Label pc, Field field, Dest dest, Source obj, Data data)
227                 {
228                         return DefaultVisit (pc, data);
229                 }
230
231                 public virtual Result LoadFieldAddress(Label pc, Field field, Dest dest, Source obj, Data data)
232                 {
233                         return DefaultVisit (pc, data);
234                 }
235
236                 public virtual Result LoadLength(Label pc, Dest dest, Source array, Data data)
237                 {
238                         return DefaultVisit (pc, data);
239                 }
240
241                 public virtual Result LoadStaticField(Label pc, Field field, Dest dest, Data data)
242                 {
243                         return DefaultVisit (pc, data);
244                 }
245
246                 public virtual Result LoadStaticFieldAddress(Label pc, Field field, Dest dest, Data data)
247                 {
248                         return DefaultVisit (pc, data);
249                 }
250
251                 public virtual Result LoadTypeToken(Label pc, TypeNode type, Dest dest, Data data)
252                 {
253                         return DefaultVisit (pc, data);
254                 }
255
256                 public virtual Result LoadFieldToken(Label pc, Field field, Dest dest, Data data)
257                 {
258                         return DefaultVisit (pc, data);
259                 }
260
261                 public virtual Result LoadMethodToken(Label pc, Method method, Dest dest, Data data)
262                 {
263                         return DefaultVisit (pc, data);
264                 }
265
266                 public virtual Result NewArray<ArgList>(Label pc, TypeNode type, Dest dest, ArgList lengths, Data data) 
267                         where ArgList : IIndexable<Source>
268                 {
269                         return DefaultVisit (pc, data);
270                 }
271
272                 public virtual Result NewObj<ArgList>(Label pc, Method ctor, Dest dest, ArgList args, Data data) 
273                         where ArgList : IIndexable<Source>
274                 {
275                         return DefaultVisit (pc, data);
276                 }
277
278                 public virtual Result MkRefAny(Label pc, TypeNode type, Dest dest, Source obj, Data data)
279                 {
280                         return DefaultVisit (pc, data);
281                 }
282
283                 public virtual Result RefAnyType(Label pc, Dest dest, Source source, Data data)
284                 {
285                         return DefaultVisit (pc, data);
286                 }
287
288                 public virtual Result RefAnyVal(Label pc, TypeNode type, Dest dest, Source source, Data data)
289                 {
290                         return DefaultVisit (pc, data);
291                 }
292
293                 public virtual Result Rethrow(Label pc, Data data)
294                 {
295                         return DefaultVisit (pc, data);
296                 }
297
298                 public virtual Result StoreElement(Label pc, TypeNode type, Source array, Source index, Source value, Data data)
299                 {
300                         return DefaultVisit (pc, data);
301                 }
302
303                 public virtual Result StoreField(Label pc, Field field, Source obj, Source value, Data data)
304                 {
305                         return DefaultVisit (pc, data);
306                 }
307
308                 public virtual Result StoreStaticField(Label pc, Field field, Source value, Data data)
309                 {
310                         return DefaultVisit (pc, data);
311                 }
312
313                 public virtual Result Throw(Label pc, Source exception, Data data)
314                 {
315                         return DefaultVisit (pc, data);
316                 }
317
318                 public virtual Result Unbox(Label pc, TypeNode type, Dest dest, Source obj, Data data)
319                 {
320                         return DefaultVisit (pc, data);
321                 }
322
323                 public virtual Result UnboxAny(Label pc, TypeNode type, Dest dest, Source obj, Data data)
324                 {
325                         return DefaultVisit (pc, data);
326                 }
327                 #endregion
328
329                 #region Implementation of ISyntheticILVisitor<Label,Method,Field,Type,Source,Dest,Data,Result>
330                 public virtual Result Entry(Label pc, Method method, Data data)
331                 {
332                         return DefaultVisit (pc, data);
333                 }
334
335                 public virtual Result Assume(Label pc, EdgeTag tag, Source condition, Data data)
336                 {
337                         return DefaultVisit (pc, data);
338                 }
339
340                 public virtual Result Assert(Label pc, EdgeTag tag, Source condition, Data data)
341                 {
342                         return DefaultVisit (pc, data);
343                 }
344
345                 public virtual Result BeginOld(Label pc, Label matchingEnd, Data data)
346                 {
347                         return DefaultVisit (pc, data);
348                 }
349
350                 public virtual Result EndOld(Label pc, Label matchingBegin, TypeNode type, Dest dest, Source source, Data data)
351                 {
352                         return DefaultVisit (pc, data);
353                 }
354
355                 public virtual Result LoadStack(Label pc, int offset, Dest dest, Source source, bool isOld, Data data)
356                 {
357                         return DefaultVisit (pc, data);
358                 }
359
360                 public virtual Result LoadStackAddress(Label pc, int offset, Dest dest, Source source, TypeNode type, bool isOld, Data data)
361                 {
362                         return DefaultVisit (pc, data);
363                 }
364
365                 public virtual Result LoadResult(Label pc, TypeNode type, Dest dest, Source source, Data data)
366                 {
367                         return DefaultVisit (pc, data);
368                 }
369                 #endregion
370         }
371 }