Revision 7
Added by Willibald K. over 8 years ago
OoaCompleteAstTraversalVisitor.java | ||
---|---|---|
1 |
/**
|
|
2 |
*
|
|
3 |
* OOAS Compiler
|
|
4 |
*
|
|
5 |
* Copyright 2015, AIT Austrian Institute of Technology.
|
|
6 |
* This code is based on the C# Version of the OOAS Compiler, which is
|
|
7 |
* copyright 2015 by the Institute of Software Technology, Graz University
|
|
8 |
* of Technology with portions copyright by the AIT Austrian Institute of
|
|
9 |
* Technology. All rights reserved.
|
|
10 |
*
|
|
11 |
* SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED.
|
|
12 |
*
|
|
13 |
* If you modify the file please update the list of contributors below to in-
|
|
14 |
* clude your name. Please also stick to the coding convention of using TABs
|
|
15 |
* to do the basic (block-level) indentation and spaces for anything after
|
|
16 |
* that. (Enable the display of special chars and it should be pretty obvious
|
|
17 |
* what this means.) Also, remove all trailing whitespace.
|
|
18 |
*
|
|
19 |
* Contributors:
|
|
20 |
* Willibald Krenn (AIT)
|
|
21 |
* Stephan Zimmerer (AIT)
|
|
22 |
* Markus Demetz (AIT)
|
|
23 |
* Christoph Czurda (AIT)
|
|
24 |
*
|
|
25 |
*/
|
|
1 |
/** |
|
2 |
* |
|
3 |
* OOAS Compiler |
|
4 |
* |
|
5 |
* Copyright 2015, AIT Austrian Institute of Technology. |
|
6 |
* This code is based on the C# Version of the OOAS Compiler, which is |
|
7 |
* copyright 2015 by the Institute of Software Technology, Graz University |
|
8 |
* of Technology with portions copyright by the AIT Austrian Institute of |
|
9 |
* Technology. All rights reserved. |
|
10 |
* |
|
11 |
* SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED. |
|
12 |
* |
|
13 |
* If you modify the file please update the list of contributors below to in- |
|
14 |
* clude your name. Please also stick to the coding convention of using TABs |
|
15 |
* to do the basic (block-level) indentation and spaces for anything after |
|
16 |
* that. (Enable the display of special chars and it should be pretty obvious |
|
17 |
* what this means.) Also, remove all trailing whitespace. |
|
18 |
* |
|
19 |
* Contributors: |
|
20 |
* Willibald Krenn (AIT) |
|
21 |
* Stephan Zimmerer (AIT) |
|
22 |
* Markus Demetz (AIT) |
|
23 |
* Christoph Czurda (AIT) |
|
24 |
* |
|
25 |
*/ |
|
26 | 26 |
|
27 | 27 |
|
28 |
package org.momut.ooas.visitors; |
|
29 |
|
|
30 |
import java.util.HashSet; |
|
28 |
package org.momut.ooas.visitors; |
|
31 | 29 |
|
30 |
import java.util.HashSet; |
|
31 |
|
|
32 | 32 |
import org.momut.ooas.ast.IAst; |
33 | 33 |
import org.momut.ooas.ast.IAstVisitor; |
34 | 34 |
import org.momut.ooas.ast.expressions.AccessExpression; |
... | ... | |
98 | 98 |
import org.momut.ooas.ast.types.TupleType; |
99 | 99 |
import org.momut.ooas.ast.types.UlyssesType; |
100 | 100 |
import org.momut.ooas.parser.ParserState; |
101 |
|
|
102 |
public abstract class OoaCompleteAstTraversalVisitor implements IAstVisitor |
|
103 |
{ |
|
104 |
protected HashSet<Object> m_visited = new HashSet<Object>(); |
|
105 |
protected ParserState m_ParserState; |
|
106 |
protected boolean m_DuplicateVisit; |
|
107 |
|
|
108 |
protected void VisitSub(IAst subElement, IAst parent) |
|
109 |
{ |
|
110 |
if (subElement == null) |
|
111 |
return; |
|
112 |
if (m_visited.contains(subElement)) |
|
113 |
return; |
|
114 |
if (!(subElement instanceof OpaqueType) && !m_DuplicateVisit) |
|
115 |
m_visited.add(subElement); |
|
116 |
VisitAstElement(subElement, parent); |
|
117 |
} |
|
118 |
|
|
119 |
/// <summary> |
|
120 |
/// Is called once per Ast element. Makes sense to override it in a |
|
121 |
/// subclass.. |
|
122 |
/// </summary> |
|
123 |
/// <param name="element">to be visited</param> |
|
124 |
/// <param name="parent">parent of the element in the ast</param> |
|
125 |
protected /*virtual*/ void VisitAstElement(IAst element, IAst parent) |
|
126 |
{ |
|
127 |
element.Accept(this); |
|
128 |
} |
|
129 |
|
|
130 |
public OoaCompleteAstTraversalVisitor(ParserState aState) |
|
131 |
{ |
|
132 |
m_ParserState = aState; |
|
133 |
} |
|
134 |
|
|
135 |
public OoaCompleteAstTraversalVisitor(ParserState aState, boolean completeTraversal) |
|
136 |
{ |
|
137 |
this(aState); |
|
138 |
m_DuplicateVisit = completeTraversal; |
|
139 |
} |
|
140 |
|
|
141 |
@Override |
|
142 |
public String returnVisitorName() |
|
143 |
{ |
|
144 |
return this.getClass().getSimpleName(); |
|
145 |
} |
|
146 |
|
|
147 |
@Override |
|
148 |
public void done() { |
|
149 |
} |
|
150 |
|
|
151 |
@Override |
|
152 |
public /*override*/ String toString() |
|
153 |
{ |
|
154 |
return returnVisitorName(); |
|
155 |
} |
|
156 |
|
|
157 |
@Override |
|
158 |
public /*virtual*/ void visit(EnumIdentifier enumIdentifier) |
|
159 |
{ |
|
160 |
VisitSub(enumIdentifier.type(), enumIdentifier); |
|
161 |
} |
|
162 |
|
|
163 |
@Override |
|
164 |
public /*virtual*/ void visit(ConstantIdentifier constantIdentifier) |
|
165 |
{ |
|
166 |
if (constantIdentifier.type() != null) |
|
167 |
VisitSub(constantIdentifier.type(), constantIdentifier); |
|
168 |
VisitSub(constantIdentifier.Value(), constantIdentifier); |
|
169 |
} |
|
170 |
|
|
171 |
|
|
172 |
@Override |
|
173 |
public /*virtual*/ void visit(LandmarkIdentifier landmarkIdentifier) |
|
174 |
{ |
|
175 |
VisitSub(landmarkIdentifier.type(), landmarkIdentifier); |
|
176 |
} |
|
177 |
|
|
178 |
@Override |
|
179 |
public /*virtual*/ void visit(AttributeIdentifier attributeIdentifier) |
|
180 |
{ |
|
181 |
VisitSub(attributeIdentifier.type(), attributeIdentifier); |
|
182 |
VisitSub(attributeIdentifier.initializer(), attributeIdentifier); |
|
183 |
} |
|
184 |
|
|
185 |
@Override |
|
186 |
public /*virtual*/ void visit(ExpressionVariableIdentifier expressionVariableIdentifier) |
|
187 |
{ |
|
188 |
VisitSub(expressionVariableIdentifier.type(), expressionVariableIdentifier); |
|
189 |
} |
|
190 |
|
|
191 |
@Override |
|
192 |
public /*virtual*/ void visit(ParameterIdentifier parameterIdentifier) |
|
193 |
{ |
|
194 |
VisitSub(parameterIdentifier.type(), parameterIdentifier); |
|
195 |
} |
|
196 |
|
|
197 |
@Override |
|
198 |
public /*virtual*/ void visit(LocalVariableIdentifier localVariableIdentifier) |
|
199 |
{ |
|
200 |
VisitSub(localVariableIdentifier.type(), localVariableIdentifier); |
|
201 |
} |
|
202 |
|
|
203 |
@Override |
|
204 |
public /*virtual*/ void visit(TypeIdentifier typeIdentifier) |
|
205 |
{ |
|
206 |
VisitSub(typeIdentifier.type(), typeIdentifier); |
|
207 |
} |
|
208 |
|
|
209 |
@Override |
|
210 |
public /*virtual*/ void visit(SelfTypeIdentifier aself) |
|
211 |
{ |
|
212 |
visit((TypeIdentifier)aself); |
|
213 |
} |
|
214 |
|
|
215 |
@Override |
|
216 |
public /*virtual*/ void visit(MethodIdentifier methodIdentifier) |
|
217 |
{ |
|
218 |
VisitSub(methodIdentifier.type(), methodIdentifier); |
|
219 |
for (final Identifier sym: methodIdentifier.symbolTable().symbolList()) |
|
220 |
VisitSub(sym, methodIdentifier); |
|
221 |
for (final ParameterIdentifier par: methodIdentifier.parameter()) |
|
222 |
VisitSub(par, methodIdentifier); |
|
223 |
VisitSub(methodIdentifier.body(), methodIdentifier); |
|
224 |
} |
|
225 |
|
|
226 |
@Override |
|
227 |
public /*virtual*/ void visit(NamedActionIdentifier namedActionIdentifier) |
|
228 |
{ |
|
229 |
VisitSub(namedActionIdentifier.type(), namedActionIdentifier); |
|
230 |
for (final Identifier sym : namedActionIdentifier.symbolTable().symbolList()) |
|
231 |
VisitSub(sym, namedActionIdentifier); |
|
232 |
for (final ParameterIdentifier par: namedActionIdentifier.parameter()) |
|
233 |
VisitSub(par, namedActionIdentifier); |
|
234 |
VisitSub(namedActionIdentifier.body(), namedActionIdentifier); |
|
235 |
} |
|
236 |
|
|
237 |
@Override |
|
238 |
public /*virtual*/ void visit(MainModule mainModule) |
|
239 |
{ |
|
240 |
for (final Identifier sym: mainModule.symbolTable().symbolList()) |
|
241 |
VisitSub(sym, mainModule); |
|
242 |
final boolean haveInstance = mainModule.instance() != null; |
|
243 |
if (haveInstance) |
|
244 |
VisitSub(mainModule.instance(), mainModule); |
|
245 |
else |
|
246 |
VisitSub(mainModule.systemDescription(), mainModule); |
|
247 |
} |
|
248 |
|
|
249 |
@Override |
|
250 |
public /*virtual*/ void visit(Module module) |
|
251 |
{ |
|
252 |
for (final Identifier sym: module.symbolTable().symbolList()) |
|
253 |
VisitSub(sym, module); |
|
254 |
} |
|
255 |
|
|
256 |
@Override |
|
257 |
public /*virtual*/ void visit(NondetIdentifierList nondetIdentifierList) |
|
258 |
{ |
|
259 |
for (final Identifier id: nondetIdentifierList.identifiers()) |
|
260 |
VisitSub(id, nondetIdentifierList); |
|
261 |
} |
|
262 |
|
|
263 |
@Override |
|
264 |
public /*virtual*/ void visit(SeqIdentifierList seqIdentifierList) |
|
265 |
{ |
|
266 |
for (final Identifier id: seqIdentifierList.identifiers()) |
|
267 |
VisitSub(id, seqIdentifierList); |
|
268 |
} |
|
269 |
|
|
270 |
@Override |
|
271 |
public /*virtual*/ void visit(PrioIdentifierList prioIdentifierList) |
|
272 |
{ |
|
273 |
for (final Identifier id: prioIdentifierList.identifiers()) |
|
274 |
VisitSub(id, prioIdentifierList); |
|
275 |
} |
|
276 |
|
|
277 |
@Override |
|
278 |
public /*virtual*/ void visit(UnspecIdentifierList unspecIdentifierList) |
|
279 |
{ |
|
280 |
for (final Identifier id: unspecIdentifierList.identifiers()) |
|
281 |
VisitSub(id, unspecIdentifierList); |
|
282 |
} |
|
283 |
|
|
284 |
@Override |
|
285 |
public /*virtual*/ void visit(NondetBlock nondetBlock) |
|
286 |
{ |
|
287 |
for (final Identifier id: nondetBlock.symbols().symbolList()) |
|
288 |
VisitSub(id, nondetBlock); |
|
289 |
|
|
290 |
for (final Statement stmnt: nondetBlock.statements()) |
|
291 |
VisitSub(stmnt, nondetBlock); |
|
292 |
} |
|
293 |
|
|
294 |
@Override |
|
295 |
public /*virtual*/ void visit(SeqBlock seqBlock) |
|
296 |
{ |
|
297 |
for (final Identifier id: seqBlock.symbols().symbolList()) |
|
298 |
VisitSub(id, seqBlock); |
|
299 |
|
|
300 |
if (seqBlock.filter() != null) |
|
301 |
VisitSub(seqBlock.filter(), seqBlock); |
|
302 |
|
|
303 |
for (final Statement stmnt: seqBlock.statements()) |
|
304 |
VisitSub(stmnt, seqBlock); |
|
305 |
} |
|
306 |
|
|
307 |
@Override |
|
308 |
public /*virtual*/ void visit(PrioBlock prioBlock) |
|
309 |
{ |
|
310 |
for (final Identifier id: prioBlock.symbols().symbolList()) |
|
311 |
VisitSub(id, prioBlock); |
|
312 |
|
|
313 |
for (final Statement stmnt: prioBlock.statements()) |
|
314 |
VisitSub(stmnt, prioBlock); |
|
315 |
} |
|
316 |
|
|
317 |
@Override |
|
318 |
public /*virtual*/ void visit(GuardedCommand guardedCommand) |
|
319 |
{ |
|
320 |
VisitSub(guardedCommand.guard(), guardedCommand); |
|
321 |
VisitSub(guardedCommand.body(), guardedCommand); |
|
322 |
} |
|
323 |
|
|
324 |
@Override |
|
325 |
public /*virtual*/ void visit(Assignment assignment) |
|
326 |
{ |
|
327 |
for (final Expression vexp: assignment.places()) |
|
328 |
VisitSub(vexp, assignment); |
|
329 |
for (final Expression expr: assignment.values()) |
|
330 |
VisitSub(expr, assignment); |
|
331 |
|
|
332 |
VisitSub(assignment.nondetExpression(), assignment); |
|
333 |
} |
|
334 |
|
|
335 |
@Override |
|
336 |
public /*virtual*/ void visit(Call call) |
|
337 |
{ |
|
338 |
VisitSub(call.callExpression(), call); |
|
339 |
} |
|
340 |
|
|
341 |
@Override |
|
342 |
public /*virtual*/ void visit(SkipStatement skipStatement) |
|
343 |
{ } |
|
344 |
|
|
345 |
@Override |
|
346 |
public void visit(BreakStatement breakStatement) |
|
347 |
{ } |
|
348 |
|
|
349 |
@Override |
|
350 |
public /*virtual*/ void visit(AbortStatement abortStatement) |
|
351 |
{ } |
|
352 |
|
|
353 |
@Override |
|
354 |
public /*virtual*/ void visit(KillStatement killStatement) |
|
355 |
{ |
|
356 |
VisitSub(killStatement.someOne, killStatement); |
|
357 |
} |
|
358 |
|
|
359 |
@Override |
|
360 |
public /*virtual*/ <T>void visit(ValueExpression<T> valueExpression) |
|
361 |
{ } |
|
362 |
|
|
363 |
@Override |
|
364 |
public /*virtual*/ void visit(UnresolvedIdentifierExpression unresolvedIdentifierExpression) |
|
365 |
{ |
|
366 |
VisitSub(unresolvedIdentifierExpression.type(), unresolvedIdentifierExpression); |
|
367 |
} |
|
368 |
|
|
369 |
@Override |
|
370 |
public /*virtual*/ void visit(IdentifierExpression identifierExpression) |
|
371 |
{ |
|
372 |
VisitSub(identifierExpression.type(), identifierExpression); |
|
373 |
VisitSub(identifierExpression.identifier(), identifierExpression); |
|
374 |
} |
|
375 |
|
|
376 |
@Override |
|
377 |
public /*virtual*/ void visit(TypeExpression typeExpression) |
|
378 |
{ |
|
379 |
VisitSub(typeExpression.type(), typeExpression); |
|
380 |
} |
|
381 |
|
|
382 |
@Override |
|
383 |
public /*virtual*/ void visit(ListConstructor listConstructor) |
|
384 |
{ |
|
385 |
for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList()) |
|
386 |
VisitSub(lvar, listConstructor); |
|
387 |
|
|
388 |
for (final Expression elems: listConstructor.elements()) |
|
389 |
VisitSub(elems, listConstructor); |
|
390 |
|
|
391 |
if (listConstructor.comprehension() != null) |
|
392 |
VisitSub(listConstructor.comprehension(), listConstructor); |
|
393 |
} |
|
394 |
|
|
395 |
@Override |
|
396 |
public /*virtual*/ void visit(SetConstructor setConstructor) |
|
397 |
{ |
|
398 |
for (final Identifier svar: setConstructor.comprehensionVariables().symbolList()) |
|
399 |
VisitSub(svar, setConstructor); |
|
400 |
|
|
401 |
for (final Expression elems: setConstructor.items()) |
|
402 |
VisitSub(elems, setConstructor); |
|
403 |
|
|
404 |
VisitSub(setConstructor.comprehension(), setConstructor); |
|
405 |
} |
|
406 |
|
|
407 |
@Override |
|
408 |
public /*virtual*/ void visit(MapConstructor mapConstructor) |
|
409 |
{ |
|
410 |
/*foreach (var lvar in mapConstructor.localVariables.symbolList) |
|
411 |
VisitSub(lvar, mapConstructor);*/ |
|
412 |
|
|
413 |
for (final MapItem elem: mapConstructor.items()) |
|
414 |
{ |
|
415 |
VisitSub(elem.key, mapConstructor); |
|
416 |
VisitSub(elem.value, mapConstructor); |
|
417 |
} |
|
418 |
} |
|
419 |
|
|
420 |
@Override |
|
421 |
public /*virtual*/ void visit(TupleConstructor tupleConstructor) |
|
422 |
{ |
|
423 |
/*foreach (var lvar in tupleConstructor.localVariables.symbolList) |
|
424 |
VisitSub(lvar, tupleConstructor);*/ |
|
425 |
|
|
426 |
for (final Expression elem: tupleConstructor.values()) |
|
427 |
VisitSub(elem, tupleConstructor); |
|
428 |
} |
|
429 |
|
|
430 |
@Override |
|
431 |
public /*virtual*/ void visit(AccessExpression accessExpression) |
|
432 |
{ |
|
433 |
VisitSub(accessExpression.left(), accessExpression); |
|
434 |
VisitSub(accessExpression.right(), accessExpression); |
|
435 |
} |
|
436 |
|
|
437 |
@Override |
|
438 |
public /*virtual*/ void visit(BinaryOperator binaryOperator) |
|
439 |
{ |
|
440 |
VisitSub(binaryOperator.left(), binaryOperator); |
|
441 |
VisitSub(binaryOperator.right(), binaryOperator); |
|
442 |
} |
|
443 |
|
|
444 |
@Override |
|
445 |
public /*virtual*/ void visit(TernaryOperator ternaryOperator) |
|
446 |
{ |
|
447 |
VisitSub(ternaryOperator.left(), ternaryOperator); |
|
448 |
VisitSub(ternaryOperator.mid(), ternaryOperator); |
|
449 |
VisitSub(ternaryOperator.right(), ternaryOperator); |
|
450 |
} |
|
451 |
|
|
452 |
@Override |
|
453 |
public /*virtual*/ void visit(TupleMapAccessExpression tupleMapAccessExpression) |
|
454 |
{ |
|
455 |
VisitSub(tupleMapAccessExpression.argument(), tupleMapAccessExpression); |
|
456 |
VisitSub(tupleMapAccessExpression.child(), tupleMapAccessExpression); |
|
457 |
} |
|
458 |
|
|
459 |
@Override |
|
460 |
public /*virtual*/ void visit(CallExpression callExpression) |
|
461 |
{ |
|
462 |
if (callExpression.arguments() != null) |
|
463 |
for (final Expression arg: callExpression.arguments()) |
|
464 |
VisitSub(arg, callExpression); |
|
465 |
VisitSub(callExpression.child(), callExpression); |
|
466 |
} |
|
467 |
|
|
468 |
@Override |
|
469 |
public /*virtual*/ void visit(ForallQuantifier quantifier) |
|
470 |
{ |
|
471 |
for (final Identifier lvar: quantifier.symbols().symbolList()) |
|
472 |
VisitSub(lvar, quantifier); |
|
473 |
|
|
474 |
VisitSub(quantifier.child(), quantifier); |
|
475 |
} |
|
476 |
|
|
477 |
@Override |
|
478 |
public /*virtual*/ void visit(ExistsQuantifier quantifier) |
|
479 |
{ |
|
480 |
for (final Identifier lvar: quantifier.symbols().symbolList()) |
|
481 |
VisitSub(lvar, quantifier); |
|
482 |
|
|
483 |
VisitSub(quantifier.child(), quantifier); |
|
484 |
} |
|
485 |
|
|
486 |
@Override |
|
487 |
public /*virtual*/ void visit(UnaryOperator unaryOperator) |
|
488 |
{ |
|
489 |
VisitSub(unaryOperator.child(), unaryOperator); |
|
490 |
if (unaryOperator.kind() == ExpressionKind.Cast) |
|
491 |
VisitSub(unaryOperator.type(), unaryOperator); |
|
492 |
} |
|
493 |
|
|
494 |
|
|
495 |
|
|
496 |
@Override |
|
497 |
public /*virtual*/ void visit(CharType charType) |
|
498 |
{ |
|
499 |
} |
|
500 |
|
|
501 |
@Override |
|
502 |
public /*virtual*/ void visit(IntType intType) |
|
503 |
{ |
|
504 |
} |
|
505 |
|
|
506 |
@Override |
|
507 |
public /*virtual*/ void visit(BoolType boolType) |
|
508 |
{ |
|
509 |
} |
|
510 |
|
|
511 |
@Override |
|
512 |
public /*virtual*/ void visit(FloatType floatType) |
|
513 |
{ |
|
514 |
} |
|
515 |
|
|
516 |
@Override |
|
517 |
public /*virtual*/ void visit(EnumType enumType) |
|
518 |
{ |
|
519 |
for (final Identifier sym: enumType.listOfEnumSymbols()) |
|
520 |
VisitSub(sym, enumType); |
|
521 |
} |
|
522 |
|
|
523 |
@Override |
|
524 |
public /*virtual*/ void visit(ListType listType) |
|
525 |
{ |
|
526 |
VisitSub(listType.innerType(), listType); |
|
527 |
} |
|
528 |
|
|
529 |
@Override |
|
530 |
public /*virtual*/ void visit(MapType mapType) |
|
531 |
{ |
|
532 |
VisitSub(mapType.fromType(), mapType); |
|
533 |
VisitSub(mapType.toType(), mapType); |
|
534 |
} |
|
535 |
|
|
536 |
@Override |
|
537 |
public /*virtual*/ void visit(QrType qrType) |
|
538 |
{ |
|
539 |
for (final Identifier m: qrType.landmarks()) |
|
540 |
VisitSub(m, qrType); |
|
541 |
} |
|
542 |
|
|
543 |
@Override |
|
544 |
public /*virtual*/ void visit(TupleType tupleType) |
|
545 |
{ |
|
546 |
for (final UlyssesType t: tupleType.innerTypes()) |
|
547 |
VisitSub(t, tupleType); |
|
548 |
} |
|
549 |
|
|
550 |
@Override |
|
551 |
public /*virtual*/ void visit(FunctionType functionType) |
|
552 |
{ |
|
553 |
for (final UlyssesType a: functionType.parameter()) |
|
554 |
VisitSub(a, functionType); |
|
555 |
VisitSub(functionType.returnType(), functionType); |
|
556 |
} |
|
557 |
|
|
558 |
@Override |
|
559 |
public /*virtual*/ void visit(OoActionSystemType ooActionSystemType) |
|
560 |
{ |
|
561 |
for (final Identifier s: ooActionSystemType.symbols().symbolList()) |
|
562 |
VisitSub(s, ooActionSystemType); |
|
563 |
|
|
564 |
VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType); |
|
565 |
} |
|
566 |
|
|
567 |
public /*virtual*/ @Override |
|
568 |
void visit(OpaqueType opaqueType) |
|
569 |
{ |
|
570 |
VisitSub(opaqueType.resolvedType(), opaqueType); |
|
571 |
} |
|
572 |
|
|
573 |
@Override |
|
574 |
public /*virtual*/ void visit(NullType nullType) |
|
575 |
{ } |
|
576 |
|
|
577 |
@Override |
|
578 |
public /*virtual*/ void visit(AnyType anyType) |
|
579 |
{ } |
|
580 |
|
|
581 |
@Override |
|
582 |
public /*virtual*/ void visit(ObjectConstructor objectConstructor) |
|
583 |
{ |
|
584 |
VisitSub(objectConstructor.type(), objectConstructor); |
|
585 |
} |
|
586 |
|
|
587 |
@Override |
|
588 |
public /*virtual*/ void visit(QValConstructor qValConstructor) |
|
589 |
{ |
|
590 |
} |
|
591 |
|
|
592 |
@Override |
|
593 |
public /*virtual*/ void visit(QualitativeConstraintStatement qalitativeConstraintStatement) |
|
594 |
{ |
|
595 |
VisitSub(qalitativeConstraintStatement.variable0(), qalitativeConstraintStatement); |
|
596 |
VisitSub(qalitativeConstraintStatement.variable1(), qalitativeConstraintStatement); |
|
597 |
if (qalitativeConstraintStatement.variable2() != null) |
|
598 |
VisitSub(qalitativeConstraintStatement.variable2(), qalitativeConstraintStatement); |
|
599 |
} |
|
600 |
} |
|
601 |
|
|
101 |
|
|
102 |
public abstract class OoaCompleteAstTraversalVisitor implements IAstVisitor |
|
103 |
{ |
|
104 |
protected HashSet<Object> m_visited = new HashSet<Object>(); |
|
105 |
protected ParserState m_ParserState; |
|
106 |
protected boolean m_DuplicateVisit; |
|
107 |
|
|
108 |
protected void VisitSub(IAst subElement, IAst parent) |
|
109 |
{ |
|
110 |
if (subElement == null) |
|
111 |
return; |
|
112 |
if (m_visited.contains(subElement)) |
|
113 |
return; |
|
114 |
if (!(subElement instanceof OpaqueType) && !m_DuplicateVisit) |
|
115 |
m_visited.add(subElement); |
|
116 |
VisitAstElement(subElement, parent); |
|
117 |
} |
|
118 |
|
|
119 |
/// <summary> |
|
120 |
/// Is called once per Ast element. Makes sense to override it in a |
|
121 |
/// subclass.. |
|
122 |
/// </summary> |
|
123 |
/// <param name="element">to be visited</param> |
|
124 |
/// <param name="parent">parent of the element in the ast</param> |
|
125 |
protected /*virtual*/ void VisitAstElement(IAst element, IAst parent) |
|
126 |
{ |
|
127 |
element.Accept(this); |
|
128 |
} |
|
129 |
|
|
130 |
public OoaCompleteAstTraversalVisitor(ParserState aState) |
|
131 |
{ |
|
132 |
m_ParserState = aState; |
|
133 |
} |
|
134 |
|
|
135 |
public OoaCompleteAstTraversalVisitor(ParserState aState, boolean completeTraversal) |
|
136 |
{ |
|
137 |
this(aState); |
|
138 |
m_DuplicateVisit = completeTraversal; |
|
139 |
} |
|
140 |
|
|
141 |
@Override |
|
142 |
public String returnVisitorName() |
|
143 |
{ |
|
144 |
return this.getClass().getSimpleName(); |
|
145 |
} |
|
146 |
|
|
147 |
@Override |
|
148 |
public void done() { |
|
149 |
} |
|
150 |
|
|
151 |
@Override |
|
152 |
public /*override*/ String toString() |
|
153 |
{ |
|
154 |
return returnVisitorName(); |
|
155 |
} |
|
156 |
|
|
157 |
@Override |
|
158 |
public /*virtual*/ void visit(EnumIdentifier enumIdentifier) |
|
159 |
{ |
|
160 |
VisitSub(enumIdentifier.type(), enumIdentifier); |
|
161 |
} |
|
162 |
|
|
163 |
@Override |
|
164 |
public /*virtual*/ void visit(ConstantIdentifier constantIdentifier) |
|
165 |
{ |
|
166 |
if (constantIdentifier.type() != null) |
|
167 |
VisitSub(constantIdentifier.type(), constantIdentifier); |
|
168 |
VisitSub(constantIdentifier.Value(), constantIdentifier); |
|
169 |
} |
|
170 |
|
|
171 |
|
|
172 |
@Override |
|
173 |
public /*virtual*/ void visit(LandmarkIdentifier landmarkIdentifier) |
|
174 |
{ |
|
175 |
VisitSub(landmarkIdentifier.type(), landmarkIdentifier); |
|
176 |
} |
|
177 |
|
|
178 |
@Override |
|
179 |
public /*virtual*/ void visit(AttributeIdentifier attributeIdentifier) |
|
180 |
{ |
|
181 |
VisitSub(attributeIdentifier.type(), attributeIdentifier); |
|
182 |
VisitSub(attributeIdentifier.initializer(), attributeIdentifier); |
|
183 |
} |
|
184 |
|
|
185 |
@Override |
|
186 |
public /*virtual*/ void visit(ExpressionVariableIdentifier expressionVariableIdentifier) |
|
187 |
{ |
|
188 |
VisitSub(expressionVariableIdentifier.type(), expressionVariableIdentifier); |
|
189 |
} |
|
190 |
|
|
191 |
@Override |
|
192 |
public /*virtual*/ void visit(ParameterIdentifier parameterIdentifier) |
|
193 |
{ |
|
194 |
VisitSub(parameterIdentifier.type(), parameterIdentifier); |
|
195 |
} |
|
196 |
|
|
197 |
@Override |
|
198 |
public /*virtual*/ void visit(LocalVariableIdentifier localVariableIdentifier) |
|
199 |
{ |
|
200 |
VisitSub(localVariableIdentifier.type(), localVariableIdentifier); |
|
201 |
} |
|
202 |
|
|
203 |
@Override |
|
204 |
public /*virtual*/ void visit(TypeIdentifier typeIdentifier) |
|
205 |
{ |
|
206 |
VisitSub(typeIdentifier.type(), typeIdentifier); |
|
207 |
} |
|
208 |
|
|
209 |
@Override |
|
210 |
public /*virtual*/ void visit(SelfTypeIdentifier aself) |
|
211 |
{ |
|
212 |
visit((TypeIdentifier)aself); |
|
213 |
} |
|
214 |
|
|
215 |
@Override |
|
216 |
public /*virtual*/ void visit(MethodIdentifier methodIdentifier) |
|
217 |
{ |
|
218 |
VisitSub(methodIdentifier.type(), methodIdentifier); |
|
219 |
for (final Identifier sym: methodIdentifier.symbolTable().symbolList()) |
|
220 |
VisitSub(sym, methodIdentifier); |
|
221 |
for (final ParameterIdentifier par: methodIdentifier.parameter()) |
|
222 |
VisitSub(par, methodIdentifier); |
|
223 |
VisitSub(methodIdentifier.body(), methodIdentifier); |
|
224 |
} |
|
225 |
|
|
226 |
@Override |
|
227 |
public /*virtual*/ void visit(NamedActionIdentifier namedActionIdentifier) |
|
228 |
{ |
|
229 |
VisitSub(namedActionIdentifier.type(), namedActionIdentifier); |
|
230 |
for (final Identifier sym : namedActionIdentifier.symbolTable().symbolList()) |
|
231 |
VisitSub(sym, namedActionIdentifier); |
|
232 |
for (final ParameterIdentifier par: namedActionIdentifier.parameter()) |
|
233 |
VisitSub(par, namedActionIdentifier); |
|
234 |
VisitSub(namedActionIdentifier.body(), namedActionIdentifier); |
|
235 |
} |
|
236 |
|
|
237 |
@Override |
|
238 |
public /*virtual*/ void visit(MainModule mainModule) |
|
239 |
{ |
|
240 |
for (final Identifier sym: mainModule.symbolTable().symbolList()) |
|
241 |
VisitSub(sym, mainModule); |
|
242 |
final boolean haveInstance = mainModule.instance() != null; |
|
243 |
if (haveInstance) |
|
244 |
VisitSub(mainModule.instance(), mainModule); |
|
245 |
else |
|
246 |
VisitSub(mainModule.systemDescription(), mainModule); |
|
247 |
} |
|
248 |
|
|
249 |
@Override |
|
250 |
public /*virtual*/ void visit(Module module) |
|
251 |
{ |
|
252 |
for (final Identifier sym: module.symbolTable().symbolList()) |
|
253 |
VisitSub(sym, module); |
|
254 |
} |
|
255 |
|
|
256 |
@Override |
|
257 |
public /*virtual*/ void visit(NondetIdentifierList nondetIdentifierList) |
|
258 |
{ |
|
259 |
for (final Identifier id: nondetIdentifierList.identifiers()) |
|
260 |
VisitSub(id, nondetIdentifierList); |
|
261 |
} |
|
262 |
|
|
263 |
@Override |
|
264 |
public /*virtual*/ void visit(SeqIdentifierList seqIdentifierList) |
|
265 |
{ |
|
266 |
for (final Identifier id: seqIdentifierList.identifiers()) |
|
267 |
VisitSub(id, seqIdentifierList); |
|
268 |
} |
|
269 |
|
|
270 |
@Override |
|
271 |
public /*virtual*/ void visit(PrioIdentifierList prioIdentifierList) |
|
272 |
{ |
|
273 |
for (final Identifier id: prioIdentifierList.identifiers()) |
|
274 |
VisitSub(id, prioIdentifierList); |
|
275 |
} |
|
276 |
|
|
277 |
@Override |
|
278 |
public /*virtual*/ void visit(UnspecIdentifierList unspecIdentifierList) |
|
279 |
{ |
|
280 |
for (final Identifier id: unspecIdentifierList.identifiers()) |
|
281 |
VisitSub(id, unspecIdentifierList); |
|
282 |
} |
|
283 |
|
|
284 |
@Override |
|
285 |
public /*virtual*/ void visit(NondetBlock nondetBlock) |
|
286 |
{ |
|
287 |
for (final Identifier id: nondetBlock.symbols().symbolList()) |
|
288 |
VisitSub(id, nondetBlock); |
|
289 |
|
|
290 |
for (final Statement stmnt: nondetBlock.statements()) |
|
291 |
VisitSub(stmnt, nondetBlock); |
|
292 |
} |
|
293 |
|
|
294 |
@Override |
|
295 |
public /*virtual*/ void visit(SeqBlock seqBlock) |
|
296 |
{ |
|
297 |
for (final Identifier id: seqBlock.symbols().symbolList()) |
|
298 |
VisitSub(id, seqBlock); |
|
299 |
|
|
300 |
if (seqBlock.filter() != null) |
|
301 |
VisitSub(seqBlock.filter(), seqBlock); |
|
302 |
|
|
303 |
for (final Statement stmnt: seqBlock.statements()) |
|
304 |
VisitSub(stmnt, seqBlock); |
|
305 |
} |
|
306 |
|
|
307 |
@Override |
|
308 |
public /*virtual*/ void visit(PrioBlock prioBlock) |
|
309 |
{ |
|
310 |
for (final Identifier id: prioBlock.symbols().symbolList()) |
|
311 |
VisitSub(id, prioBlock); |
|
312 |
|
|
313 |
for (final Statement stmnt: prioBlock.statements()) |
|
314 |
VisitSub(stmnt, prioBlock); |
|
315 |
} |
|
316 |
|
|
317 |
@Override |
|
318 |
public /*virtual*/ void visit(GuardedCommand guardedCommand) |
|
319 |
{ |
|
320 |
VisitSub(guardedCommand.guard(), guardedCommand); |
|
321 |
VisitSub(guardedCommand.body(), guardedCommand); |
|
322 |
} |
|
323 |
|
|
324 |
@Override |
|
325 |
public /*virtual*/ void visit(Assignment assignment) |
|
326 |
{ |
|
327 |
for (final Expression vexp: assignment.places()) |
|
328 |
VisitSub(vexp, assignment); |
|
329 |
for (final Expression expr: assignment.values()) |
|
330 |
VisitSub(expr, assignment); |
|
331 |
|
|
332 |
VisitSub(assignment.nondetExpression(), assignment); |
|
333 |
} |
|
334 |
|
|
335 |
@Override |
|
336 |
public /*virtual*/ void visit(Call call) |
|
337 |
{ |
|
338 |
VisitSub(call.callExpression(), call); |
|
339 |
} |
|
340 |
|
|
341 |
@Override |
|
342 |
public /*virtual*/ void visit(SkipStatement skipStatement) |
|
343 |
{ } |
|
344 |
|
|
345 |
@Override |
|
346 |
public void visit(BreakStatement breakStatement) |
|
347 |
{ } |
|
348 |
|
|
349 |
@Override |
|
350 |
public /*virtual*/ void visit(AbortStatement abortStatement) |
|
351 |
{ } |
|
352 |
|
|
353 |
@Override |
|
354 |
public /*virtual*/ void visit(KillStatement killStatement) |
|
355 |
{ |
|
356 |
VisitSub(killStatement.someOne, killStatement); |
|
357 |
} |
|
358 |
|
|
359 |
@Override |
|
360 |
public /*virtual*/ <T>void visit(ValueExpression<T> valueExpression) |
|
361 |
{ } |
|
362 |
|
|
363 |
@Override |
|
364 |
public /*virtual*/ void visit(UnresolvedIdentifierExpression unresolvedIdentifierExpression) |
|
365 |
{ |
|
366 |
VisitSub(unresolvedIdentifierExpression.type(), unresolvedIdentifierExpression); |
|
367 |
} |
|
368 |
|
|
369 |
@Override |
|
370 |
public /*virtual*/ void visit(IdentifierExpression identifierExpression) |
|
371 |
{ |
|
372 |
VisitSub(identifierExpression.type(), identifierExpression); |
|
373 |
VisitSub(identifierExpression.identifier(), identifierExpression); |
|
374 |
} |
|
375 |
|
|
376 |
@Override |
|
377 |
public /*virtual*/ void visit(TypeExpression typeExpression) |
|
378 |
{ |
|
379 |
VisitSub(typeExpression.type(), typeExpression); |
|
380 |
} |
|
381 |
|
|
382 |
@Override |
|
383 |
public /*virtual*/ void visit(ListConstructor listConstructor) |
|
384 |
{ |
|
385 |
for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList()) |
|
386 |
VisitSub(lvar, listConstructor); |
|
387 |
|
|
388 |
for (final Expression elems: listConstructor.elements()) |
|
389 |
VisitSub(elems, listConstructor); |
|
390 |
|
|
391 |
if (listConstructor.comprehension() != null) |
|
392 |
VisitSub(listConstructor.comprehension(), listConstructor); |
|
393 |
} |
|
394 |
|
|
395 |
@Override |
|
396 |
public /*virtual*/ void visit(SetConstructor setConstructor) |
|
397 |
{ |
|
398 |
for (final Identifier svar: setConstructor.comprehensionVariables().symbolList()) |
|
399 |
VisitSub(svar, setConstructor); |
|
400 |
|
|
401 |
for (final Expression elems: setConstructor.items()) |
|
402 |
VisitSub(elems, setConstructor); |
|
403 |
|
|
404 |
VisitSub(setConstructor.comprehension(), setConstructor); |
|
405 |
} |
|
406 |
|
|
407 |
@Override |
|
408 |
public /*virtual*/ void visit(MapConstructor mapConstructor) |
|
409 |
{ |
|
410 |
/*foreach (var lvar in mapConstructor.localVariables.symbolList) |
|
411 |
VisitSub(lvar, mapConstructor);*/ |
|
412 |
|
|
413 |
for (final MapItem elem: mapConstructor.items()) |
|
414 |
{ |
|
415 |
VisitSub(elem.key, mapConstructor); |
|
416 |
VisitSub(elem.value, mapConstructor); |
|
417 |
} |
|
418 |
} |
|
419 |
|
|
420 |
@Override |
|
421 |
public /*virtual*/ void visit(TupleConstructor tupleConstructor) |
|
422 |
{ |
|
423 |
/*foreach (var lvar in tupleConstructor.localVariables.symbolList) |
|
424 |
VisitSub(lvar, tupleConstructor);*/ |
|
425 |
|
|
426 |
for (final Expression elem: tupleConstructor.values()) |
|
427 |
VisitSub(elem, tupleConstructor); |
|
428 |
} |
|
429 |
|
|
430 |
@Override |
|
431 |
public /*virtual*/ void visit(AccessExpression accessExpression) |
|
432 |
{ |
|
433 |
VisitSub(accessExpression.left(), accessExpression); |
|
434 |
VisitSub(accessExpression.right(), accessExpression); |
|
435 |
} |
|
436 |
|
|
437 |
@Override |
|
438 |
public /*virtual*/ void visit(BinaryOperator binaryOperator) |
|
439 |
{ |
|
440 |
VisitSub(binaryOperator.left(), binaryOperator); |
|
441 |
VisitSub(binaryOperator.right(), binaryOperator); |
|
442 |
} |
|
443 |
|
|
444 |
@Override |
|
445 |
public /*virtual*/ void visit(TernaryOperator ternaryOperator) |
|
446 |
{ |
|
447 |
VisitSub(ternaryOperator.left(), ternaryOperator); |
|
448 |
VisitSub(ternaryOperator.mid(), ternaryOperator); |
|
449 |
VisitSub(ternaryOperator.right(), ternaryOperator); |
|
450 |
} |
|
451 |
|
|
452 |
@Override |
|
453 |
public /*virtual*/ void visit(TupleMapAccessExpression tupleMapAccessExpression) |
|
454 |
{ |
|
455 |
VisitSub(tupleMapAccessExpression.argument(), tupleMapAccessExpression); |
|
456 |
VisitSub(tupleMapAccessExpression.child(), tupleMapAccessExpression); |
|
457 |
} |
|
458 |
|
|
459 |
@Override |
|
460 |
public /*virtual*/ void visit(CallExpression callExpression) |
|
461 |
{ |
|
462 |
if (callExpression.arguments() != null) |
|
463 |
for (final Expression arg: callExpression.arguments()) |
|
464 |
VisitSub(arg, callExpression); |
|
465 |
VisitSub(callExpression.child(), callExpression); |
|
466 |
} |
|
467 |
|
|
468 |
@Override |
|
469 |
public /*virtual*/ void visit(ForallQuantifier quantifier) |
|
470 |
{ |
|
471 |
for (final Identifier lvar: quantifier.symbols().symbolList()) |
|
472 |
VisitSub(lvar, quantifier); |
|
473 |
|
|
474 |
VisitSub(quantifier.child(), quantifier); |
|
475 |
} |
|
476 |
|
|
477 |
@Override |
|
478 |
public /*virtual*/ void visit(ExistsQuantifier quantifier) |
|
479 |
{ |
|
480 |
for (final Identifier lvar: quantifier.symbols().symbolList()) |
|
481 |
VisitSub(lvar, quantifier); |
|
482 |
|
|
483 |
VisitSub(quantifier.child(), quantifier); |
|
484 |
} |
|
485 |
|
|
486 |
@Override |
|
487 |
public /*virtual*/ void visit(UnaryOperator unaryOperator) |
|
488 |
{ |
|
489 |
VisitSub(unaryOperator.child(), unaryOperator); |
|
490 |
if (unaryOperator.kind() == ExpressionKind.Cast) |
|
491 |
VisitSub(unaryOperator.type(), unaryOperator); |
|
492 |
} |
|
493 |
|
|
494 |
|
|
495 |
|
|
496 |
@Override |
|
497 |
public /*virtual*/ void visit(CharType charType) |
|
498 |
{ |
|
499 |
} |
|
500 |
|
|
501 |
@Override |
|
502 |
public /*virtual*/ void visit(IntType intType) |
|
503 |
{ |
|
504 |
} |
|
505 |
|
|
506 |
@Override |
|
507 |
public /*virtual*/ void visit(BoolType boolType) |
|
508 |
{ |
|
509 |
} |
|
510 |
|
|
511 |
@Override |
|
512 |
public /*virtual*/ void visit(FloatType floatType) |
|
513 |
{ |
|
514 |
} |
|
515 |
|
|
516 |
@Override |
|
517 |
public /*virtual*/ void visit(EnumType enumType) |
|
518 |
{ |
|
519 |
for (final Identifier sym: enumType.listOfEnumSymbols()) |
|
520 |
VisitSub(sym, enumType); |
|
521 |
} |
|
522 |
|
|
523 |
@Override |
|
524 |
public /*virtual*/ void visit(ListType listType) |
|
525 |
{ |
|
526 |
VisitSub(listType.innerType(), listType); |
|
527 |
} |
|
528 |
|
|
529 |
@Override |
|
530 |
public /*virtual*/ void visit(MapType mapType) |
|
531 |
{ |
|
532 |
VisitSub(mapType.fromType(), mapType); |
|
533 |
VisitSub(mapType.toType(), mapType); |
|
534 |
} |
|
535 |
|
|
536 |
@Override |
|
537 |
public /*virtual*/ void visit(QrType qrType) |
|
538 |
{ |
|
539 |
for (final Identifier m: qrType.landmarks()) |
|
540 |
VisitSub(m, qrType); |
|
541 |
} |
|
542 |
|
|
543 |
@Override |
|
544 |
public /*virtual*/ void visit(TupleType tupleType) |
|
545 |
{ |
|
546 |
for (final UlyssesType t: tupleType.innerTypes()) |
|
547 |
VisitSub(t, tupleType); |
|
548 |
} |
|
549 |
|
|
550 |
@Override |
|
551 |
public /*virtual*/ void visit(FunctionType functionType) |
|
552 |
{ |
|
553 |
for (final UlyssesType a: functionType.parameter()) |
|
554 |
VisitSub(a, functionType); |
|
555 |
VisitSub(functionType.returnType(), functionType); |
|
556 |
} |
|
557 |
|
|
558 |
@Override |
|
559 |
public /*virtual*/ void visit(OoActionSystemType ooActionSystemType) |
|
560 |
{ |
|
561 |
for (final Identifier s: ooActionSystemType.symbols().symbolList()) |
|
562 |
VisitSub(s, ooActionSystemType); |
|
563 |
|
|
564 |
VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType); |
|
565 |
} |
|
566 |
|
|
567 |
public /*virtual*/ @Override |
|
568 |
void visit(OpaqueType opaqueType) |
|
569 |
{ |
|
570 |
VisitSub(opaqueType.resolvedType(), opaqueType); |
|
571 |
} |
|
572 |
|
|
573 |
@Override |
|
574 |
public /*virtual*/ void visit(NullType nullType) |
|
575 |
{ } |
|
576 |
|
|
577 |
@Override |
|
578 |
public /*virtual*/ void visit(AnyType anyType) |
|
579 |
{ } |
|
580 |
|
|
581 |
@Override |
|
582 |
public /*virtual*/ void visit(ObjectConstructor objectConstructor) |
|
583 |
{ |
|
584 |
VisitSub(objectConstructor.type(), objectConstructor); |
|
585 |
} |
|
586 |
|
|
587 |
@Override |
|
588 |
public /*virtual*/ void visit(QValConstructor qValConstructor) |
|
589 |
{ |
|
590 |
} |
|
591 |
|
|
592 |
@Override |
|
593 |
public /*virtual*/ void visit(QualitativeConstraintStatement qalitativeConstraintStatement) |
|
594 |
{ |
|
595 |
VisitSub(qalitativeConstraintStatement.variable0(), qalitativeConstraintStatement); |
|
596 |
VisitSub(qalitativeConstraintStatement.variable1(), qalitativeConstraintStatement); |
|
597 |
if (qalitativeConstraintStatement.variable2() != null) |
|
598 |
VisitSub(qalitativeConstraintStatement.variable2(), qalitativeConstraintStatement); |
|
599 |
} |
|
600 |
} |
|
601 |
|
Also available in: Unified diff
changing java, cpp, hpp files to unix line endings