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

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 ea156ae was 5ea7a22, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Make Attribute a child of BaseSyntaxNode?

  • Property mode set to 100644
File size: 59.2 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();
[522363e]68        SemanticError errors;
[134322e]69
[6ca154b]70        for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
71                // splice in new declarations after previous decl
[d24d4e1]72                if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
[6ca154b]73
74                if ( i == decls.end() ) break;
75
[522363e]76                try {
77                        // run visitor on declaration
78                        maybeAccept( *i, visitor );
79                } catch( SemanticError &e ) {
80                        e.set_location( (*i)->location );
81                        errors.append( e );
82                }
[6ca154b]83
84                // splice in new declarations before current decl
85                if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
[134322e]86        }
[522363e]87        if ( ! errors.isEmpty() ) {
88                throw errors;
89        }
[6ca154b]90}
[134322e]91
[6ca154b]92template< typename pass_type >
93static inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) {
94
95        DeclList_t* beforeDecls = mutator.get_beforeDecls();
96        DeclList_t* afterDecls  = mutator.get_afterDecls();
[522363e]97        SemanticError errors;
[6ca154b]98
99        for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
100                // splice in new declarations after previous decl
[d24d4e1]101                if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
[6ca154b]102
103                if ( i == decls.end() ) break;
[522363e]104                try {
105                        // run mutator on declaration
106                        *i = maybeMutate( *i, mutator );
107                } catch( SemanticError &e ) {
108                        e.set_location( (*i)->location );
109                        errors.append( e );
110                }
[6ca154b]111
112                // splice in new declarations before current decl
113                if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
114        }
[522363e]115        if ( ! errors.isEmpty() ) {
116                throw errors;
117        }
[134322e]118}
119
[e0886db]120template< typename Container, typename VisitorType >
121inline void maybeAccept( Container &container, VisitorType &visitor ) {
122        SemanticError errors;
123        for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
124                try {
125                        if ( *i ) {
126                                (*i)->accept( visitor );
127                        }
128                } catch( SemanticError &e ) {
129                        e.set_location( (*i)->location );
130                        errors.append( e );
131                }
132        }
133        if ( ! errors.isEmpty() ) {
134                throw errors;
135        }
136}
137
138template< typename Container, typename MutatorType >
139inline void maybeMutateRef( Container &container, MutatorType &mutator ) {
140        SemanticError errors;
141        for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
142                try {
143                        if ( *i ) {
144///                 *i = (*i)->acceptMutator( mutator );
145                                *i = dynamic_cast< typename Container::value_type >( (*i)->acceptMutator( mutator ) );
146                                assert( *i );
147                        } // if
148                } catch( SemanticError &e ) {
149                        e.set_location( (*i)->location );
150                        errors.append( e );
151                } // try
152        } // for
153        if ( ! errors.isEmpty() ) {
154                throw errors;
155        } // if
156}
157
[296b2be]158template< typename pass_type >
[6ca154b]159template< typename func_t >
160void PassVisitor< pass_type >::handleStatementList( std::list< Statement * > & statements, func_t func ) {
[296b2be]161        SemanticError errors;
162
[2a7b3ca]163        // don't want statements from outer CompoundStmts to be added to this CompoundStmt
164        ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() );
165        ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () );
166        ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() );
167        ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () );
168
[134322e]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
[296b2be]174        for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
[6ca154b]175
176                if ( !empty( afterDecls ) ) { splice( std::inserter( statements, i ), afterDecls ); }
[134322e]177                if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
[6ca154b]178
[296b2be]179                try {
[6ca154b]180                        func( *i );
181                        assert(( empty( beforeStmts ) && empty( afterStmts ))
182                            || ( empty( beforeDecls ) && empty( afterDecls )) );
183
[296b2be]184                } catch ( SemanticError &e ) {
[aa685db]185                        e.set_location( (*i)->location );
[296b2be]186                        errors.append( e );
[134322e]187                }
[6ca154b]188
189                if ( !empty( beforeDecls ) ) { splice( std::inserter( statements, i ), beforeDecls ); }
[134322e]190                if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
[296b2be]191        }
[134322e]192
[6ca154b]193        if ( !empty( afterDecls ) ) { splice( std::back_inserter( statements ), afterDecls); }
[134322e]194        if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
195        if ( !errors.isEmpty() ) { throw errors; }
[296b2be]196}
197
198template< typename pass_type >
[6ca154b]199void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) {
200        handleStatementList( statements, [this]( Statement * stmt) {
201                stmt->accept( *this );
202        });
203}
[134322e]204
[6ca154b]205template< typename pass_type >
206void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) {
207        handleStatementList( statements, [this]( Statement *& stmt) {
208                stmt = stmt->acceptMutator( *this );
209        });
[134322e]210}
211
[6ca154b]212
[134322e]213template< typename pass_type >
[6ca154b]214template< typename func_t >
215Statement * PassVisitor< pass_type >::handleStatement( Statement * stmt, func_t func ) {
[134322e]216        // don't want statements from outer CompoundStmts to be added to this CompoundStmt
[6ca154b]217        ValueGuardPtr< TypeSubstitution * >  oldEnv        ( get_env_ptr    () );
218        ValueGuardPtr< DeclList_t >          oldBeforeDecls( get_beforeDecls() );
219        ValueGuardPtr< DeclList_t >          oldAfterDecls ( get_afterDecls () );
220        ValueGuardPtr< StmtList_t >          oldBeforeStmts( get_beforeStmts() );
221        ValueGuardPtr< StmtList_t >          oldAfterStmts ( get_afterStmts () );
[296b2be]222
[6ca154b]223        Statement *newStmt = func( stmt );
[134322e]224
225        StmtList_t* beforeStmts = get_beforeStmts();
226        StmtList_t* afterStmts  = get_afterStmts();
[6ca154b]227        DeclList_t* beforeDecls = get_beforeDecls();
228        DeclList_t* afterDecls  = get_afterDecls();
[134322e]229
[6ca154b]230        if( empty(beforeStmts) && empty(afterStmts) && empty(beforeDecls) && empty(afterDecls) ) { return newStmt; }
231        assert(( empty( beforeStmts ) && empty( afterStmts ))
232            || ( empty( beforeDecls ) && empty( afterDecls )) );
[134322e]233
234        CompoundStmt *compound = new CompoundStmt( noLabels );
[6ca154b]235        if( !empty(beforeDecls) ) { splice( std::back_inserter( compound->get_kids() ), beforeDecls ); }
[134322e]236        if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
237        compound->get_kids().push_back( newStmt );
[6ca154b]238        if( !empty(afterDecls) ) { splice( std::back_inserter( compound->get_kids() ), afterDecls ); }
[134322e]239        if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
240        return compound;
241}
242
243template< typename pass_type >
[6ca154b]244Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) {
245        return handleStatement( stmt, [this]( Statement * stmt ) {
[d24d4e1]246                maybeAccept( stmt, *this );
[6ca154b]247                return stmt;
248        });
249}
[134322e]250
[6ca154b]251template< typename pass_type >
252Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) {
253        return handleStatement( stmt, [this]( Statement * stmt ) {
254                return maybeMutate( stmt, *this );
255        });
[296b2be]256}
257
258template< typename pass_type >
[6ca154b]259template< typename func_t >
260Expression * PassVisitor< pass_type >::handleExpression( Expression * expr, func_t func ) {
[296b2be]261        if( !expr ) return nullptr;
262
[134322e]263        auto env_ptr = get_env_ptr();
264        if ( env_ptr && expr->get_env() ) {
265                *env_ptr = expr->get_env();
[296b2be]266        }
[6ca154b]267
268        // should env be cloned (or moved) onto the result of the mutate?
269        return func( expr );
270}
271
272template< typename pass_type >
273Expression * PassVisitor< pass_type >::visitExpression( Expression * expr ) {
274        return handleExpression(expr, [this]( Expression * expr ) {
275                expr->accept( *this );
276                return expr;
[d24d4e1]277        });
[296b2be]278}
[ab904dc]279
[6ca154b]280template< typename pass_type >
281Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) {
282        return handleExpression(expr, [this]( Expression * expr ) {
283                return expr->acceptMutator( *this );
284        });
285}
[ab904dc]286
[296b2be]287//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[e0886db]288//========================================================================================================================================================================
289//========================================================================================================================================================================
290//========================================================================================================================================================================
291//========================================================================================================================================================================
292//========================================================================================================================================================================
293//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[13932f14]294
[33a25f9]295// A NOTE ON THE ORDER OF TRAVERSAL
296//
297// Types and typedefs have their base types visited before they are added to the type table.  This is ok, since there is
298// no such thing as a recursive type or typedef.
299//
300//             typedef struct { T *x; } T; // never allowed
301//
302// for structs/unions, it is possible to have recursion, so the decl should be added as if it's incomplete to begin, the
303// members are traversed, and then the complete type should be added (assuming the type is completed by this particular
304// declaration).
305//
306//             struct T { struct T *x; }; // allowed
307//
308// It is important to add the complete type to the symbol table *after* the members/base has been traversed, since that
309// traversal may modify the definition of the type and these modifications should be visible when the symbol table is
310// queried later in this pass.
311//
312// TODO: figure out whether recursive contexts are sensible/possible/reasonable.
[e0886db]313
314//--------------------------------------------------------------------------
315// ObjectDecl
[13932f14]316template< typename pass_type >
[ab904dc]317void PassVisitor< pass_type >::visit( ObjectDecl * node ) {
[e0886db]318        VISIT_START( node );
319
320        indexerScopedAccept( node->type         , *this );
321        maybeAccept        ( node->init         , *this );
322        maybeAccept        ( node->bitfieldWidth, *this );
[5ea7a22]323        maybeAccept        ( node->attributes   , *this );
[e0886db]324
325        if ( node->name != "" ) {
326                indexerAddId( node );
327        }
328
329        VISIT_END( node );
330}
331
332template< typename pass_type >
333DeclarationWithType * PassVisitor< pass_type >::mutate( ObjectDecl * node ) {
334        MUTATE_START( node );
335
336        indexerScopedMutate( node->type         , *this );
337        maybeMutateRef     ( node->init         , *this );
338        maybeMutateRef     ( node->bitfieldWidth, *this );
[5ea7a22]339        maybeMutateRef     ( node->attributes   , *this );
[e0886db]340
341        if ( node->name != "" ) {
342                indexerAddId( node );
343        }
344
345        MUTATE_END( DeclarationWithType, node );
[13932f14]346}
347
[e0886db]348//--------------------------------------------------------------------------
349// FunctionDecl
[13932f14]350template< typename pass_type >
[ab904dc]351void PassVisitor< pass_type >::visit( FunctionDecl * node ) {
[e0886db]352        VISIT_START( node );
353
354        if ( node->name != "" ) {
355                indexerAddId( node );
356        }
357
358        {
359                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
360                maybeAccept( node->type, *this );
361                maybeAccept( node->statements, *this );
[5ea7a22]362                maybeAccept( node->attributes, *this );
[e0886db]363        }
364
365        VISIT_END( node );
366}
367
368template< typename pass_type >
369DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) {
370        MUTATE_START( node );
371
372        if ( node->name != "" ) {
373                indexerAddId( node );
374        }
375
376        {
377                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
378                maybeMutateRef( node->type, *this );
379                maybeMutateRef( node->statements, *this );
[5ea7a22]380                maybeMutateRef( node->attributes, *this );
[e0886db]381        }
382
383        MUTATE_END( DeclarationWithType, node );
[13932f14]384}
385
[e0886db]386//--------------------------------------------------------------------------
387// StructDecl
[13932f14]388template< typename pass_type >
[ab904dc]389void PassVisitor< pass_type >::visit( StructDecl * node ) {
[e0886db]390        VISIT_START( node );
391
392        // make up a forward declaration and add it before processing the members
393        // needs to be on the heap because addStruct saves the pointer
394        indexerAddStructFwd( node );
395
396        {
397                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
398                maybeAccept( node->parameters, *this );
399                maybeAccept( node->members   , *this );
400        }
401
402        // this addition replaces the forward declaration
403        indexerAddStruct( node );
404
405        VISIT_END( node );
406}
407
408template< typename pass_type >
409Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) {
410        MUTATE_START( node );
411
412        // make up a forward declaration and add it before processing the members
413        // needs to be on the heap because addStruct saves the pointer
414        indexerAddStructFwd( node );
415
416        {
417                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
418                maybeMutateRef( node->parameters, *this );
419                maybeMutateRef( node->members   , *this );
420        }
421
422        // this addition replaces the forward declaration
423        indexerAddStruct( node );
424
425        MUTATE_END( Declaration, node );
[13932f14]426}
427
[e0886db]428//--------------------------------------------------------------------------
429// UnionDecl
[13932f14]430template< typename pass_type >
[ab904dc]431void PassVisitor< pass_type >::visit( UnionDecl * node ) {
[e0886db]432        VISIT_START( node );
433
434        // make up a forward declaration and add it before processing the members
435        indexerAddUnionFwd( node );
436
437        {
438                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
439                maybeAccept( node->parameters, *this );
440                maybeAccept( node->members   , *this );
441        }
442
443        indexerAddUnion( node );
444
445        VISIT_END( node );
446}
447
448template< typename pass_type >
449Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) {
450        MUTATE_START( node );
451
452        // make up a forward declaration and add it before processing the members
453        indexerAddUnionFwd( node );
454
455        {
456                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
457                maybeMutateRef( node->parameters, *this );
458                maybeMutateRef( node->members   , *this );
459        }
460
461        indexerAddUnion( node );
462
463        MUTATE_END( Declaration, node );
[13932f14]464}
465
[e0886db]466//--------------------------------------------------------------------------
467// EnumDecl
[13932f14]468template< typename pass_type >
[ab904dc]469void PassVisitor< pass_type >::visit( EnumDecl * node ) {
[e0886db]470        VISIT_START( node );
471
472        indexerAddEnum( node );
473
[33a25f9]474        // unlike structs, traits, and unions, enums inject their members into the global scope
[e0886db]475        maybeAccept( node->parameters, *this );
476        maybeAccept( node->members   , *this );
477
478        VISIT_END( node );
[13932f14]479}
480
[e0886db]481template< typename pass_type >
482Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) {
483        MUTATE_START( node );
484
485        indexerAddEnum( node );
486
[522363e]487        // unlike structs, traits, and unions, enums inject their members into the global scope
[e0886db]488        maybeMutateRef( node->parameters, *this );
489        maybeMutateRef( node->members   , *this );
490
491        MUTATE_END( Declaration, node );
492}
493
494//--------------------------------------------------------------------------
495// TraitDecl
[13932f14]496template< typename pass_type >
[ab904dc]497void PassVisitor< pass_type >::visit( TraitDecl * node ) {
[e0886db]498        VISIT_START( node );
499
500        {
501                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
502                maybeAccept( node->parameters, *this );
503                maybeAccept( node->members   , *this );
504        }
505
506        indexerAddTrait( node );
507
508        VISIT_END( node );
[13932f14]509}
510
[e0886db]511template< typename pass_type >
512Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) {
513        MUTATE_START( node );
514
515        {
516                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
517                maybeMutateRef( node->parameters, *this );
518                maybeMutateRef( node->members   , *this );
519        }
520
521        indexerAddTrait( node );
522
523        MUTATE_END( Declaration, node );
524}
525
526//--------------------------------------------------------------------------
527// TypeDecl
[13932f14]528template< typename pass_type >
[ab904dc]529void PassVisitor< pass_type >::visit( TypeDecl * node ) {
[e0886db]530        VISIT_START( node );
531
532        {
533                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
534                maybeAccept( node->parameters, *this );
535                maybeAccept( node->base      , *this );
536        }
537
[33a25f9]538        // see A NOTE ON THE ORDER OF TRAVERSAL, above
539        // note that assertions come after the type is added to the symtab, since they are not part of the type proper
540        // and may depend on the type itself
[e0886db]541        indexerAddType( node );
542
543        maybeAccept( node->assertions, *this );
544
545        indexerScopedAccept( node->init, *this );
546
547        VISIT_END( node );
548}
549
550template< typename pass_type >
[982832e]551Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) {
[e0886db]552        MUTATE_START( node );
553
554        {
555                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
556                maybeMutateRef( node->parameters, *this );
557                maybeMutateRef( node->base      , *this );
558        }
559
[33a25f9]560        // see A NOTE ON THE ORDER OF TRAVERSAL, above
561        // note that assertions come after the type is added to the symtab, since they are not part of the type proper
562        // and may depend on the type itself
[e0886db]563        indexerAddType( node );
564
565        maybeMutateRef( node->assertions, *this );
566
567        indexerScopedMutate( node->init, *this );
568
[982832e]569        MUTATE_END( Declaration, node );
[13932f14]570}
571
[e0886db]572//--------------------------------------------------------------------------
573// TypedefDecl
[13932f14]574template< typename pass_type >
[ab904dc]575void PassVisitor< pass_type >::visit( TypedefDecl * node ) {
[e0886db]576        VISIT_START( node );
577
578        {
579                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
580                maybeAccept( node->parameters, *this );
581                maybeAccept( node->base      , *this );
582        }
583
584        indexerAddType( node );
585
586        maybeAccept( node->assertions, *this );
587
588        VISIT_END( node );
[13932f14]589}
590
591template< typename pass_type >
[e0886db]592Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) {
593        MUTATE_START( node );
594
595        {
596                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
597                maybeMutateRef     ( node->parameters, *this );
598                maybeMutateRef( node->base      , *this );
599        }
600
601        indexerAddType( node );
602
603        maybeMutateRef( node->assertions, *this );
604
605        MUTATE_END( Declaration, node );
[13932f14]606}
607
[9c1600c]608//--------------------------------------------------------------------------
[e0886db]609// AsmDecl
[13932f14]610template< typename pass_type >
[e0886db]611void PassVisitor< pass_type >::visit( AsmDecl * node ) {
[9c1600c]612        VISIT_START( node );
613
[e0886db]614        maybeAccept( node->stmt, *this );
[9c1600c]615
616        VISIT_END( node );
[13932f14]617}
618
[296b2be]619template< typename pass_type >
[e0886db]620AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) {
[296b2be]621        MUTATE_START( node );
622
[e0886db]623        maybeMutateRef( node->stmt, *this );
624
625        MUTATE_END( AsmDecl, node );
626}
627
628//--------------------------------------------------------------------------
629// CompoundStmt
630template< typename pass_type >
631void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
632        VISIT_START( node );
633        {
634                auto guard1 = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
635                auto guard2 = makeFuncGuard( [this]() { call_beginScope();   }, [this]() { call_endScope();     } );
636                visitStatementList( node->kids );
637        }
638        VISIT_END( node );
639}
[296b2be]640
[e0886db]641template< typename pass_type >
642CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) {
643        MUTATE_START( node );
644        {
645                auto guard1 = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
646                auto guard2 = makeFuncGuard( [this]() { call_beginScope();   }, [this]() { call_endScope();     } );
647                mutateStatementList( node->kids );
648        }
[296b2be]649        MUTATE_END( CompoundStmt, node );
650}
651
[9c1600c]652//--------------------------------------------------------------------------
653// ExprStmt
[13932f14]654template< typename pass_type >
[ab904dc]655void PassVisitor< pass_type >::visit( ExprStmt * node ) {
[9c1600c]656        VISIT_START( node );
657
[e0886db]658        visitExpression( node->expr );
[9c1600c]659
660        VISIT_END( node );
[13932f14]661}
662
[296b2be]663template< typename pass_type >
664Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) {
665        MUTATE_START( node );
666
[e0886db]667        node->expr = mutateExpression( node->expr );
[296b2be]668
669        MUTATE_END( Statement, node );
670}
671
[6ca154b]672//--------------------------------------------------------------------------
673// AsmStmt
[13932f14]674template< typename pass_type >
[ab904dc]675void PassVisitor< pass_type >::visit( AsmStmt * node ) {
[4551a6e]676        VISIT_BODY( node );
[13932f14]677}
678
[6ca154b]679template< typename pass_type >
680Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) {
681        MUTATE_BODY( Statement, node );
682}
683
[9c1600c]684//--------------------------------------------------------------------------
685// IfStmt
[13932f14]686template< typename pass_type >
[ab904dc]687void PassVisitor< pass_type >::visit( IfStmt * node ) {
[4551a6e]688        VISIT_START( node );
[33a25f9]689        {
690                // if statements introduce a level of scope (for the initialization)
691                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
692                acceptAll( node->get_initialization(), *this );
693                visitExpression( node->condition );
694                node->thenPart = visitStatement( node->thenPart );
695                node->elsePart = visitStatement( node->elsePart );
696        }
[9c1600c]697        VISIT_END( node );
[13932f14]698}
699
[296b2be]700template< typename pass_type >
701Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) {
[4551a6e]702        MUTATE_START( node );
[e0886db]703        {
[33a25f9]704                // if statements introduce a level of scope (for the initialization)
[e0886db]705                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
[33a25f9]706                maybeMutateRef( node->get_initialization(), *this );
[e0886db]707                node->condition = mutateExpression( node->condition );
708                node->thenPart  = mutateStatement ( node->thenPart  );
709                node->elsePart  = mutateStatement ( node->elsePart  );
710        }
[296b2be]711        MUTATE_END( Statement, node );
712}
713
[9c1600c]714//--------------------------------------------------------------------------
715// WhileStmt
[13932f14]716template< typename pass_type >
[ab904dc]717void PassVisitor< pass_type >::visit( WhileStmt * node ) {
[4551a6e]718        VISIT_START( node );
[9c1600c]719
[e0886db]720        visitExpression( node->condition );
721        node->body = visitStatement( node->body );
[9c1600c]722
723        VISIT_END( node );
[13932f14]724}
725
[296b2be]726template< typename pass_type >
727Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) {
[4551a6e]728        MUTATE_START( node );
[296b2be]729
[e0886db]730        node->condition = mutateExpression( node->condition );
731        node->body      = mutateStatement ( node->body      );
[296b2be]732
733        MUTATE_END( Statement, node );
734}
735
[9c1600c]736//--------------------------------------------------------------------------
[6ca154b]737// ForStmt
[13932f14]738template< typename pass_type >
[ab904dc]739void PassVisitor< pass_type >::visit( ForStmt * node ) {
[4551a6e]740        VISIT_START( node );
[e0886db]741        {
[33a25f9]742                // for statements introduce a level of scope (for the initialization)
[e0886db]743                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
744                maybeAccept( node->initialization, *this );
745                visitExpression( node->condition );
746                visitExpression( node->increment );
747                node->body = visitStatement( node->body );
748        }
[9c1600c]749        VISIT_END( node );
[13932f14]750}
751
[296b2be]752template< typename pass_type >
753Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) {
[4551a6e]754        MUTATE_START( node );
[e0886db]755        {
[33a25f9]756                // for statements introduce a level of scope (for the initialization)
[e0886db]757                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
758                maybeMutateRef( node->initialization, *this );
759                node->condition = mutateExpression( node->condition );
760                node->increment = mutateExpression( node->increment );
761                node->body      = mutateStatement ( node->body      );
762        }
[296b2be]763        MUTATE_END( Statement, node );
764}
765
[9c1600c]766//--------------------------------------------------------------------------
767// SwitchStmt
[13932f14]768template< typename pass_type >
[ab904dc]769void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
[4551a6e]770        VISIT_START( node );
[9c1600c]771
[e0886db]772        visitExpression   ( node->condition  );
773        visitStatementList( node->statements );
[9c1600c]774
775        VISIT_END( node );
[13932f14]776}
777
[296b2be]778template< typename pass_type >
779Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) {
[4551a6e]780        MUTATE_START( node );
781
[e0886db]782        node->condition = mutateExpression( node->condition );
783        mutateStatementList( node->statements );
[4551a6e]784
[296b2be]785        MUTATE_END( Statement, node );
786}
787
[9c1600c]788//--------------------------------------------------------------------------
[35df560]789// CaseStmt
[13932f14]790template< typename pass_type >
[ab904dc]791void PassVisitor< pass_type >::visit( CaseStmt * node ) {
[4551a6e]792        VISIT_START( node );
793
[e0886db]794        visitExpression   ( node->condition );
795        visitStatementList( node->stmts     );
[4551a6e]796
[9c1600c]797        VISIT_END( node );
[13932f14]798}
799
[296b2be]800template< typename pass_type >
801Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) {
[4551a6e]802        MUTATE_START( node );
803
[e0886db]804        node->condition = mutateExpression( node->condition );
805        mutateStatementList( node->stmts );
[4551a6e]806
[296b2be]807        MUTATE_END( Statement, node );
808}
809
[6ca154b]810//--------------------------------------------------------------------------
811// BranchStmt
[13932f14]812template< typename pass_type >
[ab904dc]813void PassVisitor< pass_type >::visit( BranchStmt * node ) {
[4551a6e]814        VISIT_BODY( node );
[13932f14]815}
816
[6ca154b]817template< typename pass_type >
818Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) {
819        MUTATE_BODY( Statement, node );
820}
821
[9c1600c]822//--------------------------------------------------------------------------
823// ReturnStmt
[13932f14]824template< typename pass_type >
[ab904dc]825void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
[9c1600c]826        VISIT_START( node );
827
[e0886db]828        visitExpression( node->expr );
[9c1600c]829
830        VISIT_END( node );
[13932f14]831}
832
[296b2be]833template< typename pass_type >
834Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) {
835        MUTATE_START( node );
836
[e0886db]837        node->expr = mutateExpression( node->expr );
[296b2be]838
839        MUTATE_END( Statement, node );
840}
841
[6e09f211]842//--------------------------------------------------------------------------
843// ThrowStmt
844
845template< typename pass_type >
846void PassVisitor< pass_type >::visit( ThrowStmt * node ) {
847        VISIT_BODY( node );
848}
849
850template< typename pass_type >
851Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) {
852        MUTATE_BODY( Statement, node );
853}
854
[9c1600c]855//--------------------------------------------------------------------------
856// TryStmt
[13932f14]857template< typename pass_type >
[ab904dc]858void PassVisitor< pass_type >::visit( TryStmt * node ) {
[9c1600c]859        VISIT_START( node );
860
[e0886db]861        maybeAccept( node->block       , *this );
[9dcb653]862        maybeAccept( node->handlers    , *this );
[e0886db]863        maybeAccept( node->finallyBlock, *this );
[9c1600c]864
865        VISIT_END( node );
[13932f14]866}
867
[296b2be]868template< typename pass_type >
869Statement * PassVisitor< pass_type >::mutate( TryStmt * node ) {
870        MUTATE_START( node );
871
[e0886db]872        maybeMutateRef( node->block       , *this );
[9dcb653]873        maybeMutateRef( node->handlers    , *this );
[e0886db]874        maybeMutateRef( node->finallyBlock, *this );
[4551a6e]875
[296b2be]876        MUTATE_END( Statement, node );
877}
878
[9c1600c]879//--------------------------------------------------------------------------
880// CatchStmt
[13932f14]881template< typename pass_type >
[ab904dc]882void PassVisitor< pass_type >::visit( CatchStmt * node ) {
[9c1600c]883        VISIT_START( node );
[e0886db]884        {
[33a25f9]885                // catch statements introduce a level of scope (for the caught exception)
[e0886db]886                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
887                maybeAccept( node->decl, *this );
888                node->cond = visitExpression( node->cond );
889                node->body = visitStatement ( node->body );
890        }
[9c1600c]891        VISIT_END( node );
[13932f14]892}
893
[296b2be]894template< typename pass_type >
895Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) {
896        MUTATE_START( node );
[e0886db]897        {
[33a25f9]898                // catch statements introduce a level of scope (for the caught exception)
[e0886db]899                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
900                maybeMutateRef( node->decl, *this );
901                node->cond = mutateExpression( node->cond );
902                node->body = mutateStatement ( node->body );
903        }
[296b2be]904        MUTATE_END( Statement, node );
905}
906
[2065609]907//--------------------------------------------------------------------------
908// FinallyStmt
[13932f14]909template< typename pass_type >
[ab904dc]910void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
[4551a6e]911        VISIT_BODY( node );
[13932f14]912}
913
[2065609]914template< typename pass_type >
915Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
916        MUTATE_BODY( Statement, node );
917}
918
919//--------------------------------------------------------------------------
920// WaitForStmt
921template< typename pass_type >
922void PassVisitor< pass_type >::visit( WaitForStmt * node ) {
923        VISIT_BODY( node );
924}
925
926template< typename pass_type >
927Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) {
928        MUTATE_BODY( Statement, node );
929}
930
931//--------------------------------------------------------------------------
932// NullStmt
[13932f14]933template< typename pass_type >
[ab904dc]934void PassVisitor< pass_type >::visit( NullStmt * node ) {
[4551a6e]935        VISIT_BODY( node );
[13932f14]936}
937
[2065609]938template< typename pass_type >
939NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
940        MUTATE_BODY( NullStmt, node );
941}
942
943//--------------------------------------------------------------------------
944// DeclStmt
[13932f14]945template< typename pass_type >
[ab904dc]946void PassVisitor< pass_type >::visit( DeclStmt * node ) {
[4551a6e]947        VISIT_BODY( node );
[13932f14]948}
949
[2065609]950template< typename pass_type >
951Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
952        MUTATE_BODY( Statement, node );
953}
954
955//--------------------------------------------------------------------------
956// ImplicitCtorDtorStmt
[13932f14]957template< typename pass_type >
[ab904dc]958void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
[4551a6e]959        VISIT_BODY( node );
[13932f14]960}
961
[2065609]962template< typename pass_type >
963Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
964        MUTATE_BODY( Statement, node );
965}
966
967//--------------------------------------------------------------------------
968// ApplicationExpr
[13932f14]969template< typename pass_type >
[ab904dc]970void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
[e0886db]971        VISIT_START( node );
972
973        indexerScopedAccept( node->result  , *this );
974        maybeAccept        ( node->function, *this );
[9dcb653]975        maybeAccept        ( node->args    , *this );
[e0886db]976
977        VISIT_END( node );
[13932f14]978}
979
[2065609]980template< typename pass_type >
981Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
[e0886db]982        MUTATE_START( node );
983
984        indexerScopedMutate( node->env     , *this );
985        indexerScopedMutate( node->result  , *this );
986        maybeMutateRef     ( node->function, *this );
[9dcb653]987        maybeMutateRef     ( node->args    , *this );
[e0886db]988
989        MUTATE_END( Expression, node );
[2065609]990}
991
[9c1600c]992//--------------------------------------------------------------------------
993// UntypedExpr
[13932f14]994template< typename pass_type >
[ab904dc]995void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
[9c1600c]996        VISIT_START( node );
997
[2a7b3ca]998        // maybeAccept( node->get_env(), *this );
[e0886db]999        indexerScopedAccept( node->result, *this );
[2a7b3ca]1000
[e0886db]1001        for ( auto expr : node->args ) {
[9c1600c]1002                visitExpression( expr );
1003        }
1004
1005        VISIT_END( node );
[13932f14]1006}
1007
[296b2be]1008template< typename pass_type >
1009Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) {
1010        MUTATE_START( node );
1011
[e0886db]1012        indexerScopedMutate( node->env   , *this );
1013        indexerScopedMutate( node->result, *this );
[2a7b3ca]1014
[e0886db]1015        for ( auto& expr : node->args ) {
[296b2be]1016                expr = mutateExpression( expr );
1017        }
1018
1019        MUTATE_END( Expression, node );
1020}
1021
[e0886db]1022//--------------------------------------------------------------------------
1023// NameExpr
[13932f14]1024template< typename pass_type >
[ab904dc]1025void PassVisitor< pass_type >::visit( NameExpr * node ) {
[e0886db]1026        VISIT_START( node );
1027
1028        indexerScopedAccept( node->result, *this );
1029
1030        VISIT_END( node );
[13932f14]1031}
1032
1033template< typename pass_type >
[e0886db]1034Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) {
1035        MUTATE_START( node );
1036
1037        indexerScopedMutate( node->env   , *this );
1038        indexerScopedMutate( node->result, *this );
1039
1040        MUTATE_END( Expression, node );
[13932f14]1041}
1042
[e0886db]1043//--------------------------------------------------------------------------
1044// CastExpr
[a5f0529]1045template< typename pass_type >
[e0886db]1046void PassVisitor< pass_type >::visit( CastExpr * node ) {
1047        VISIT_START( node );
1048
1049        indexerScopedAccept( node->result, *this );
1050        maybeAccept        ( node->arg   , *this );
1051
1052        VISIT_END( node );
[a5f0529]1053}
1054
[13932f14]1055template< typename pass_type >
[e0886db]1056Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) {
1057        MUTATE_START( node );
1058
1059        indexerScopedMutate( node->env   , *this );
1060        indexerScopedMutate( node->result, *this );
1061        maybeMutateRef     ( node->arg   , *this );
1062
1063        MUTATE_END( Expression, node );
[13932f14]1064}
1065
[e0886db]1066//--------------------------------------------------------------------------
1067// VirtualCastExpr
[13932f14]1068template< typename pass_type >
[e0886db]1069void PassVisitor< pass_type >::visit( VirtualCastExpr * node ) {
1070        VISIT_START( node );
1071
1072        indexerScopedAccept( node->result, *this );
1073        maybeAccept( node->arg, *this );
1074
1075        VISIT_END( node );
[13932f14]1076}
1077
1078template< typename pass_type >
[e0886db]1079Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) {
1080        MUTATE_START( node );
1081
1082        indexerScopedMutate( node->env   , *this );
1083        indexerScopedMutate( node->result, *this );
1084        maybeMutateRef     ( node->arg   , *this );
1085
1086        MUTATE_END( Expression, node );
[13932f14]1087}
1088
[e0886db]1089//--------------------------------------------------------------------------
1090// AddressExpr
[13932f14]1091template< typename pass_type >
[e0886db]1092void PassVisitor< pass_type >::visit( AddressExpr * node ) {
1093        VISIT_START( node );
1094
1095        indexerScopedAccept( node->result, *this );
1096        maybeAccept        ( node->arg   , *this );
1097
1098        VISIT_END( node );
[13932f14]1099}
1100
1101template< typename pass_type >
[e0886db]1102Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) {
1103        MUTATE_START( node );
1104
1105        indexerScopedMutate( node->env   , *this );
1106        indexerScopedMutate( node->result, *this );
1107        maybeMutateRef     ( node->arg   , *this );
1108
1109        MUTATE_END( Expression, node );
1110}
1111
1112//--------------------------------------------------------------------------
1113// LabelAddressExpr
1114template< typename pass_type >
1115void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {
1116        VISIT_START( node );
1117
1118        indexerScopedAccept( node->result, *this );
1119
1120        VISIT_END( node );
1121}
1122
1123template< typename pass_type >
1124Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) {
1125        MUTATE_START( node );
1126
1127        indexerScopedMutate( node->env   , *this );
1128        indexerScopedMutate( node->result, *this );
1129
1130        MUTATE_END( Expression, node );
1131}
1132
1133//--------------------------------------------------------------------------
1134// UntypedMemberExpr
1135template< typename pass_type >
1136void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) {
1137        VISIT_START( node );
1138
1139        indexerScopedAccept( node->result   , *this );
1140        maybeAccept        ( node->aggregate, *this );
1141        maybeAccept        ( node->member   , *this );
1142
1143        VISIT_END( node );
[13932f14]1144}
1145
[e0886db]1146template< typename pass_type >
1147Expression * PassVisitor< pass_type >::mutate( UntypedMemberExpr * node ) {
1148        MUTATE_START( node );
1149
1150        indexerScopedMutate( node->env      , *this );
1151        indexerScopedMutate( node->result   , *this );
1152        maybeMutateRef     ( node->aggregate, *this );
1153        maybeMutateRef     ( node->member   , *this );
1154
1155        MUTATE_END( Expression, node );
1156}
1157
1158//--------------------------------------------------------------------------
1159// MemberExpr
1160template< typename pass_type >
1161void PassVisitor< pass_type >::visit( MemberExpr * node ) {
1162        VISIT_START( node );
1163
1164        indexerScopedAccept( node->result   , *this );
1165        maybeAccept        ( node->aggregate, *this );
1166
1167        VISIT_END( node );
1168}
1169
1170template< typename pass_type >
1171Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) {
1172        MUTATE_START( node );
1173
1174        indexerScopedMutate( node->env      , *this );
1175        indexerScopedMutate( node->result   , *this );
1176        maybeMutateRef     ( node->aggregate, *this );
1177
1178        MUTATE_END( Expression, node );
1179}
1180
1181//--------------------------------------------------------------------------
1182// VariableExpr
1183template< typename pass_type >
1184void PassVisitor< pass_type >::visit( VariableExpr * node ) {
1185        VISIT_START( node );
1186
1187        indexerScopedAccept( node->result, *this );
1188
1189        VISIT_END( node );
1190}
1191
1192template< typename pass_type >
1193Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) {
1194        MUTATE_START( node );
1195
1196        indexerScopedMutate( node->env   , *this );
1197        indexerScopedMutate( node->result, *this );
1198
1199        MUTATE_END( Expression, node );
1200}
1201
1202//--------------------------------------------------------------------------
1203// ConstantExpr
[13932f14]1204template< typename pass_type >
[ab904dc]1205void PassVisitor< pass_type >::visit( ConstantExpr * node ) {
[e0886db]1206        VISIT_START( node );
1207
1208        indexerScopedAccept( node->result   , *this );
1209        maybeAccept        ( &node->constant, *this );
1210
1211        VISIT_END( node );
[13932f14]1212}
1213
[e0886db]1214template< typename pass_type >
1215Expression * PassVisitor< pass_type >::mutate( ConstantExpr * node ) {
1216        MUTATE_START( node );
1217
1218        indexerScopedMutate( node->env   , *this );
1219        indexerScopedMutate( node->result, *this );
1220        node->constant = *maybeMutate( &node->constant, *this );
1221
1222        MUTATE_END( Expression, node );
1223}
1224
1225//--------------------------------------------------------------------------
1226// SizeofExpr
[13932f14]1227template< typename pass_type >
[ab904dc]1228void PassVisitor< pass_type >::visit( SizeofExpr * node ) {
[e0886db]1229        VISIT_START( node );
1230
1231        indexerScopedAccept( node->result, *this );
1232        if ( node->get_isType() ) {
1233                maybeAccept( node->type, *this );
1234        } else {
1235                maybeAccept( node->expr, *this );
1236        }
1237
1238        VISIT_END( node );
[13932f14]1239}
1240
[e0886db]1241template< typename pass_type >
1242Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) {
1243        MUTATE_START( node );
1244
1245        indexerScopedMutate( node->env   , *this );
1246        indexerScopedMutate( node->result, *this );
1247        if ( node->get_isType() ) {
1248                maybeMutateRef( node->type, *this );
1249        } else {
1250                maybeMutateRef( node->expr, *this );
1251        }
1252
1253        MUTATE_END( Expression, node );
1254}
1255
1256//--------------------------------------------------------------------------
1257// AlignofExpr
[13932f14]1258template< typename pass_type >
[ab904dc]1259void PassVisitor< pass_type >::visit( AlignofExpr * node ) {
[e0886db]1260        VISIT_START( node );
1261
1262        indexerScopedAccept( node->result, *this );
1263        if ( node->get_isType() ) {
1264                maybeAccept( node->type, *this );
1265        } else {
1266                maybeAccept( node->expr, *this );
1267        }
1268
1269        VISIT_END( node );
[13932f14]1270}
1271
[e0886db]1272template< typename pass_type >
1273Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) {
1274        MUTATE_START( node );
1275
1276        indexerScopedMutate( node->env   , *this );
1277        indexerScopedMutate( node->result, *this );
1278        if ( node->get_isType() ) {
1279                maybeMutateRef( node->type, *this );
1280        } else {
1281                maybeMutateRef( node->expr, *this );
1282        }
1283
1284        MUTATE_END( Expression, node );
1285}
1286
1287//--------------------------------------------------------------------------
1288// UntypedOffsetofExpr
[13932f14]1289template< typename pass_type >
[ab904dc]1290void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {
[e0886db]1291        VISIT_START( node );
1292
1293        indexerScopedAccept( node->result, *this );
1294        maybeAccept        ( node->type  , *this );
1295
1296        VISIT_END( node );
[13932f14]1297}
1298
[e0886db]1299template< typename pass_type >
1300Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) {
1301        MUTATE_START( node );
1302
1303        indexerScopedMutate( node->env   , *this );
1304        indexerScopedMutate( node->result, *this );
1305        maybeMutateRef     ( node->type  , *this );
1306
1307        MUTATE_END( Expression, node );
1308}
1309
1310//--------------------------------------------------------------------------
1311// OffsetofExpr
[13932f14]1312template< typename pass_type >
[ab904dc]1313void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {
[e0886db]1314        VISIT_START( node );
1315
1316        indexerScopedAccept( node->result, *this );
1317        maybeAccept        ( node->type  , *this );
1318        maybeAccept        ( node->member, *this );
1319
1320        VISIT_END( node );
[13932f14]1321}
1322
[e0886db]1323template< typename pass_type >
1324Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) {
1325        MUTATE_START( node );
1326
1327        indexerScopedMutate( node->env   , *this );
1328        indexerScopedMutate( node->result, *this );
1329        maybeMutateRef     ( node->type  , *this );
1330        maybeMutateRef     ( node->member, *this );
1331
1332        MUTATE_END( Expression, node );
1333}
1334
1335//--------------------------------------------------------------------------
1336// OffsetPackExpr
[13932f14]1337template< typename pass_type >
[ab904dc]1338void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {
[e0886db]1339        VISIT_START( node );
1340
1341        indexerScopedAccept( node->result, *this );
1342        maybeAccept        ( node->type  , *this );
1343
1344        VISIT_END( node );
[13932f14]1345}
1346
[e0886db]1347template< typename pass_type >
1348Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) {
1349        MUTATE_START( node );
1350
1351        indexerScopedMutate( node->env   , *this );
1352        indexerScopedMutate( node->result, *this );
1353        maybeMutateRef     ( node->type  , *this );
1354
1355        MUTATE_END( Expression, node );
1356}
1357
1358//--------------------------------------------------------------------------
1359// AttrExpr
[13932f14]1360template< typename pass_type >
[ab904dc]1361void PassVisitor< pass_type >::visit( AttrExpr * node ) {
[e0886db]1362        VISIT_START( node );
1363
1364        indexerScopedAccept( node->result, *this );
1365        if ( node->get_isType() ) {
1366                maybeAccept( node->type, *this );
1367        } else {
1368                maybeAccept( node->expr, *this );
1369        }
1370
1371        VISIT_END( node );
1372}
1373
1374template< typename pass_type >
1375Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {
1376        MUTATE_START( node );
1377
1378        indexerScopedMutate( node->env   , *this );
1379        indexerScopedMutate( node->result, *this );
1380        if ( node->get_isType() ) {
1381                maybeMutateRef( node->type, *this );
1382        } else {
1383                maybeMutateRef( node->expr, *this );
1384        }
1385
1386        MUTATE_END( Expression, node );
[13932f14]1387}
1388
[e0886db]1389//--------------------------------------------------------------------------
1390// LogicalExpr
[13932f14]1391template< typename pass_type >
[ab904dc]1392void PassVisitor< pass_type >::visit( LogicalExpr * node ) {
[e0886db]1393        VISIT_START( node );
1394
1395        indexerScopedAccept( node->result, *this );
1396        maybeAccept        ( node->arg1  , *this );
1397        maybeAccept        ( node->arg2  , *this );
1398
1399        VISIT_END( node );
1400}
1401
1402template< typename pass_type >
1403Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) {
1404        MUTATE_START( node );
1405
1406        indexerScopedMutate( node->env   , *this );
1407        indexerScopedMutate( node->result, *this );
1408        maybeMutateRef     ( node->arg1  , *this );
1409        maybeMutateRef     ( node->arg2  , *this );
1410
1411        MUTATE_END( Expression, node );
[13932f14]1412}
1413
[e0886db]1414//--------------------------------------------------------------------------
1415// ConditionalExpr
[13932f14]1416template< typename pass_type >
[ab904dc]1417void PassVisitor< pass_type >::visit( ConditionalExpr * node ) {
[e0886db]1418        VISIT_START( node );
1419
1420        indexerScopedAccept( node->result, *this );
1421        maybeAccept        ( node->arg1  , *this );
1422        maybeAccept        ( node->arg2  , *this );
1423        maybeAccept        ( node->arg3  , *this );
1424
1425        VISIT_END( node );
[13932f14]1426}
1427
[e0886db]1428template< typename pass_type >
1429Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) {
1430        MUTATE_START( node );
1431
1432        indexerScopedMutate( node->env   , *this );
1433        indexerScopedMutate( node->result, *this );
1434        maybeMutateRef     ( node->arg1  , *this );
1435        maybeMutateRef     ( node->arg2  , *this );
1436        maybeMutateRef     ( node->arg3  , *this );
1437
1438        MUTATE_END( Expression, node );
1439}
1440
1441//--------------------------------------------------------------------------
1442// CommaExpr
[13932f14]1443template< typename pass_type >
[ab904dc]1444void PassVisitor< pass_type >::visit( CommaExpr * node ) {
[e0886db]1445        VISIT_START( node );
1446
1447        indexerScopedAccept( node->result, *this );
1448        maybeAccept        ( node->arg1  , *this );
1449        maybeAccept        ( node->arg2  , *this );
1450
1451        VISIT_END( node );
1452}
1453
1454template< typename pass_type >
1455Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) {
1456        MUTATE_START( node );
1457
1458        indexerScopedMutate( node->env   , *this );
1459        indexerScopedMutate( node->result, *this );
1460        maybeMutateRef     ( node->arg1  , *this );
1461        maybeMutateRef     ( node->arg2  , *this );
1462
1463        MUTATE_END( Expression, node );
[13932f14]1464}
1465
[e0886db]1466//--------------------------------------------------------------------------
1467// TypeExpr
[13932f14]1468template< typename pass_type >
[ab904dc]1469void PassVisitor< pass_type >::visit( TypeExpr * node ) {
[e0886db]1470        VISIT_START( node );
1471
1472        indexerScopedAccept( node->result, *this );
1473        maybeAccept        ( node->type, *this );
1474
1475        VISIT_END( node );
[13932f14]1476}
1477
[e0886db]1478template< typename pass_type >
1479Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) {
1480        MUTATE_START( node );
1481
1482        indexerScopedMutate( node->env   , *this );
1483        indexerScopedMutate( node->result, *this );
1484        maybeMutateRef     ( node->type  , *this );
1485
1486        MUTATE_END( Expression, node );
1487}
1488
1489//--------------------------------------------------------------------------
1490// AsmExpr
[13932f14]1491template< typename pass_type >
[ab904dc]1492void PassVisitor< pass_type >::visit( AsmExpr * node ) {
[e0886db]1493        VISIT_START( node );
1494
1495        indexerScopedAccept( node->result    , *this );
1496        maybeAccept        ( node->inout     , *this );
1497        maybeAccept        ( node->constraint, *this );
1498        maybeAccept        ( node->operand   , *this );
1499
1500        VISIT_END( node );
[13932f14]1501}
1502
[e0886db]1503template< typename pass_type >
1504Expression * PassVisitor< pass_type >::mutate( AsmExpr * node ) {
1505        MUTATE_START( node );
1506
1507        indexerScopedMutate( node->env       , *this );
1508        indexerScopedMutate( node->result    , *this );
1509        maybeMutateRef     ( node->inout     , *this );
1510        maybeMutateRef     ( node->constraint, *this );
1511        maybeMutateRef     ( node->operand   , *this );
1512
1513        MUTATE_END( Expression, node );
1514}
1515
1516//--------------------------------------------------------------------------
1517// ImplicitCopyCtorExpr
[13932f14]1518template< typename pass_type >
[ab904dc]1519void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) {
[e0886db]1520        VISIT_START( node );
1521
1522        indexerScopedAccept( node->result     , *this );
1523        maybeAccept        ( node->callExpr   , *this );
[9dcb653]1524        maybeAccept        ( node->tempDecls  , *this );
1525        maybeAccept        ( node->returnDecls, *this );
1526        maybeAccept        ( node->dtors      , *this );
[e0886db]1527
1528        VISIT_END( node );
1529}
1530
1531template< typename pass_type >
1532Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) {
1533        MUTATE_START( node );
1534
1535        indexerScopedMutate( node->env        , *this );
1536        indexerScopedMutate( node->result     , *this );
1537        maybeMutateRef     ( node->callExpr   , *this );
[9dcb653]1538        maybeMutateRef     ( node->tempDecls  , *this );
1539        maybeMutateRef     ( node->returnDecls, *this );
1540        maybeMutateRef     ( node->dtors      , *this );
[e0886db]1541
1542        MUTATE_END( Expression, node );
[13932f14]1543}
1544
[e0886db]1545//--------------------------------------------------------------------------
1546// ConstructorExpr
[13932f14]1547template< typename pass_type >
[ab904dc]1548void PassVisitor< pass_type >::visit( ConstructorExpr * node ) {
[e0886db]1549        VISIT_START( node );
1550
1551        indexerScopedAccept( node->result  , *this );
1552        maybeAccept        ( node->callExpr, *this );
1553
1554        VISIT_END( node );
1555}
1556
1557template< typename pass_type >
1558Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) {
1559        MUTATE_START( node );
1560
1561        indexerScopedMutate( node->env     , *this );
1562        indexerScopedMutate( node->result  , *this );
1563        maybeMutateRef     ( node->callExpr, *this );
1564
1565        MUTATE_END( Expression, node );
[13932f14]1566}
1567
[e0886db]1568//--------------------------------------------------------------------------
1569// CompoundLiteralExpr
[13932f14]1570template< typename pass_type >
[ab904dc]1571void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) {
[e0886db]1572        VISIT_START( node );
1573
1574        indexerScopedAccept( node->result     , *this );
1575        maybeAccept        ( node->initializer, *this );
1576
1577        VISIT_END( node );
[13932f14]1578}
1579
[e0886db]1580template< typename pass_type >
1581Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) {
1582        MUTATE_START( node );
1583
1584        indexerScopedMutate( node->env        , *this );
1585        indexerScopedMutate( node->result     , *this );
1586        maybeMutateRef     ( node->initializer, *this );
1587
1588        MUTATE_END( Expression, node );
1589}
1590
1591//--------------------------------------------------------------------------
1592// RangeExpr
[13932f14]1593template< typename pass_type >
[ab904dc]1594void PassVisitor< pass_type >::visit( RangeExpr * node ) {
[e0886db]1595        VISIT_START( node );
1596
1597        indexerScopedAccept( node->result, *this );
1598        maybeAccept        ( node->low   , *this );
1599        maybeAccept        ( node->high  , *this );
1600
1601        VISIT_END( node );
[13932f14]1602}
1603
[e0886db]1604template< typename pass_type >
1605Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) {
1606        MUTATE_START( node );
1607
1608        indexerScopedMutate( node->env   , *this );
1609        indexerScopedMutate( node->result, *this );
1610        maybeMutateRef     ( node->low   , *this );
1611        maybeMutateRef     ( node->high  , *this );
1612
1613        MUTATE_END( Expression, node );
1614}
1615
1616//--------------------------------------------------------------------------
1617// UntypedTupleExpr
[13932f14]1618template< typename pass_type >
[ab904dc]1619void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) {
[e0886db]1620        VISIT_START( node );
1621
1622        indexerScopedAccept( node->result, *this );
[9dcb653]1623        maybeAccept        ( node->exprs , *this );
[e0886db]1624
1625        VISIT_END( node );
1626}
1627
1628template< typename pass_type >
1629Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) {
1630        MUTATE_START( node );
1631
1632        indexerScopedMutate( node->env   , *this );
1633        indexerScopedMutate( node->result, *this );
[9dcb653]1634        maybeMutateRef     ( node->exprs , *this );
[e0886db]1635
1636        MUTATE_END( Expression, node );
1637}
1638
1639//--------------------------------------------------------------------------
1640// TupleExpr
1641template< typename pass_type >
1642void PassVisitor< pass_type >::visit( TupleExpr * node ) {
1643        VISIT_START( node );
1644
1645        indexerScopedAccept( node->result, *this );
1646        maybeAccept          ( node->exprs , *this );
1647
1648        VISIT_END( node );
1649}
1650
1651template< typename pass_type >
1652Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) {
1653        MUTATE_START( node );
1654
1655        indexerScopedMutate( node->env   , *this );
1656        indexerScopedMutate( node->result, *this );
[9dcb653]1657        maybeMutateRef     ( node->exprs , *this );
[e0886db]1658
1659        MUTATE_END( Expression, node );
1660}
1661
1662//--------------------------------------------------------------------------
1663// TupleIndexExpr
1664template< typename pass_type >
1665void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) {
1666        VISIT_START( node );
1667
1668        indexerScopedAccept( node->result, *this );
1669        maybeAccept        ( node->tuple , *this );
1670
1671        VISIT_END( node );
1672}
1673
1674template< typename pass_type >
1675Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) {
1676        MUTATE_START( node );
1677
1678        indexerScopedMutate( node->env   , *this );
1679        indexerScopedMutate( node->result, *this );
1680        maybeMutateRef     ( node->tuple , *this );
1681
1682        MUTATE_END( Expression, node );
1683}
1684
1685//--------------------------------------------------------------------------
1686// TupleAssignExpr
1687template< typename pass_type >
1688void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
1689        VISIT_START( node );
1690
1691        indexerScopedAccept( node->result  , *this );
1692        maybeAccept        ( node->stmtExpr, *this );
1693
1694        VISIT_END( node );
[13932f14]1695}
1696
1697template< typename pass_type >
[e0886db]1698Expression * PassVisitor< pass_type >::mutate( TupleAssignExpr * node ) {
1699        MUTATE_START( node );
[13932f14]1700
[e0886db]1701        indexerScopedMutate( node->env     , *this );
1702        indexerScopedMutate( node->result  , *this );
1703        maybeMutateRef     ( node->stmtExpr, *this );
[13932f14]1704
[e0886db]1705        MUTATE_END( Expression, node );
[13932f14]1706}
1707
[9c1600c]1708//--------------------------------------------------------------------------
[e0886db]1709// StmtExpr
[13932f14]1710template< typename pass_type >
[ab904dc]1711void PassVisitor< pass_type >::visit( StmtExpr * node ) {
[9c1600c]1712        VISIT_START( node );
1713
1714        // don't want statements from outer CompoundStmts to be added to this StmtExpr
1715        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
1716        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
1717        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
1718
[e0886db]1719        indexerScopedAccept( node->result     , *this );
1720        maybeAccept        ( node->statements , *this );
[9dcb653]1721        maybeAccept        ( node->returnDecls, *this );
1722        maybeAccept        ( node->dtors      , *this );
[9c1600c]1723
1724        VISIT_END( node );
[13932f14]1725}
1726
[296b2be]1727template< typename pass_type >
1728Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {
1729        MUTATE_START( node );
[4551a6e]1730
[296b2be]1731        // don't want statements from outer CompoundStmts to be added to this StmtExpr
[134322e]1732        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
1733        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
1734        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]1735
[e0886db]1736        indexerScopedMutate( node->result     , *this );
1737        maybeMutateRef     ( node->statements , *this );
[9dcb653]1738        maybeMutateRef     ( node->returnDecls, *this );
1739        maybeMutateRef     ( node->dtors      , *this );
[296b2be]1740
1741        MUTATE_END( Expression, node );
1742}
1743
[e0886db]1744//--------------------------------------------------------------------------
1745// UniqueExpr
[13932f14]1746template< typename pass_type >
[ab904dc]1747void PassVisitor< pass_type >::visit( UniqueExpr * node ) {
[e0886db]1748        VISIT_START( node );
1749
1750        indexerScopedAccept( node->result, *this );
1751        maybeAccept        ( node->expr  , *this );
1752
1753        VISIT_END( node );
1754}
1755
1756template< typename pass_type >
1757Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) {
1758        MUTATE_START( node );
1759
1760        indexerScopedMutate( node->env   , *this );
1761        indexerScopedMutate( node->result, *this );
1762        maybeMutateRef     ( node->expr  , *this );
1763
1764        MUTATE_END( Expression, node );
[13932f14]1765}
1766
1767template< typename pass_type >
[ab904dc]1768void PassVisitor< pass_type >::visit( VoidType * node ) {
[4551a6e]1769        VISIT_BODY( node );
[13932f14]1770}
1771
1772template< typename pass_type >
[ab904dc]1773void PassVisitor< pass_type >::visit( BasicType * node ) {
[4551a6e]1774        VISIT_BODY( node );
[13932f14]1775}
1776
1777template< typename pass_type >
[ab904dc]1778void PassVisitor< pass_type >::visit( PointerType * node ) {
[4551a6e]1779        VISIT_BODY( node );
[13932f14]1780}
1781
1782template< typename pass_type >
[ab904dc]1783void PassVisitor< pass_type >::visit( ArrayType * node ) {
[4551a6e]1784        VISIT_BODY( node );
[13932f14]1785}
1786
[6b9b047]1787template< typename pass_type >
1788void PassVisitor< pass_type >::visit( ReferenceType * node ) {
1789        VISIT_BODY( node );
1790}
1791
[13932f14]1792template< typename pass_type >
[ab904dc]1793void PassVisitor< pass_type >::visit( FunctionType * node ) {
[4551a6e]1794        VISIT_BODY( node );
[13932f14]1795}
1796
[e0886db]1797//--------------------------------------------------------------------------
1798// StructInstType
[13932f14]1799template< typename pass_type >
[ab904dc]1800void PassVisitor< pass_type >::visit( StructInstType * node ) {
[e0886db]1801        VISIT_START( node );
1802
1803        indexerAddStruct( node->name );
1804
1805        {
1806                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1807                maybeAccept( node->forall    , *this );
1808                maybeAccept( node->parameters, *this );
1809        }
1810
1811        VISIT_END( node );
1812}
1813
1814template< typename pass_type >
1815Type * PassVisitor< pass_type >::mutate( StructInstType * node ) {
1816        MUTATE_START( node );
1817
1818        indexerAddStruct( node->name );
1819
1820        {
1821                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1822                maybeMutateRef( node->forall    , *this );
1823                maybeMutateRef( node->parameters, *this );
1824        }
1825
1826        MUTATE_END( Type, node );
[13932f14]1827}
1828
[e0886db]1829//--------------------------------------------------------------------------
1830// UnionInstType
[13932f14]1831template< typename pass_type >
[ab904dc]1832void PassVisitor< pass_type >::visit( UnionInstType * node ) {
[e0886db]1833        VISIT_START( node );
1834
1835        indexerAddStruct( node->name );
1836
1837        {
1838                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1839                maybeAccept( node->forall    , *this );
1840                maybeAccept( node->parameters, *this );
1841        }
1842
1843        VISIT_END( node );
1844}
1845
1846template< typename pass_type >
1847Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) {
1848        MUTATE_START( node );
1849
1850        indexerAddStruct( node->name );
1851
1852        {
1853                auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1854                maybeMutateRef( node->forall    , *this );
1855                maybeMutateRef( node->parameters, *this );
1856        }
1857
1858        MUTATE_END( Type, node );
[13932f14]1859}
1860
[e0886db]1861//--------------------------------------------------------------------------
1862// EnumInstType
[13932f14]1863template< typename pass_type >
[ab904dc]1864void PassVisitor< pass_type >::visit( EnumInstType * node ) {
[4551a6e]1865        VISIT_BODY( node );
[13932f14]1866}
1867
[e0886db]1868template< typename pass_type >
1869Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) {
1870        MUTATE_BODY( Type, node );
1871}
1872
1873//--------------------------------------------------------------------------
1874// TraitInstType
[13932f14]1875template< typename pass_type >
[ab904dc]1876void PassVisitor< pass_type >::visit( TraitInstType * node ) {
[e0886db]1877        VISIT_START( node );
1878
1879        maybeAccept( node->forall    , *this );
1880        maybeAccept( node->parameters, *this );
1881
1882        VISIT_END( node );
1883}
1884
1885template< typename pass_type >
1886Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) {
1887        MUTATE_START( node );
1888
1889        maybeMutateRef( node->forall    , *this );
1890        maybeMutateRef( node->parameters, *this );
1891
1892        MUTATE_END( Type, node );
[13932f14]1893}
1894
[e0886db]1895//--------------------------------------------------------------------------
1896// TypeInstType
[13932f14]1897template< typename pass_type >
[ab904dc]1898void PassVisitor< pass_type >::visit( TypeInstType * node ) {
[4551a6e]1899        VISIT_BODY( node );
[13932f14]1900}
1901
1902template< typename pass_type >
[ab904dc]1903void PassVisitor< pass_type >::visit( TupleType * node ) {
[4551a6e]1904        VISIT_BODY( node );
[13932f14]1905}
1906
1907template< typename pass_type >
[ab904dc]1908void PassVisitor< pass_type >::visit( TypeofType * node ) {
[4551a6e]1909        VISIT_BODY( node );
[13932f14]1910}
1911
1912template< typename pass_type >
[ab904dc]1913void PassVisitor< pass_type >::visit( AttrType * node ) {
[4551a6e]1914        VISIT_BODY( node );
[13932f14]1915}
1916
1917template< typename pass_type >
[ab904dc]1918void PassVisitor< pass_type >::visit( VarArgsType * node ) {
[4551a6e]1919        VISIT_BODY( node );
[13932f14]1920}
1921
1922template< typename pass_type >
[ab904dc]1923void PassVisitor< pass_type >::visit( ZeroType * node ) {
[4551a6e]1924        VISIT_BODY( node );
[13932f14]1925}
1926
1927template< typename pass_type >
[ab904dc]1928void PassVisitor< pass_type >::visit( OneType * node ) {
[4551a6e]1929        VISIT_BODY( node );
[13932f14]1930}
1931
[b11d8e2]1932template< typename pass_type >
1933void PassVisitor< pass_type >::visit( Designation * node ) {
1934        VISIT_START( node );
1935
1936        maybeAccept( node->get_designators(), *this );
1937
1938        VISIT_END( node );
1939}
1940
1941template< typename pass_type >
1942Designation * PassVisitor< pass_type >::mutate( Designation * node ) {
1943        MUTATE_START( node );
1944
1945        maybeMutateRef( node->get_designators(), *this );
1946
1947        MUTATE_END( Designation, node );
1948}
1949
[9c1600c]1950//--------------------------------------------------------------------------
[e0886db]1951// SingleInit
[13932f14]1952template< typename pass_type >
[ab904dc]1953void PassVisitor< pass_type >::visit( SingleInit * node ) {
[9c1600c]1954        VISIT_START( node );
1955
1956        visitExpression( node->get_value() );
1957
1958        VISIT_END( node );
[13932f14]1959}
1960
[296b2be]1961template< typename pass_type >
1962Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) {
1963        MUTATE_START( node );
1964
1965        node->set_value( mutateExpression( node->get_value() ) );
1966
1967        MUTATE_END( Initializer, node );
1968}
1969
[13932f14]1970template< typename pass_type >
[ab904dc]1971void PassVisitor< pass_type >::visit( ListInit * node ) {
[4551a6e]1972        VISIT_BODY( node );
[13932f14]1973}
1974
1975template< typename pass_type >
[ab904dc]1976void PassVisitor< pass_type >::visit( ConstructorInit * node ) {
[4551a6e]1977        VISIT_BODY( node );
[13932f14]1978}
1979
1980template< typename pass_type >
[ab904dc]1981void PassVisitor< pass_type >::visit( Subrange * node ) {
[4551a6e]1982        VISIT_BODY( node );
[13932f14]1983}
1984
1985template< typename pass_type >
[ab904dc]1986void PassVisitor< pass_type >::visit( Constant * node ) {
[4551a6e]1987        VISIT_BODY( node );
[13932f14]1988}
[ab904dc]1989
[5ea7a22]1990template< typename pass_type >
1991void PassVisitor< pass_type >::visit( Attribute * node ) {
1992        VISIT_BODY( node );
1993}
1994
[ab904dc]1995//---------------------------------------------------------------------------------------------------------------
1996template< typename pass_type >
1997Type * PassVisitor< pass_type >::mutate( VoidType * node ) {
1998        MUTATE_BODY( Type, node );
1999}
2000
2001template< typename pass_type >
2002Type * PassVisitor< pass_type >::mutate( BasicType * node ) {
2003        MUTATE_BODY( Type, node );
2004}
2005
2006template< typename pass_type >
2007Type * PassVisitor< pass_type >::mutate( PointerType * node ) {
2008        MUTATE_BODY( Type, node );
2009}
2010
2011template< typename pass_type >
2012Type * PassVisitor< pass_type >::mutate( ArrayType * node ) {
2013        MUTATE_BODY( Type, node );
2014}
2015
2016template< typename pass_type >
[6b9b047]2017Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) {
2018        MUTATE_BODY( Type, node );
2019}
2020
2021template< typename pass_type >
[ab904dc]2022Type * PassVisitor< pass_type >::mutate( FunctionType * node ) {
2023        MUTATE_BODY( Type, node );
2024}
2025
2026template< typename pass_type >
2027Type * PassVisitor< pass_type >::mutate( TypeInstType * node ) {
2028        MUTATE_BODY( Type, node );
2029}
2030
2031template< typename pass_type >
2032Type * PassVisitor< pass_type >::mutate( TupleType * node ) {
2033        MUTATE_BODY( Type, node );
2034}
2035
2036template< typename pass_type >
2037Type * PassVisitor< pass_type >::mutate( TypeofType * node ) {
2038        MUTATE_BODY( Type, node );
2039}
2040
2041template< typename pass_type >
2042Type * PassVisitor< pass_type >::mutate( AttrType * node ) {
2043        MUTATE_BODY( Type, node );
2044}
2045
2046template< typename pass_type >
2047Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {
2048        MUTATE_BODY( Type, node );
2049}
2050
2051template< typename pass_type >
2052Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {
2053        MUTATE_BODY( Type, node );
2054}
2055
2056template< typename pass_type >
2057Type * PassVisitor< pass_type >::mutate( OneType * node ) {
2058        MUTATE_BODY( Type, node );
2059}
2060
2061template< typename pass_type >
2062Initializer * PassVisitor< pass_type >::mutate( ListInit * node ) {
2063        MUTATE_BODY( Initializer, node );
2064}
2065
2066template< typename pass_type >
2067Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) {
2068        MUTATE_BODY( Initializer, node );
2069}
2070
2071template< typename pass_type >
2072Subrange * PassVisitor< pass_type >::mutate( Subrange * node  )  {
2073        MUTATE_BODY( Subrange, node );
2074}
2075
2076template< typename pass_type >
2077Constant * PassVisitor< pass_type >::mutate( Constant * node  )  {
2078        MUTATE_BODY( Constant, node );
[4551a6e]2079}
[5ea7a22]2080
2081template< typename pass_type >
2082Attribute * PassVisitor< pass_type >::mutate( Attribute * node  )  {
2083        MUTATE_BODY( Attribute, node );
2084}
Note: See TracBrowser for help on using the repository browser.