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

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

Changed warning system to prepare for toggling warnings

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