source: src/Common/PassVisitor.impl.h @ 7dc09294

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since 7dc09294 was 96f9ef5, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Modify TypeDecl? mutate to return a Declaration

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