source: src/Common/PassVisitor.impl.h@ c81ebf9

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since c81ebf9 was 7b13aeb, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

PassVisitor now supports field skip_children

  • Property mode set to 100644
File size: 29.3 KB
RevLine 
[13932f14]1#pragma once
2
[9c1600c]3#define VISIT_START( node ) \
4 call_previsit( node ); \
[7b13aeb]5 if( visit_children() ) { \
[9c1600c]6
[7b13aeb]7#define VISIT_END( node ) \
8 } \
[9c1600c]9 return call_postvisit( node ); \
10
[296b2be]11#define MUTATE_START( node ) \
12 call_premutate( node ); \
[7b13aeb]13 if( visit_children() ) { \
[296b2be]14
15#define MUTATE_END( type, node ) \
[7b13aeb]16 } \
[296b2be]17 return call_postmutate< type * >( node ); \
18
19
[13932f14]20#define VISIT_BODY( node ) \
[9c1600c]21 VISIT_START( node ); \
[13932f14]22 Visitor::visit( node ); \
[9c1600c]23 VISIT_END( node ); \
[13932f14]24
[ab904dc]25
[296b2be]26#define MUTATE_BODY( type, node ) \
27 MUTATE_START( node ); \
28 Mutator::mutate( node ); \
29 MUTATE_END( type, node ); \
30
[134322e]31
32
33template<typename T>
34static inline bool empty( T * ptr ) {
35 return !ptr || ptr->empty();
36}
37
38typedef std::list< Statement * > StmtList_t;
39
40template< typename pass_type >
41void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) {
42 SemanticError errors;
43
44 StmtList_t* beforeStmts = get_beforeStmts();
45 StmtList_t* afterStmts = get_afterStmts();
46
47 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
48 if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
49 try {
[9c1600c]50 (*i)->accept( *this );
[134322e]51 } catch ( SemanticError &e ) {
52 errors.append( e );
53 }
54 if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
55 }
56
57 if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
58 if ( !errors.isEmpty() ) { throw errors; }
59}
60
[296b2be]61template< typename pass_type >
62void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) {
63 SemanticError errors;
64
[134322e]65 StmtList_t* beforeStmts = get_beforeStmts();
66 StmtList_t* afterStmts = get_afterStmts();
67
[296b2be]68 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
[134322e]69 if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
[296b2be]70 try {
71 *i = (*i)->acceptMutator( *this );
72 } catch ( SemanticError &e ) {
73 errors.append( e );
[134322e]74 }
75 if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
[296b2be]76 }
[134322e]77
78 if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
79 if ( !errors.isEmpty() ) { throw errors; }
[296b2be]80}
81
82template< typename pass_type >
[134322e]83Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) {
[296b2be]84 // don't want statements from outer CompoundStmts to be added to this CompoundStmt
[134322e]85 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
86 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
87 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[3fb9a83]88
[9c1600c]89 maybeAccept( stmt, *this );
[134322e]90
91 StmtList_t* beforeStmts = get_beforeStmts();
92 StmtList_t* afterStmts = get_afterStmts();
93
[9c1600c]94 if( empty(beforeStmts) && empty(afterStmts) ) { return stmt; }
[134322e]95
96 CompoundStmt *compound = new CompoundStmt( noLabels );
97 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
[9c1600c]98 compound->get_kids().push_back( stmt );
[134322e]99 if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
100 return compound;
101}
102
103template< typename pass_type >
104Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) {
105 // don't want statements from outer CompoundStmts to be added to this CompoundStmt
106 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
107 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
108 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]109
110 Statement *newStmt = maybeMutate( stmt, *this );
[134322e]111
112 StmtList_t* beforeStmts = get_beforeStmts();
113 StmtList_t* afterStmts = get_afterStmts();
114
115 if( empty(beforeStmts) && empty(afterStmts) ) { return newStmt; }
116
117 CompoundStmt *compound = new CompoundStmt( noLabels );
118 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
119 compound->get_kids().push_back( newStmt );
120 if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
121 return compound;
122}
123
124
125
126template< typename pass_type >
127void PassVisitor< pass_type >::visitExpression( Expression * expr ) {
128 if( !expr ) return;
129
130 auto env_ptr = get_env_ptr();
131 if ( env_ptr && expr->get_env() ) {
132 *env_ptr = expr->get_env();
[296b2be]133 }
[134322e]134 // xxx - should env be cloned (or moved) onto the result of the mutate?
135 expr->accept( *this );
[296b2be]136}
137
138template< typename pass_type >
139Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) {
140 if( !expr ) return nullptr;
141
[134322e]142 auto env_ptr = get_env_ptr();
143 if ( env_ptr && expr->get_env() ) {
144 *env_ptr = expr->get_env();
[296b2be]145 }
146 // xxx - should env be cloned (or moved) onto the result of the mutate?
147 return expr->acceptMutator( *this );
148}
[ab904dc]149
150
[296b2be]151//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[13932f14]152
153template< typename pass_type >
[ab904dc]154void PassVisitor< pass_type >::visit( ObjectDecl * node ) {
[13932f14]155 VISIT_BODY( node );
156}
157
158template< typename pass_type >
[ab904dc]159void PassVisitor< pass_type >::visit( FunctionDecl * node ) {
[13932f14]160 VISIT_BODY( node );
161}
162
163template< typename pass_type >
[ab904dc]164void PassVisitor< pass_type >::visit( StructDecl * node ) {
[13932f14]165 VISIT_BODY( node );
166}
167
168template< typename pass_type >
[ab904dc]169void PassVisitor< pass_type >::visit( UnionDecl * node ) {
[13932f14]170 VISIT_BODY( node );
171}
172
173template< typename pass_type >
[ab904dc]174void PassVisitor< pass_type >::visit( EnumDecl * node ) {
[13932f14]175 VISIT_BODY( node );
176}
177
178template< typename pass_type >
[ab904dc]179void PassVisitor< pass_type >::visit( TraitDecl * node ) {
[13932f14]180 VISIT_BODY( node );
181}
182
183template< typename pass_type >
[ab904dc]184void PassVisitor< pass_type >::visit( TypeDecl * node ) {
[13932f14]185 VISIT_BODY( node );
186}
187
188template< typename pass_type >
[ab904dc]189void PassVisitor< pass_type >::visit( TypedefDecl * node ) {
[13932f14]190 VISIT_BODY( node );
191}
192
193template< typename pass_type >
[ab904dc]194void PassVisitor< pass_type >::visit( AsmDecl * node ) {
[13932f14]195 VISIT_BODY( node );
196}
197
[9c1600c]198//--------------------------------------------------------------------------
199// CompoundStmt
[13932f14]200template< typename pass_type >
[ab904dc]201void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
[9c1600c]202 VISIT_START( node );
203 call_beginScope();
204
205 visitStatementList( node->get_kids() );
206
207 call_endScope();
208 VISIT_END( node );
[13932f14]209}
210
[296b2be]211template< typename pass_type >
212CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) {
213 MUTATE_START( node );
214 call_beginScope();
215
216 mutateStatementList( node->get_kids() );
217
218 call_endScope();
219 MUTATE_END( CompoundStmt, node );
220}
221
[9c1600c]222//--------------------------------------------------------------------------
223// ExprStmt
[13932f14]224template< typename pass_type >
[ab904dc]225void PassVisitor< pass_type >::visit( ExprStmt * node ) {
[9c1600c]226 VISIT_START( node );
227 call_beginScope();
228
229 visitExpression( node->get_expr() );
230
231 call_endScope();
232 VISIT_END( node );
[13932f14]233}
234
[296b2be]235template< typename pass_type >
236Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) {
237 MUTATE_START( node );
238
239 node->set_expr( mutateExpression( node->get_expr() ) );
240
241 MUTATE_END( Statement, node );
242}
243
[13932f14]244template< typename pass_type >
[ab904dc]245void PassVisitor< pass_type >::visit( AsmStmt * node ) {
[13932f14]246 VISIT_BODY( node );
247}
248
[9c1600c]249//--------------------------------------------------------------------------
250// IfStmt
[13932f14]251template< typename pass_type >
[ab904dc]252void PassVisitor< pass_type >::visit( IfStmt * node ) {
[9c1600c]253 VISIT_START( node );
254
255 visitExpression( node->get_condition() );
256 node->set_thenPart ( visitStatement( node->get_thenPart() ) );
257 node->set_elsePart ( visitStatement( node->get_elsePart() ) );
258
259 VISIT_END( node );
[13932f14]260}
261
[296b2be]262template< typename pass_type >
263Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) {
264 MUTATE_START( node );
265
266 node->set_condition( mutateExpression( node->get_condition() ) );
267 node->set_thenPart ( mutateStatement ( node->get_thenPart() ) );
268 node->set_elsePart ( mutateStatement ( node->get_elsePart() ) );
269
270 MUTATE_END( Statement, node );
271}
272
[9c1600c]273//--------------------------------------------------------------------------
274// WhileStmt
[13932f14]275template< typename pass_type >
[ab904dc]276void PassVisitor< pass_type >::visit( WhileStmt * node ) {
[9c1600c]277 VISIT_START( node );
278
279 visitExpression( node->get_condition() );
280 node->set_body( visitStatement( node->get_body() ) );
281
282 VISIT_END( node );
[13932f14]283}
284
[296b2be]285template< typename pass_type >
286Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) {
287 MUTATE_START( node );
288
289 node->set_condition( mutateExpression( node->get_condition() ) );
290 node->set_body( mutateStatement( node->get_body() ) );
291
292 MUTATE_END( Statement, node );
293}
294
[9c1600c]295//--------------------------------------------------------------------------
296// WhileStmt
[13932f14]297template< typename pass_type >
[ab904dc]298void PassVisitor< pass_type >::visit( ForStmt * node ) {
[9c1600c]299 VISIT_START( node );
300
301 acceptAll( node->get_initialization(), *this );
302 visitExpression( node->get_condition() );
303 visitExpression( node->get_increment() );
304 node->set_body( visitStatement( node->get_body() ) );
305
306 VISIT_END( node );
[13932f14]307}
308
[296b2be]309template< typename pass_type >
310Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) {
311 MUTATE_START( node );
312
313 mutateAll( node->get_initialization(), *this );
[9c1600c]314 node->set_condition( mutateExpression( node->get_condition() ) );
315 node->set_increment( mutateExpression( node->get_increment() ) );
316 node->set_body( mutateStatement( node->get_body() ) );
[296b2be]317
318 MUTATE_END( Statement, node );
319}
320
[9c1600c]321//--------------------------------------------------------------------------
322// SwitchStmt
[13932f14]323template< typename pass_type >
[ab904dc]324void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
[9c1600c]325 VISIT_START( node );
326
327 visitExpression( node->get_condition() );
328 visitStatementList( node->get_statements() );
329
330 VISIT_END( node );
[13932f14]331}
332
[296b2be]333template< typename pass_type >
334Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) {
335 MUTATE_START( node );
336
337 node->set_condition( mutateExpression( node->get_condition() ) );
338 mutateStatementList( node->get_statements() );
339
340 MUTATE_END( Statement, node );
341}
342
[9c1600c]343//--------------------------------------------------------------------------
344// SwitchStmt
[13932f14]345template< typename pass_type >
[ab904dc]346void PassVisitor< pass_type >::visit( CaseStmt * node ) {
[9c1600c]347 VISIT_START( node );
348
349 visitExpression( node->get_condition() );
350 visitStatementList( node->get_statements() );
351
352 VISIT_END( node );
[13932f14]353}
354
[296b2be]355template< typename pass_type >
356Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) {
357 MUTATE_START( node );
358
359 node->set_condition( mutateExpression( node->get_condition() ) );
360 mutateStatementList( node->get_statements() );
361
362 MUTATE_END( Statement, node );
363}
364
[13932f14]365template< typename pass_type >
[ab904dc]366void PassVisitor< pass_type >::visit( BranchStmt * node ) {
[13932f14]367 VISIT_BODY( node );
368}
369
[9c1600c]370//--------------------------------------------------------------------------
371// ReturnStmt
[13932f14]372template< typename pass_type >
[ab904dc]373void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
[9c1600c]374 VISIT_START( node );
375
376 visitExpression( node->get_expr() );
377
378 VISIT_END( node );
[13932f14]379}
380
[296b2be]381template< typename pass_type >
382Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) {
383 MUTATE_START( node );
384
385 node->set_expr( mutateExpression( node->get_expr() ) );
386
387 MUTATE_END( Statement, node );
388}
389
[9c1600c]390//--------------------------------------------------------------------------
391// TryStmt
[13932f14]392template< typename pass_type >
[ab904dc]393void PassVisitor< pass_type >::visit( TryStmt * node ) {
[9c1600c]394 VISIT_START( node );
395
396 maybeAccept( node->get_block(), *this );
397 acceptAll( node->get_catchers(), *this );
398
399 VISIT_END( node );
[13932f14]400}
401
[296b2be]402template< typename pass_type >
403Statement * PassVisitor< pass_type >::mutate( TryStmt * node ) {
404 MUTATE_START( node );
405
406 node->set_block( maybeMutate( node->get_block(), *this ) );
407 mutateAll( node->get_catchers(), *this );
408
409 MUTATE_END( Statement, node );
410}
411
[9c1600c]412//--------------------------------------------------------------------------
413// CatchStmt
[13932f14]414template< typename pass_type >
[ab904dc]415void PassVisitor< pass_type >::visit( CatchStmt * node ) {
[9c1600c]416 VISIT_START( node );
417
418 node->set_body( visitStatement( node->get_body() ) );
419 maybeAccept( node->get_decl(), *this );
420
421 VISIT_END( node );
[13932f14]422}
423
[296b2be]424template< typename pass_type >
425Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) {
426 MUTATE_START( node );
427
428 node->set_body( mutateStatement( node->get_body() ) );
429 node->set_decl( maybeMutate( node->get_decl(), *this ) );
430
431 MUTATE_END( Statement, node );
432}
433
[13932f14]434template< typename pass_type >
[ab904dc]435void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
[13932f14]436 VISIT_BODY( node );
437}
438
439template< typename pass_type >
[ab904dc]440void PassVisitor< pass_type >::visit( NullStmt * node ) {
[13932f14]441 VISIT_BODY( node );
442}
443
444template< typename pass_type >
[ab904dc]445void PassVisitor< pass_type >::visit( DeclStmt * node ) {
[13932f14]446 VISIT_BODY( node );
447}
448
449template< typename pass_type >
[ab904dc]450void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
[13932f14]451 VISIT_BODY( node );
452}
453
454template< typename pass_type >
[ab904dc]455void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
[13932f14]456 VISIT_BODY( node );
457}
458
[9c1600c]459//--------------------------------------------------------------------------
460// UntypedExpr
[13932f14]461template< typename pass_type >
[ab904dc]462void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
[9c1600c]463 VISIT_START( node );
464
465 for ( auto expr : node->get_args() ) {
466 visitExpression( expr );
467 }
468
469 VISIT_END( node );
[13932f14]470}
471
[296b2be]472template< typename pass_type >
473Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) {
474 MUTATE_START( node );
475
476 for ( auto& expr : node->get_args() ) {
477 expr = mutateExpression( expr );
478 }
479
480 MUTATE_END( Expression, node );
481}
482
[13932f14]483template< typename pass_type >
[ab904dc]484void PassVisitor< pass_type >::visit( NameExpr * node ) {
[13932f14]485 VISIT_BODY( node );
486}
487
488template< typename pass_type >
[ab904dc]489void PassVisitor< pass_type >::visit( CastExpr * node ) {
[13932f14]490 VISIT_BODY( node );
491}
492
493template< typename pass_type >
[ab904dc]494void PassVisitor< pass_type >::visit( AddressExpr * node ) {
[13932f14]495 VISIT_BODY( node );
496}
497
498template< typename pass_type >
[ab904dc]499void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {
[13932f14]500 VISIT_BODY( node );
501}
502
503template< typename pass_type >
[ab904dc]504void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) {
[13932f14]505 VISIT_BODY( node );
506}
507
508template< typename pass_type >
[ab904dc]509void PassVisitor< pass_type >::visit( MemberExpr * node ) {
[13932f14]510 VISIT_BODY( node );
511}
512
513template< typename pass_type >
[ab904dc]514void PassVisitor< pass_type >::visit( VariableExpr * node ) {
[13932f14]515 VISIT_BODY( node );
516}
517
518template< typename pass_type >
[ab904dc]519void PassVisitor< pass_type >::visit( ConstantExpr * node ) {
[13932f14]520 VISIT_BODY( node );
521}
522
523template< typename pass_type >
[ab904dc]524void PassVisitor< pass_type >::visit( SizeofExpr * node ) {
[13932f14]525 VISIT_BODY( node );
526}
527
528template< typename pass_type >
[ab904dc]529void PassVisitor< pass_type >::visit( AlignofExpr * node ) {
[13932f14]530 VISIT_BODY( node );
531}
532
533template< typename pass_type >
[ab904dc]534void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {
[13932f14]535 VISIT_BODY( node );
536}
537
538template< typename pass_type >
[ab904dc]539void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {
[13932f14]540 VISIT_BODY( node );
541}
542
543template< typename pass_type >
[ab904dc]544void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {
[13932f14]545 VISIT_BODY( node );
546}
547
548template< typename pass_type >
[ab904dc]549void PassVisitor< pass_type >::visit( AttrExpr * node ) {
[13932f14]550 VISIT_BODY( node );
551}
552
553template< typename pass_type >
[ab904dc]554void PassVisitor< pass_type >::visit( LogicalExpr * node ) {
[13932f14]555 VISIT_BODY( node );
556}
557
558template< typename pass_type >
[ab904dc]559void PassVisitor< pass_type >::visit( ConditionalExpr * node ) {
[13932f14]560 VISIT_BODY( node );
561}
562
563template< typename pass_type >
[ab904dc]564void PassVisitor< pass_type >::visit( CommaExpr * node ) {
[13932f14]565 VISIT_BODY( node );
566}
567
568template< typename pass_type >
[ab904dc]569void PassVisitor< pass_type >::visit( TypeExpr * node ) {
[13932f14]570 VISIT_BODY( node );
571}
572
573template< typename pass_type >
[ab904dc]574void PassVisitor< pass_type >::visit( AsmExpr * node ) {
[13932f14]575 VISIT_BODY( node );
576}
577
578template< typename pass_type >
[ab904dc]579void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) {
[13932f14]580 VISIT_BODY( node );
581}
582
583template< typename pass_type >
[ab904dc]584void PassVisitor< pass_type >::visit( ConstructorExpr * node ) {
[13932f14]585 VISIT_BODY( node );
586}
587
588template< typename pass_type >
[ab904dc]589void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) {
[13932f14]590 VISIT_BODY( node );
591}
592
593template< typename pass_type >
[ab904dc]594void PassVisitor< pass_type >::visit( UntypedValofExpr * node ) {
[13932f14]595 VISIT_BODY( node );
596}
597
598template< typename pass_type >
[ab904dc]599void PassVisitor< pass_type >::visit( RangeExpr * node ) {
[13932f14]600 VISIT_BODY( node );
601}
602
603template< typename pass_type >
[ab904dc]604void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) {
[13932f14]605 VISIT_BODY( node );
606}
607
608template< typename pass_type >
[ab904dc]609void PassVisitor< pass_type >::visit( TupleExpr * node ) {
[13932f14]610 VISIT_BODY( node );
611}
612
613template< typename pass_type >
[ab904dc]614void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) {
[13932f14]615 VISIT_BODY( node );
616}
617
618template< typename pass_type >
[ab904dc]619void PassVisitor< pass_type >::visit( MemberTupleExpr * node ) {
[13932f14]620 VISIT_BODY( node );
621}
622
623template< typename pass_type >
[ab904dc]624void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
[13932f14]625 VISIT_BODY( node );
626}
627
[9c1600c]628//--------------------------------------------------------------------------
629// UntypedExpr
[13932f14]630template< typename pass_type >
[ab904dc]631void PassVisitor< pass_type >::visit( StmtExpr * node ) {
[9c1600c]632 VISIT_START( node );
633
634 // don't want statements from outer CompoundStmts to be added to this StmtExpr
635 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
636 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
637 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
638
639 Visitor::visit( node );
640
641 VISIT_END( node );
[13932f14]642}
643
[296b2be]644template< typename pass_type >
645Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {
646 MUTATE_START( node );
647
648 // don't want statements from outer CompoundStmts to be added to this StmtExpr
[134322e]649 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
650 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
651 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]652
653 Mutator::mutate( node );
654
655 MUTATE_END( Expression, node );
656}
657
[13932f14]658template< typename pass_type >
[ab904dc]659void PassVisitor< pass_type >::visit( UniqueExpr * node ) {
[13932f14]660 VISIT_BODY( node );
661}
662
663template< typename pass_type >
[ab904dc]664void PassVisitor< pass_type >::visit( VoidType * node ) {
[13932f14]665 VISIT_BODY( node );
666}
667
668template< typename pass_type >
[ab904dc]669void PassVisitor< pass_type >::visit( BasicType * node ) {
[13932f14]670 VISIT_BODY( node );
671}
672
673template< typename pass_type >
[ab904dc]674void PassVisitor< pass_type >::visit( PointerType * node ) {
[13932f14]675 VISIT_BODY( node );
676}
677
678template< typename pass_type >
[ab904dc]679void PassVisitor< pass_type >::visit( ArrayType * node ) {
[13932f14]680 VISIT_BODY( node );
681}
682
683template< typename pass_type >
[ab904dc]684void PassVisitor< pass_type >::visit( FunctionType * node ) {
[13932f14]685 VISIT_BODY( node );
686}
687
688template< typename pass_type >
[ab904dc]689void PassVisitor< pass_type >::visit( StructInstType * node ) {
[13932f14]690 VISIT_BODY( node );
691}
692
693template< typename pass_type >
[ab904dc]694void PassVisitor< pass_type >::visit( UnionInstType * node ) {
[13932f14]695 VISIT_BODY( node );
696}
697
698template< typename pass_type >
[ab904dc]699void PassVisitor< pass_type >::visit( EnumInstType * node ) {
[13932f14]700 VISIT_BODY( node );
701}
702
703template< typename pass_type >
[ab904dc]704void PassVisitor< pass_type >::visit( TraitInstType * node ) {
[13932f14]705 VISIT_BODY( node );
706}
707
708template< typename pass_type >
[ab904dc]709void PassVisitor< pass_type >::visit( TypeInstType * node ) {
[13932f14]710 VISIT_BODY( node );
711}
712
713template< typename pass_type >
[ab904dc]714void PassVisitor< pass_type >::visit( TupleType * node ) {
[13932f14]715 VISIT_BODY( node );
716}
717
718template< typename pass_type >
[ab904dc]719void PassVisitor< pass_type >::visit( TypeofType * node ) {
[13932f14]720 VISIT_BODY( node );
721}
722
723template< typename pass_type >
[ab904dc]724void PassVisitor< pass_type >::visit( AttrType * node ) {
[13932f14]725 VISIT_BODY( node );
726}
727
728template< typename pass_type >
[ab904dc]729void PassVisitor< pass_type >::visit( VarArgsType * node ) {
[13932f14]730 VISIT_BODY( node );
731}
732
733template< typename pass_type >
[ab904dc]734void PassVisitor< pass_type >::visit( ZeroType * node ) {
[13932f14]735 VISIT_BODY( node );
736}
737
738template< typename pass_type >
[ab904dc]739void PassVisitor< pass_type >::visit( OneType * node ) {
[13932f14]740 VISIT_BODY( node );
741}
742
[9c1600c]743//--------------------------------------------------------------------------
744// UntypedExpr
[13932f14]745template< typename pass_type >
[ab904dc]746void PassVisitor< pass_type >::visit( SingleInit * node ) {
[9c1600c]747 VISIT_START( node );
748
749 visitExpression( node->get_value() );
750
751 VISIT_END( node );
[13932f14]752}
753
[296b2be]754template< typename pass_type >
755Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) {
756 MUTATE_START( node );
757
758 node->set_value( mutateExpression( node->get_value() ) );
759
760 MUTATE_END( Initializer, node );
761}
762
[13932f14]763template< typename pass_type >
[ab904dc]764void PassVisitor< pass_type >::visit( ListInit * node ) {
[13932f14]765 VISIT_BODY( node );
766}
767
768template< typename pass_type >
[ab904dc]769void PassVisitor< pass_type >::visit( ConstructorInit * node ) {
[13932f14]770 VISIT_BODY( node );
771}
772
773template< typename pass_type >
[ab904dc]774void PassVisitor< pass_type >::visit( Subrange * node ) {
[13932f14]775 VISIT_BODY( node );
776}
777
778template< typename pass_type >
[ab904dc]779void PassVisitor< pass_type >::visit( Constant * node ) {
[13932f14]780 VISIT_BODY( node );
781}
[ab904dc]782
783//---------------------------------------------------------------------------------------------------------------
784
785template< typename pass_type >
786DeclarationWithType * PassVisitor< pass_type >::mutate( ObjectDecl * node ) {
787 MUTATE_BODY( DeclarationWithType, node );
788}
789
790template< typename pass_type >
791DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) {
792 MUTATE_BODY( DeclarationWithType, node );
793}
794
795template< typename pass_type >
796Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) {
797 MUTATE_BODY( Declaration, node );
798}
799
800template< typename pass_type >
801Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) {
802 MUTATE_BODY( Declaration, node );
803}
804
805template< typename pass_type >
806Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) {
807 MUTATE_BODY( Declaration, node );
808}
809
810template< typename pass_type >
811Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) {
812 MUTATE_BODY( Declaration, node );
813}
814
815template< typename pass_type >
816TypeDecl * PassVisitor< pass_type >::mutate( TypeDecl * node ) {
817 MUTATE_BODY( TypeDecl, node );
818}
819
820template< typename pass_type >
821Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) {
822 MUTATE_BODY( Declaration, node );
823}
824
825template< typename pass_type >
826AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) {
827 MUTATE_BODY( AsmDecl, node );
828}
829
830template< typename pass_type >
831Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) {
832 MUTATE_BODY( Statement, node );
833}
834
835template< typename pass_type >
836Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) {
837 MUTATE_BODY( Statement, node );
838}
839
840template< typename pass_type >
841Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
842 MUTATE_BODY( Statement, node );
843}
844
845template< typename pass_type >
846NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
847 MUTATE_BODY( NullStmt, node );
848}
849
850template< typename pass_type >
851Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
852 MUTATE_BODY( Statement, node );
853}
854
855template< typename pass_type >
856Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
857 MUTATE_BODY( Statement, node );
858}
859
860template< typename pass_type >
861Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
862 MUTATE_BODY( Expression, node );
863}
864
865template< typename pass_type >
866Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) {
867 MUTATE_BODY( Expression, node );
868}
869
870template< typename pass_type >
871Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) {
872 MUTATE_BODY( Expression, node );
873}
874
875template< typename pass_type >
876Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) {
877 MUTATE_BODY( Expression, node );
878}
879
880template< typename pass_type >
881Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) {
882 MUTATE_BODY( Expression, node );
883}
884
885template< typename pass_type >
886Expression * PassVisitor< pass_type >::mutate( UntypedMemberExpr * node ) {
887 MUTATE_BODY( Expression, node );
888}
889
890template< typename pass_type >
891Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) {
892 MUTATE_BODY( Expression, node );
893}
894
895template< typename pass_type >
896Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) {
897 MUTATE_BODY( Expression, node );
898}
899
900template< typename pass_type >
901Expression * PassVisitor< pass_type >::mutate( ConstantExpr * node ) {
902 MUTATE_BODY( Expression, node );
903}
904
905template< typename pass_type >
906Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) {
907 MUTATE_BODY( Expression, node );
908}
909
910template< typename pass_type >
911Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) {
912 MUTATE_BODY( Expression, node );
913}
914
915template< typename pass_type >
916Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) {
917 MUTATE_BODY( Expression, node );
918}
919
920template< typename pass_type >
921Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) {
922 MUTATE_BODY( Expression, node );
923}
924
925template< typename pass_type >
926Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) {
927 MUTATE_BODY( Expression, node );
928}
929
930template< typename pass_type >
931Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {
932 MUTATE_BODY( Expression, node );
933}
934
935template< typename pass_type >
936Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) {
937 MUTATE_BODY( Expression, node );
938}
939
940template< typename pass_type >
941Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) {
942 MUTATE_BODY( Expression, node );
943}
944
945template< typename pass_type >
946Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) {
947 MUTATE_BODY( Expression, node );
948}
949
950template< typename pass_type >
951Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) {
952 MUTATE_BODY( Expression, node );
953}
954
955template< typename pass_type >
956Expression * PassVisitor< pass_type >::mutate( AsmExpr * node ) {
957 MUTATE_BODY( Expression, node );
958}
959
960template< typename pass_type >
961Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) {
962 MUTATE_BODY( Expression, node );
963}
964
965template< typename pass_type >
966Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) {
967 MUTATE_BODY( Expression, node );
968}
969
970template< typename pass_type >
971Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) {
972 MUTATE_BODY( Expression, node );
973}
974
975template< typename pass_type >
976Expression * PassVisitor< pass_type >::mutate( UntypedValofExpr * node ) {
977 MUTATE_BODY( Expression, node );
978}
979
980template< typename pass_type >
981Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) {
982 MUTATE_BODY( Expression, node );
983}
984
985template< typename pass_type >
986Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) {
987 MUTATE_BODY( Expression, node );
988}
989
990template< typename pass_type >
991Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) {
992 MUTATE_BODY( Expression, node );
993}
994
995template< typename pass_type >
996Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) {
997 MUTATE_BODY( Expression, node );
998}
999
1000template< typename pass_type >
1001Expression * PassVisitor< pass_type >::mutate( MemberTupleExpr * node ) {
1002 MUTATE_BODY( Expression, node );
1003}
1004
1005template< typename pass_type >
1006Expression * PassVisitor< pass_type >::mutate( TupleAssignExpr * node ) {
1007 MUTATE_BODY( Expression, node );
1008}
1009
1010template< typename pass_type >
1011Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) {
1012 MUTATE_BODY( Expression, node );
1013}
1014
1015template< typename pass_type >
1016Type * PassVisitor< pass_type >::mutate( VoidType * node ) {
1017 MUTATE_BODY( Type, node );
1018}
1019
1020template< typename pass_type >
1021Type * PassVisitor< pass_type >::mutate( BasicType * node ) {
1022 MUTATE_BODY( Type, node );
1023}
1024
1025template< typename pass_type >
1026Type * PassVisitor< pass_type >::mutate( PointerType * node ) {
1027 MUTATE_BODY( Type, node );
1028}
1029
1030template< typename pass_type >
1031Type * PassVisitor< pass_type >::mutate( ArrayType * node ) {
1032 MUTATE_BODY( Type, node );
1033}
1034
1035template< typename pass_type >
1036Type * PassVisitor< pass_type >::mutate( FunctionType * node ) {
1037 MUTATE_BODY( Type, node );
1038}
1039
1040template< typename pass_type >
1041Type * PassVisitor< pass_type >::mutate( StructInstType * node ) {
1042 MUTATE_BODY( Type, node );
1043}
1044
1045template< typename pass_type >
1046Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) {
1047 MUTATE_BODY( Type, node );
1048}
1049
1050template< typename pass_type >
1051Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) {
1052 MUTATE_BODY( Type, node );
1053}
1054
1055template< typename pass_type >
1056Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) {
1057 MUTATE_BODY( Type, node );
1058}
1059
1060template< typename pass_type >
1061Type * PassVisitor< pass_type >::mutate( TypeInstType * node ) {
1062 MUTATE_BODY( Type, node );
1063}
1064
1065template< typename pass_type >
1066Type * PassVisitor< pass_type >::mutate( TupleType * node ) {
1067 MUTATE_BODY( Type, node );
1068}
1069
1070template< typename pass_type >
1071Type * PassVisitor< pass_type >::mutate( TypeofType * node ) {
1072 MUTATE_BODY( Type, node );
1073}
1074
1075template< typename pass_type >
1076Type * PassVisitor< pass_type >::mutate( AttrType * node ) {
1077 MUTATE_BODY( Type, node );
1078}
1079
1080template< typename pass_type >
1081Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {
1082 MUTATE_BODY( Type, node );
1083}
1084
1085template< typename pass_type >
1086Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {
1087 MUTATE_BODY( Type, node );
1088}
1089
1090template< typename pass_type >
1091Type * PassVisitor< pass_type >::mutate( OneType * node ) {
1092 MUTATE_BODY( Type, node );
1093}
1094
1095template< typename pass_type >
1096Initializer * PassVisitor< pass_type >::mutate( ListInit * node ) {
1097 MUTATE_BODY( Initializer, node );
1098}
1099
1100template< typename pass_type >
1101Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) {
1102 MUTATE_BODY( Initializer, node );
1103}
1104
1105template< typename pass_type >
1106Subrange * PassVisitor< pass_type >::mutate( Subrange * node ) {
1107 MUTATE_BODY( Subrange, node );
1108}
1109
1110template< typename pass_type >
1111Constant * PassVisitor< pass_type >::mutate( Constant * node ) {
1112 MUTATE_BODY( Constant, node );
1113}
Note: See TracBrowser for help on using the repository browser.