Changes in src/Common/PassVisitor.impl.h [342146e1:7870799]
- File:
-
- 1 edited
-
src/Common/PassVisitor.impl.h (modified) (105 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.impl.h
r342146e1 r7870799 80 80 81 81 template< typename pass_type > 82 inline void acceptAll( const std::list< const Declaration * > & decls, PassVisitor< pass_type >& visitor ) { 83 SemanticErrorException errors; 84 85 pass_visitor_stats.depth++; 86 pass_visitor_stats.max->push(pass_visitor_stats.depth); 87 pass_visitor_stats.avg->push(pass_visitor_stats.depth); 88 for ( const Declaration * decl : decls ) { 89 try { 90 // run visitor on declaration 91 maybeAccept_impl( decl, visitor ); 92 } 93 catch( SemanticErrorException &e ) { 94 errors.append( e ); 95 } 96 } 97 pass_visitor_stats.depth--; 98 if ( ! errors.isEmpty() ) { 99 throw errors; 100 } 101 } 102 103 template< typename pass_type > 82 104 inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) { 83 105 DeclList_t* beforeDecls = mutator.get_beforeDecls(); … … 117 139 } 118 140 141 template< typename TreeType, typename pass_type > 142 inline void maybeAccept_impl( const TreeType * tree, PassVisitor< pass_type > & visitor ) { 143 if ( ! visitor.get_visit_children() ) return; 144 if ( tree ) { 145 tree->accept( visitor ); 146 } 147 } 148 119 149 template< typename Container, typename pass_type > 120 150 inline void maybeAccept_impl( Container & container, PassVisitor< pass_type > & visitor ) { … … 129 159 if ( *i ) { 130 160 (*i)->accept( visitor ); 161 } 162 } catch( SemanticErrorException &e ) { 163 errors.append( e ); 164 } 165 } 166 pass_visitor_stats.depth--; 167 if ( ! errors.isEmpty() ) { 168 throw errors; 169 } 170 } 171 172 template< typename Container, typename pass_type > 173 inline void maybeAccept_impl( const Container & container, PassVisitor< pass_type > & visitor ) { 174 if ( ! visitor.get_visit_children() ) return; 175 SemanticErrorException errors; 176 177 pass_visitor_stats.depth++; 178 pass_visitor_stats.max->push(pass_visitor_stats.depth); 179 pass_visitor_stats.avg->push(pass_visitor_stats.depth); 180 for ( const auto & i : container ) { 181 try { 182 if ( i ) { 183 i->accept( visitor ); 131 184 } 132 185 } catch( SemanticErrorException &e ) { … … 227 280 228 281 template< typename pass_type > 282 void PassVisitor< pass_type >::visitStatementList( const std::list< Statement * > & statements ) { 283 if ( ! get_visit_children() ) return; 284 SemanticErrorException errors; 285 286 pass_visitor_stats.depth++; 287 pass_visitor_stats.max->push(pass_visitor_stats.depth); 288 pass_visitor_stats.avg->push(pass_visitor_stats.depth); 289 for ( const Statement * i : statements ) { 290 try { 291 maybeAccept_impl( i, *this ); 292 } catch ( SemanticErrorException &e ) { 293 errors.append( e ); 294 } 295 } 296 pass_visitor_stats.depth--; 297 if ( !errors.isEmpty() ) { throw errors; } 298 } 299 300 template< typename pass_type > 229 301 void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) { 230 302 handleStatementList( statements, [this]( Statement *& stmt) { … … 275 347 276 348 template< typename pass_type > 349 void PassVisitor< pass_type >::visitStatement( const Statement * stmt ) { 350 if ( ! get_visit_children() ) return; 351 352 // don't want statements from outer CompoundStmts to be added to this CompoundStmt 353 ValueGuardPtr< typename std::remove_pointer<decltype(get_env_ptr())>::type > oldEnv( get_env_ptr() ); 354 355 maybeAccept_impl( stmt, *this ); 356 } 357 358 template< typename pass_type > 277 359 Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) { 278 360 return handleStatement( stmt, [this]( Statement * stmt ) { … … 306 388 307 389 template< typename pass_type > 390 void PassVisitor< pass_type >::visitExpression( const Expression * expr ) { 391 if ( ! get_visit_children() ) return; 392 if( !expr ) return; 393 394 auto env_ptr = get_env_ptr(); 395 if ( env_ptr && expr->get_env() ) { 396 *env_ptr = expr->get_env(); 397 } 398 399 maybeAccept_impl( expr, *this ); 400 } 401 402 template< typename pass_type > 308 403 Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) { 309 404 return handleExpression(expr, [this]( Expression * expr ) { … … 315 410 template< typename TreeType, typename VisitorType > 316 411 inline void indexerScopedAccept( TreeType * tree, VisitorType & visitor ) { 412 if ( ! visitor.get_visit_children() ) return; 413 auto guard = makeFuncGuard( 414 [&visitor]() { visitor.indexerScopeEnter(); }, 415 [&visitor]() { visitor.indexerScopeLeave(); } 416 ); 417 maybeAccept_impl( tree, visitor ); 418 } 419 420 template< typename TreeType, typename VisitorType > 421 inline void indexerScopedAccept( const TreeType * tree, VisitorType & visitor ) { 317 422 if ( ! visitor.get_visit_children() ) return; 318 423 auto guard = makeFuncGuard( … … 372 477 373 478 indexerAddId( node ); 479 480 VISIT_END( node ); 481 } 482 483 template< typename pass_type > 484 void PassVisitor< pass_type >::visit( const ObjectDecl * node ) { 485 VISIT_START( node ); 486 487 maybeAccept_impl( node->type , *this ); 488 maybeAccept_impl( node->init , *this ); 489 maybeAccept_impl( node->bitfieldWidth, *this ); 490 maybeAccept_impl( node->attributes , *this ); 374 491 375 492 VISIT_END( node ); … … 428 545 429 546 template< typename pass_type > 547 void PassVisitor< pass_type >::visit( const FunctionDecl * node ) { 548 VISIT_START( node ); 549 550 maybeAccept_impl( node->withExprs, *this ); 551 { 552 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 553 static ObjectDecl func( 554 "__func__", noStorageClasses, LinkageSpec::C, nullptr, 555 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ), 556 nullptr 557 ); 558 maybeAccept_impl( node->type, *this ); 559 // function body needs to have the same scope as parameters - CompoundStmt will not enter 560 // a new scope if inFunction is true 561 ValueGuard< bool > oldInFunction( inFunction ); 562 inFunction = true; 563 maybeAccept_impl( node->statements, *this ); 564 maybeAccept_impl( node->attributes, *this ); 565 } 566 567 VISIT_END( node ); 568 } 569 570 template< typename pass_type > 430 571 DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) { 431 572 MUTATE_START( node ); … … 484 625 485 626 template< typename pass_type > 627 void PassVisitor< pass_type >::visit( const StructDecl * node ) { 628 VISIT_START( node ); 629 630 maybeAccept_impl( node->parameters, *this ); 631 maybeAccept_impl( node->members , *this ); 632 633 VISIT_END( node ); 634 } 635 636 template< typename pass_type > 486 637 Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) { 487 638 MUTATE_START( node ); … … 522 673 VISIT_END( node ); 523 674 } 675 template< typename pass_type > 676 void PassVisitor< pass_type >::visit( const UnionDecl * node ) { 677 VISIT_START( node ); 678 679 maybeAccept_impl( node->parameters, *this ); 680 maybeAccept_impl( node->members , *this ); 681 682 VISIT_END( node ); 683 } 524 684 525 685 template< typename pass_type > … … 557 717 558 718 template< typename pass_type > 719 void PassVisitor< pass_type >::visit( const EnumDecl * node ) { 720 VISIT_START( node ); 721 722 // unlike structs, traits, and unions, enums inject their members into the global scope 723 maybeAccept_impl( node->parameters, *this ); 724 maybeAccept_impl( node->members , *this ); 725 726 VISIT_END( node ); 727 } 728 729 template< typename pass_type > 559 730 Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) { 560 731 MUTATE_START( node ); … … 587 758 588 759 template< typename pass_type > 760 void PassVisitor< pass_type >::visit( const TraitDecl * node ) { 761 VISIT_START( node ); 762 763 maybeAccept_impl( node->parameters, *this ); 764 maybeAccept_impl( node->members , *this ); 765 766 VISIT_END( node ); 767 } 768 769 template< typename pass_type > 589 770 Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) { 590 771 MUTATE_START( node ); … … 625 806 } 626 807 808 809 template< typename pass_type > 810 void PassVisitor< pass_type >::visit( const TypeDecl * node ) { 811 VISIT_START( node ); 812 813 maybeAccept_impl( node->parameters, *this ); 814 maybeAccept_impl( node->base , *this ); 815 maybeAccept_impl( node->assertions, *this ); 816 817 VISIT_END( node ); 818 } 819 627 820 template< typename pass_type > 628 821 Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) { … … 667 860 668 861 template< typename pass_type > 862 void PassVisitor< pass_type >::visit( const TypedefDecl * node ) { 863 VISIT_START( node ); 864 865 maybeAccept_impl( node->parameters, *this ); 866 maybeAccept_impl( node->base , *this ); 867 maybeAccept_impl( node->assertions, *this ); 868 869 VISIT_END( node ); 870 } 871 872 template< typename pass_type > 669 873 Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) { 670 874 MUTATE_START( node ); … … 695 899 696 900 template< typename pass_type > 901 void PassVisitor< pass_type >::visit( const AsmDecl * node ) { 902 VISIT_START( node ); 903 904 maybeAccept_impl( node->stmt, *this ); 905 906 VISIT_END( node ); 907 } 908 909 template< typename pass_type > 697 910 AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) { 698 911 MUTATE_START( node ); … … 710 923 711 924 node->condition = visitExpression( node->condition ); 925 maybeAccept_impl( node->message, *this ); 926 927 VISIT_END( node ); 928 } 929 930 template< typename pass_type > 931 void PassVisitor< pass_type >::visit( const StaticAssertDecl * node ) { 932 VISIT_START( node ); 933 934 visitExpression( node->condition ); 712 935 maybeAccept_impl( node->message, *this ); 713 936 … … 742 965 743 966 template< typename pass_type > 967 void PassVisitor< pass_type >::visit( const CompoundStmt * node ) { 968 VISIT_START( node ); 969 { 970 // do not enter a new scope if inFunction is true - needs to check old state before the assignment 971 ValueGuard< bool > oldInFunction( inFunction ); 972 auto guard1 = makeFuncGuard( [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeEnter(); }, [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeLeave(); } ); 973 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } ); 974 inFunction = false; 975 visitStatementList( node->kids ); 976 } 977 VISIT_END( node ); 978 } 979 980 template< typename pass_type > 744 981 CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) { 745 982 MUTATE_START( node ); … … 767 1004 768 1005 template< typename pass_type > 1006 void PassVisitor< pass_type >::visit( const ExprStmt * node ) { 1007 VISIT_START( node ); 1008 1009 visitExpression( node->expr ); 1010 1011 VISIT_END( node ); 1012 } 1013 1014 template< typename pass_type > 769 1015 Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) { 770 1016 MUTATE_START( node ); … … 790 1036 791 1037 template< typename pass_type > 1038 void PassVisitor< pass_type >::visit( const AsmStmt * node ) { 1039 VISIT_START( node ) 1040 1041 maybeAccept_impl( node->instruction, *this ); 1042 maybeAccept_impl( node->output, *this ); 1043 maybeAccept_impl( node->input, *this ); 1044 maybeAccept_impl( node->clobber, *this ); 1045 1046 VISIT_END( node ); 1047 } 1048 1049 template< typename pass_type > 792 1050 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 793 1051 MUTATE_START( node ); … … 811 1069 812 1070 template< typename pass_type > 1071 void PassVisitor< pass_type >::visit( const DirectiveStmt * node ) { 1072 VISIT_START( node ) 1073 1074 VISIT_END( node ); 1075 } 1076 1077 template< typename pass_type > 813 1078 Statement * PassVisitor< pass_type >::mutate( DirectiveStmt * node ) { 814 1079 MUTATE_START( node ); … … 825 1090 // if statements introduce a level of scope (for the initialization) 826 1091 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 827 maybeAccept_impl( node-> get_initialization(), *this );1092 maybeAccept_impl( node->initialization, *this ); 828 1093 visitExpression ( node->condition ); 829 1094 node->thenPart = visitStatement( node->thenPart ); … … 834 1099 835 1100 template< typename pass_type > 1101 void PassVisitor< pass_type >::visit( const IfStmt * node ) { 1102 VISIT_START( node ); 1103 1104 maybeAccept_impl( node->initialization, *this ); 1105 visitExpression ( node->condition ); 1106 visitStatement( node->thenPart ); 1107 visitStatement( node->elsePart ); 1108 1109 VISIT_END( node ); 1110 } 1111 1112 template< typename pass_type > 836 1113 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 837 1114 MUTATE_START( node ); … … 839 1116 // if statements introduce a level of scope (for the initialization) 840 1117 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 841 maybeMutate_impl( node-> get_initialization(), *this );1118 maybeMutate_impl( node->initialization, *this ); 842 1119 node->condition = mutateExpression( node->condition ); 843 1120 node->thenPart = mutateStatement ( node->thenPart ); … … 860 1137 node->body = visitStatement( node->body ); 861 1138 } 1139 1140 VISIT_END( node ); 1141 } 1142 1143 template< typename pass_type > 1144 void PassVisitor< pass_type >::visit( const WhileStmt * node ) { 1145 VISIT_START( node ); 1146 1147 maybeAccept_impl( node->initialization, *this ); 1148 visitExpression ( node->condition ); 1149 visitStatement( node->body ); 862 1150 863 1151 VISIT_END( node ); … … 897 1185 898 1186 template< typename pass_type > 1187 void PassVisitor< pass_type >::visit( const ForStmt * node ) { 1188 VISIT_START( node ); 1189 1190 maybeAccept_impl( node->initialization, *this ); 1191 visitExpression( node->condition ); 1192 visitExpression( node->increment ); 1193 visitStatement( node->body ); 1194 1195 VISIT_END( node ); 1196 } 1197 1198 template< typename pass_type > 899 1199 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) { 900 1200 MUTATE_START( node ); … … 923 1223 924 1224 template< typename pass_type > 1225 void PassVisitor< pass_type >::visit( const SwitchStmt * node ) { 1226 VISIT_START( node ); 1227 1228 visitExpression ( node->condition ); 1229 visitStatementList( node->statements ); 1230 1231 VISIT_END( node ); 1232 } 1233 1234 template< typename pass_type > 925 1235 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) { 926 1236 MUTATE_START( node ); … … 945 1255 946 1256 template< typename pass_type > 1257 void PassVisitor< pass_type >::visit( const CaseStmt * node ) { 1258 VISIT_START( node ); 1259 1260 visitExpression ( node->condition ); 1261 visitStatementList( node->stmts ); 1262 1263 VISIT_END( node ); 1264 } 1265 1266 template< typename pass_type > 947 1267 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) { 948 1268 MUTATE_START( node ); … … 963 1283 964 1284 template< typename pass_type > 1285 void PassVisitor< pass_type >::visit( const BranchStmt * node ) { 1286 VISIT_START( node ); 1287 VISIT_END( node ); 1288 } 1289 1290 template< typename pass_type > 965 1291 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 966 1292 MUTATE_START( node ); … … 980 1306 981 1307 template< typename pass_type > 1308 void PassVisitor< pass_type >::visit( const ReturnStmt * node ) { 1309 VISIT_START( node ); 1310 1311 visitExpression( node->expr ); 1312 1313 VISIT_END( node ); 1314 } 1315 1316 template< typename pass_type > 982 1317 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) { 983 1318 MUTATE_START( node ); … … 990 1325 //-------------------------------------------------------------------------- 991 1326 // ThrowStmt 992 993 1327 template< typename pass_type > 994 1328 void PassVisitor< pass_type >::visit( ThrowStmt * node ) { … … 1002 1336 1003 1337 template< typename pass_type > 1338 void PassVisitor< pass_type >::visit( const ThrowStmt * node ) { 1339 VISIT_START( node ); 1340 1341 maybeAccept_impl( node->expr, *this ); 1342 maybeAccept_impl( node->target, *this ); 1343 1344 VISIT_END( node ); 1345 } 1346 1347 template< typename pass_type > 1004 1348 Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) { 1005 1349 MUTATE_START( node ); … … 1015 1359 template< typename pass_type > 1016 1360 void PassVisitor< pass_type >::visit( TryStmt * node ) { 1361 VISIT_START( node ); 1362 1363 maybeAccept_impl( node->block , *this ); 1364 maybeAccept_impl( node->handlers , *this ); 1365 maybeAccept_impl( node->finallyBlock, *this ); 1366 1367 VISIT_END( node ); 1368 } 1369 1370 template< typename pass_type > 1371 void PassVisitor< pass_type >::visit( const TryStmt * node ) { 1017 1372 VISIT_START( node ); 1018 1373 … … 1051 1406 1052 1407 template< typename pass_type > 1408 void PassVisitor< pass_type >::visit( const CatchStmt * node ) { 1409 VISIT_START( node ); 1410 1411 maybeAccept_impl( node->decl, *this ); 1412 visitExpression( node->cond ); 1413 visitStatement ( node->body ); 1414 1415 VISIT_END( node ); 1416 } 1417 1418 template< typename pass_type > 1053 1419 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) { 1054 1420 MUTATE_START( node ); … … 1075 1441 1076 1442 template< typename pass_type > 1443 void PassVisitor< pass_type >::visit( const FinallyStmt * node ) { 1444 VISIT_START( node ); 1445 1446 maybeAccept_impl( node->block, *this ); 1447 1448 VISIT_END( node ); 1449 } 1450 1451 template< typename pass_type > 1077 1452 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) { 1078 1453 MUTATE_START( node ); … … 1107 1482 1108 1483 template< typename pass_type > 1484 void PassVisitor< pass_type >::visit( const WaitForStmt * node ) { 1485 VISIT_START( node ); 1486 1487 for( auto & clause : node->clauses ) { 1488 maybeAccept_impl( clause.target.function, *this ); 1489 maybeAccept_impl( clause.target.arguments, *this ); 1490 1491 maybeAccept_impl( clause.statement, *this ); 1492 maybeAccept_impl( clause.condition, *this ); 1493 } 1494 1495 maybeAccept_impl( node->timeout.time, *this ); 1496 maybeAccept_impl( node->timeout.statement, *this ); 1497 maybeAccept_impl( node->timeout.condition, *this ); 1498 maybeAccept_impl( node->orelse.statement, *this ); 1499 maybeAccept_impl( node->orelse.condition, *this ); 1500 1501 VISIT_END( node ); 1502 } 1503 1504 template< typename pass_type > 1109 1505 Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) { 1110 1506 MUTATE_START( node ); … … 1130 1526 1131 1527 //-------------------------------------------------------------------------- 1132 // NullStmt1528 // WithStmt 1133 1529 template< typename pass_type > 1134 1530 void PassVisitor< pass_type >::visit( WithStmt * node ) { … … 1145 1541 1146 1542 template< typename pass_type > 1543 void PassVisitor< pass_type >::visit( const WithStmt * node ) { 1544 VISIT_START( node ); 1545 1546 maybeAccept_impl( node->exprs, *this ); 1547 maybeAccept_impl( node->stmt, *this ); 1548 1549 VISIT_END( node ); 1550 } 1551 1552 template< typename pass_type > 1147 1553 Statement * PassVisitor< pass_type >::mutate( WithStmt * node ) { 1148 1554 MUTATE_START( node ); … … 1166 1572 1167 1573 template< typename pass_type > 1574 void PassVisitor< pass_type >::visit( const NullStmt * node ) { 1575 VISIT_START( node ); 1576 VISIT_END( node ); 1577 } 1578 1579 template< typename pass_type > 1168 1580 NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) { 1169 1581 MUTATE_START( node ); … … 1183 1595 1184 1596 template< typename pass_type > 1597 void PassVisitor< pass_type >::visit( const DeclStmt * node ) { 1598 VISIT_START( node ); 1599 1600 maybeAccept_impl( node->decl, *this ); 1601 1602 VISIT_END( node ); 1603 } 1604 1605 template< typename pass_type > 1185 1606 Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) { 1186 1607 MUTATE_START( node ); … … 1195 1616 template< typename pass_type > 1196 1617 void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) { 1618 VISIT_START( node ); 1619 1620 maybeAccept_impl( node->callStmt, *this ); 1621 1622 VISIT_END( node ); 1623 } 1624 1625 template< typename pass_type > 1626 void PassVisitor< pass_type >::visit( const ImplicitCtorDtorStmt * node ) { 1197 1627 VISIT_START( node ); 1198 1628 … … 1220 1650 maybeAccept_impl ( node->function, *this ); 1221 1651 maybeAccept_impl ( node->args , *this ); 1652 1653 VISIT_END( node ); 1654 } 1655 1656 template< typename pass_type > 1657 void PassVisitor< pass_type >::visit( const ApplicationExpr * node ) { 1658 VISIT_START( node ); 1659 1660 maybeAccept_impl( node->result , *this ); 1661 maybeAccept_impl( node->function, *this ); 1662 maybeAccept_impl( node->args , *this ); 1222 1663 1223 1664 VISIT_END( node ); … … 1253 1694 1254 1695 template< typename pass_type > 1696 void PassVisitor< pass_type >::visit( const UntypedExpr * node ) { 1697 VISIT_START( node ); 1698 1699 maybeAccept_impl( node->result, *this ); 1700 1701 for ( auto expr : node->args ) { 1702 visitExpression( expr ); 1703 } 1704 1705 VISIT_END( node ); 1706 } 1707 1708 template< typename pass_type > 1255 1709 Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) { 1256 1710 MUTATE_START( node ); … … 1278 1732 1279 1733 template< typename pass_type > 1734 void PassVisitor< pass_type >::visit( const NameExpr * node ) { 1735 VISIT_START( node ); 1736 1737 maybeAccept_impl( node->result, *this ); 1738 1739 VISIT_END( node ); 1740 } 1741 1742 template< typename pass_type > 1280 1743 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) { 1281 1744 MUTATE_START( node ); … … 1295 1758 indexerScopedAccept( node->result, *this ); 1296 1759 maybeAccept_impl ( node->arg , *this ); 1760 1761 VISIT_END( node ); 1762 } 1763 1764 template< typename pass_type > 1765 void PassVisitor< pass_type >::visit( const CastExpr * node ) { 1766 VISIT_START( node ); 1767 1768 maybeAccept_impl( node->result, *this ); 1769 maybeAccept_impl( node->arg , *this ); 1297 1770 1298 1771 VISIT_END( node ); … … 1323 1796 1324 1797 template< typename pass_type > 1798 void PassVisitor< pass_type >::visit( const KeywordCastExpr * node ) { 1799 VISIT_START( node ); 1800 1801 maybeAccept_impl( node->result, *this ); 1802 maybeAccept_impl( node->arg , *this ); 1803 1804 VISIT_END( node ); 1805 } 1806 1807 template< typename pass_type > 1325 1808 Expression * PassVisitor< pass_type >::mutate( KeywordCastExpr * node ) { 1326 1809 MUTATE_START( node ); … … 1346 1829 1347 1830 template< typename pass_type > 1831 void PassVisitor< pass_type >::visit( const VirtualCastExpr * node ) { 1832 VISIT_START( node ); 1833 1834 maybeAccept_impl( node->result, *this ); 1835 maybeAccept_impl( node->arg, *this ); 1836 1837 VISIT_END( node ); 1838 } 1839 1840 template< typename pass_type > 1348 1841 Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) { 1349 1842 MUTATE_START( node ); … … 1369 1862 1370 1863 template< typename pass_type > 1864 void PassVisitor< pass_type >::visit( const AddressExpr * node ) { 1865 VISIT_START( node ); 1866 1867 maybeAccept_impl( node->result, *this ); 1868 maybeAccept_impl( node->arg , *this ); 1869 1870 VISIT_END( node ); 1871 } 1872 1873 template< typename pass_type > 1371 1874 Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) { 1372 1875 MUTATE_START( node ); … … 1391 1894 1392 1895 template< typename pass_type > 1896 void PassVisitor< pass_type >::visit( const LabelAddressExpr * node ) { 1897 VISIT_START( node ); 1898 1899 maybeAccept_impl( node->result, *this ); 1900 1901 VISIT_END( node ); 1902 } 1903 1904 template< typename pass_type > 1393 1905 Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) { 1394 1906 MUTATE_START( node ); … … 1409 1921 maybeAccept_impl ( node->aggregate, *this ); 1410 1922 maybeAccept_impl ( node->member , *this ); 1923 1924 VISIT_END( node ); 1925 } 1926 1927 template< typename pass_type > 1928 void PassVisitor< pass_type >::visit( const UntypedMemberExpr * node ) { 1929 VISIT_START( node ); 1930 1931 maybeAccept_impl( node->result , *this ); 1932 maybeAccept_impl( node->aggregate, *this ); 1933 maybeAccept_impl( node->member , *this ); 1411 1934 1412 1935 VISIT_END( node ); … … 1438 1961 1439 1962 template< typename pass_type > 1963 void PassVisitor< pass_type >::visit( const MemberExpr * node ) { 1964 VISIT_START( node ); 1965 1966 maybeAccept_impl( node->result , *this ); 1967 maybeAccept_impl( node->aggregate, *this ); 1968 1969 VISIT_END( node ); 1970 } 1971 1972 template< typename pass_type > 1440 1973 Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) { 1441 1974 MUTATE_START( node ); … … 1460 1993 1461 1994 template< typename pass_type > 1995 void PassVisitor< pass_type >::visit( const VariableExpr * node ) { 1996 VISIT_START( node ); 1997 1998 maybeAccept_impl( node->result, *this ); 1999 2000 VISIT_END( node ); 2001 } 2002 2003 template< typename pass_type > 1462 2004 Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) { 1463 2005 MUTATE_START( node ); … … 1477 2019 indexerScopedAccept( node->result , *this ); 1478 2020 maybeAccept_impl ( &node->constant, *this ); 2021 2022 VISIT_END( node ); 2023 } 2024 2025 template< typename pass_type > 2026 void PassVisitor< pass_type >::visit( const ConstantExpr * node ) { 2027 VISIT_START( node ); 2028 2029 maybeAccept_impl( node->result , *this ); 2030 maybeAccept_impl( &node->constant, *this ); 1479 2031 1480 2032 VISIT_END( node ); … … 1501 2053 1502 2054 indexerScopedAccept( node->result, *this ); 2055 if ( node->get_isType() ) { 2056 maybeAccept_impl( node->type, *this ); 2057 } else { 2058 maybeAccept_impl( node->expr, *this ); 2059 } 2060 2061 VISIT_END( node ); 2062 } 2063 2064 template< typename pass_type > 2065 void PassVisitor< pass_type >::visit( const SizeofExpr * node ) { 2066 VISIT_START( node ); 2067 2068 maybeAccept_impl( node->result, *this ); 1503 2069 if ( node->get_isType() ) { 1504 2070 maybeAccept_impl( node->type, *this ); … … 1542 2108 1543 2109 template< typename pass_type > 2110 void PassVisitor< pass_type >::visit( const AlignofExpr * node ) { 2111 VISIT_START( node ); 2112 2113 maybeAccept_impl( node->result, *this ); 2114 if ( node->get_isType() ) { 2115 maybeAccept_impl( node->type, *this ); 2116 } else { 2117 maybeAccept_impl( node->expr, *this ); 2118 } 2119 2120 VISIT_END( node ); 2121 } 2122 2123 template< typename pass_type > 1544 2124 Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) { 1545 2125 MUTATE_START( node ); … … 1569 2149 1570 2150 template< typename pass_type > 2151 void PassVisitor< pass_type >::visit( const UntypedOffsetofExpr * node ) { 2152 VISIT_START( node ); 2153 2154 maybeAccept_impl( node->result, *this ); 2155 maybeAccept_impl( node->type , *this ); 2156 2157 VISIT_END( node ); 2158 } 2159 2160 template< typename pass_type > 1571 2161 Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) { 1572 2162 MUTATE_START( node ); … … 1592 2182 1593 2183 template< typename pass_type > 2184 void PassVisitor< pass_type >::visit( const OffsetofExpr * node ) { 2185 VISIT_START( node ); 2186 2187 maybeAccept_impl( node->result, *this ); 2188 maybeAccept_impl( node->type , *this ); 2189 2190 VISIT_END( node ); 2191 } 2192 2193 template< typename pass_type > 1594 2194 Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) { 1595 2195 MUTATE_START( node ); … … 1615 2215 1616 2216 template< typename pass_type > 2217 void PassVisitor< pass_type >::visit( const OffsetPackExpr * node ) { 2218 VISIT_START( node ); 2219 2220 maybeAccept_impl( node->result, *this ); 2221 maybeAccept_impl( node->type , *this ); 2222 2223 VISIT_END( node ); 2224 } 2225 2226 template< typename pass_type > 1617 2227 Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) { 1618 2228 MUTATE_START( node ); … … 1632 2242 1633 2243 indexerScopedAccept( node->result, *this ); 2244 if ( node->get_isType() ) { 2245 maybeAccept_impl( node->type, *this ); 2246 } else { 2247 maybeAccept_impl( node->expr, *this ); 2248 } 2249 2250 VISIT_END( node ); 2251 } 2252 2253 template< typename pass_type > 2254 void PassVisitor< pass_type >::visit( const AttrExpr * node ) { 2255 VISIT_START( node ); 2256 2257 maybeAccept_impl( node->result, *this ); 1634 2258 if ( node->get_isType() ) { 1635 2259 maybeAccept_impl( node->type, *this ); … … 1670 2294 1671 2295 template< typename pass_type > 2296 void PassVisitor< pass_type >::visit( const LogicalExpr * node ) { 2297 VISIT_START( node ); 2298 2299 maybeAccept_impl( node->result, *this ); 2300 maybeAccept_impl( node->arg1 , *this ); 2301 maybeAccept_impl( node->arg2 , *this ); 2302 2303 VISIT_END( node ); 2304 } 2305 2306 template< typename pass_type > 1672 2307 Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) { 1673 2308 MUTATE_START( node ); … … 1691 2326 maybeAccept_impl ( node->arg2 , *this ); 1692 2327 maybeAccept_impl ( node->arg3 , *this ); 2328 2329 VISIT_END( node ); 2330 } 2331 2332 template< typename pass_type > 2333 void PassVisitor< pass_type >::visit( const ConditionalExpr * node ) { 2334 VISIT_START( node ); 2335 2336 maybeAccept_impl( node->result, *this ); 2337 maybeAccept_impl( node->arg1 , *this ); 2338 maybeAccept_impl( node->arg2 , *this ); 2339 maybeAccept_impl( node->arg3 , *this ); 1693 2340 1694 2341 VISIT_END( node ); … … 1722 2369 1723 2370 template< typename pass_type > 2371 void PassVisitor< pass_type >::visit( const CommaExpr * node ) { 2372 VISIT_START( node ); 2373 2374 maybeAccept_impl( node->result, *this ); 2375 maybeAccept_impl( node->arg1 , *this ); 2376 maybeAccept_impl( node->arg2 , *this ); 2377 2378 VISIT_END( node ); 2379 } 2380 2381 template< typename pass_type > 1724 2382 Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) { 1725 2383 MUTATE_START( node ); … … 1746 2404 1747 2405 template< typename pass_type > 2406 void PassVisitor< pass_type >::visit( const TypeExpr * node ) { 2407 VISIT_START( node ); 2408 2409 maybeAccept_impl( node->result, *this ); 2410 maybeAccept_impl( node->type, *this ); 2411 2412 VISIT_END( node ); 2413 } 2414 2415 template< typename pass_type > 1748 2416 Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) { 1749 2417 MUTATE_START( node ); … … 1766 2434 maybeAccept_impl ( node->constraint, *this ); 1767 2435 maybeAccept_impl ( node->operand , *this ); 2436 2437 VISIT_END( node ); 2438 } 2439 2440 template< typename pass_type > 2441 void PassVisitor< pass_type >::visit( const AsmExpr * node ) { 2442 VISIT_START( node ); 2443 2444 maybeAccept_impl( node->result , *this ); 2445 maybeAccept_impl( node->inout , *this ); 2446 maybeAccept_impl( node->constraint, *this ); 2447 maybeAccept_impl( node->operand , *this ); 1768 2448 1769 2449 VISIT_END( node ); … … 1789 2469 VISIT_START( node ); 1790 2470 1791 indexerScopedAccept( node->result , *this ); 1792 maybeAccept_impl ( node->callExpr , *this ); 1793 maybeAccept_impl ( node->tempDecls , *this ); 1794 maybeAccept_impl ( node->returnDecls, *this ); 1795 maybeAccept_impl ( node->dtors , *this ); 2471 indexerScopedAccept( node->result , *this ); 2472 maybeAccept_impl ( node->callExpr , *this ); 2473 2474 VISIT_END( node ); 2475 } 2476 2477 template< typename pass_type > 2478 void PassVisitor< pass_type >::visit( const ImplicitCopyCtorExpr * node ) { 2479 VISIT_START( node ); 2480 2481 maybeAccept_impl( node->result , *this ); 2482 maybeAccept_impl( node->callExpr , *this ); 1796 2483 1797 2484 VISIT_END( node ); … … 1802 2489 MUTATE_START( node ); 1803 2490 1804 indexerScopedMutate( node->env , *this ); 1805 indexerScopedMutate( node->result , *this ); 1806 maybeMutate_impl ( node->callExpr , *this ); 1807 maybeMutate_impl ( node->tempDecls , *this ); 1808 maybeMutate_impl ( node->returnDecls, *this ); 1809 maybeMutate_impl ( node->dtors , *this ); 2491 indexerScopedMutate( node->env , *this ); 2492 indexerScopedMutate( node->result , *this ); 2493 maybeMutate_impl ( node->callExpr , *this ); 1810 2494 1811 2495 MUTATE_END( Expression, node ); … … 1820 2504 indexerScopedAccept( node->result , *this ); 1821 2505 maybeAccept_impl ( node->callExpr, *this ); 2506 2507 VISIT_END( node ); 2508 } 2509 2510 template< typename pass_type > 2511 void PassVisitor< pass_type >::visit( const ConstructorExpr * node ) { 2512 VISIT_START( node ); 2513 2514 maybeAccept_impl( node->result , *this ); 2515 maybeAccept_impl( node->callExpr, *this ); 1822 2516 1823 2517 VISIT_END( node ); … … 1848 2542 1849 2543 template< typename pass_type > 2544 void PassVisitor< pass_type >::visit( const CompoundLiteralExpr * node ) { 2545 VISIT_START( node ); 2546 2547 maybeAccept_impl( node->result , *this ); 2548 maybeAccept_impl( node->initializer, *this ); 2549 2550 VISIT_END( node ); 2551 } 2552 2553 template< typename pass_type > 1850 2554 Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) { 1851 2555 MUTATE_START( node ); … … 1867 2571 maybeAccept_impl ( node->low , *this ); 1868 2572 maybeAccept_impl ( node->high , *this ); 2573 2574 VISIT_END( node ); 2575 } 2576 2577 template< typename pass_type > 2578 void PassVisitor< pass_type >::visit( const RangeExpr * node ) { 2579 VISIT_START( node ); 2580 2581 maybeAccept_impl( node->result, *this ); 2582 maybeAccept_impl( node->low , *this ); 2583 maybeAccept_impl( node->high , *this ); 1869 2584 1870 2585 VISIT_END( node ); … … 1896 2611 1897 2612 template< typename pass_type > 2613 void PassVisitor< pass_type >::visit( const UntypedTupleExpr * node ) { 2614 VISIT_START( node ); 2615 2616 maybeAccept_impl( node->result, *this ); 2617 maybeAccept_impl( node->exprs , *this ); 2618 2619 VISIT_END( node ); 2620 } 2621 2622 template< typename pass_type > 1898 2623 Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) { 1899 2624 MUTATE_START( node ); … … 1919 2644 1920 2645 template< typename pass_type > 2646 void PassVisitor< pass_type >::visit( const TupleExpr * node ) { 2647 VISIT_START( node ); 2648 2649 maybeAccept_impl( node->result, *this ); 2650 maybeAccept_impl( node->exprs , *this ); 2651 2652 VISIT_END( node ); 2653 } 2654 2655 template< typename pass_type > 1921 2656 Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) { 1922 2657 MUTATE_START( node ); … … 1942 2677 1943 2678 template< typename pass_type > 2679 void PassVisitor< pass_type >::visit( const TupleIndexExpr * node ) { 2680 VISIT_START( node ); 2681 2682 maybeAccept_impl( node->result, *this ); 2683 maybeAccept_impl( node->tuple , *this ); 2684 2685 VISIT_END( node ); 2686 } 2687 2688 template< typename pass_type > 1944 2689 Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) { 1945 2690 MUTATE_START( node ); … … 1960 2705 indexerScopedAccept( node->result , *this ); 1961 2706 maybeAccept_impl ( node->stmtExpr, *this ); 2707 2708 VISIT_END( node ); 2709 } 2710 2711 template< typename pass_type > 2712 void PassVisitor< pass_type >::visit( const TupleAssignExpr * node ) { 2713 VISIT_START( node ); 2714 2715 maybeAccept_impl( node->result , *this ); 2716 maybeAccept_impl( node->stmtExpr, *this ); 1962 2717 1963 2718 VISIT_END( node ); … … 1995 2750 1996 2751 template< typename pass_type > 2752 void PassVisitor< pass_type >::visit( const StmtExpr * node ) { 2753 VISIT_START( node ); 2754 2755 maybeAccept_impl( node->result , *this ); 2756 maybeAccept_impl( node->statements , *this ); 2757 maybeAccept_impl( node->returnDecls, *this ); 2758 maybeAccept_impl( node->dtors , *this ); 2759 2760 VISIT_END( node ); 2761 } 2762 2763 template< typename pass_type > 1997 2764 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) { 1998 2765 MUTATE_START( node ); … … 2024 2791 2025 2792 template< typename pass_type > 2793 void PassVisitor< pass_type >::visit( const UniqueExpr * node ) { 2794 VISIT_START( node ); 2795 2796 maybeAccept_impl( node->result, *this ); 2797 maybeAccept_impl( node->expr , *this ); 2798 2799 VISIT_END( node ); 2800 } 2801 2802 template< typename pass_type > 2026 2803 Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) { 2027 2804 MUTATE_START( node ); … … 2042 2819 indexerScopedAccept( node->result, *this ); 2043 2820 maybeAccept_impl ( node->expr , *this ); 2821 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 2822 2823 VISIT_END( node ); 2824 } 2825 2826 template< typename pass_type > 2827 void PassVisitor< pass_type >::visit( const UntypedInitExpr * node ) { 2828 VISIT_START( node ); 2829 2830 maybeAccept_impl( node->result, *this ); 2831 maybeAccept_impl( node->expr , *this ); 2044 2832 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 2045 2833 … … 2073 2861 2074 2862 template< typename pass_type > 2863 void PassVisitor< pass_type >::visit( const InitExpr * node ) { 2864 VISIT_START( node ); 2865 2866 maybeAccept_impl( node->result, *this ); 2867 maybeAccept_impl( node->expr , *this ); 2868 maybeAccept_impl( node->designation, *this ); 2869 2870 VISIT_END( node ); 2871 } 2872 2873 template< typename pass_type > 2075 2874 Expression * PassVisitor< pass_type >::mutate( InitExpr * node ) { 2076 2875 MUTATE_START( node ); … … 2098 2897 2099 2898 template< typename pass_type > 2899 void PassVisitor< pass_type >::visit( const DeletedExpr * node ) { 2900 VISIT_START( node ); 2901 2902 maybeAccept_impl( node->result, *this ); 2903 maybeAccept_impl( node->expr, *this ); 2904 // don't visit deleteStmt, because it is a pointer to somewhere else in the tree. 2905 2906 VISIT_END( node ); 2907 } 2908 2909 template< typename pass_type > 2100 2910 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2101 2911 MUTATE_START( node ); … … 2115 2925 2116 2926 indexerScopedAccept( node->result, *this ); 2927 maybeAccept_impl( node->expr, *this ); 2928 2929 VISIT_END( node ); 2930 } 2931 2932 template< typename pass_type > 2933 void PassVisitor< pass_type >::visit( const DefaultArgExpr * node ) { 2934 VISIT_START( node ); 2935 2936 maybeAccept_impl( node->result, *this ); 2117 2937 maybeAccept_impl( node->expr, *this ); 2118 2938 … … 2141 2961 for ( GenericExpr::Association & assoc : node->associations ) { 2142 2962 indexerScopedAccept( assoc.type, *this ); 2963 maybeAccept_impl( assoc.expr, *this ); 2964 } 2965 2966 VISIT_END( node ); 2967 } 2968 2969 template< typename pass_type > 2970 void PassVisitor< pass_type >::visit( const GenericExpr * node ) { 2971 VISIT_START( node ); 2972 2973 maybeAccept_impl( node->result, *this ); 2974 maybeAccept_impl( node->control, *this ); 2975 for ( const GenericExpr::Association & assoc : node->associations ) { 2976 maybeAccept_impl( assoc.type, *this ); 2143 2977 maybeAccept_impl( assoc.expr, *this ); 2144 2978 } … … 2174 3008 2175 3009 template< typename pass_type > 3010 void PassVisitor< pass_type >::visit( const VoidType * node ) { 3011 VISIT_START( node ); 3012 3013 maybeAccept_impl( node->forall, *this ); 3014 3015 VISIT_END( node ); 3016 } 3017 3018 template< typename pass_type > 2176 3019 Type * PassVisitor< pass_type >::mutate( VoidType * node ) { 2177 3020 MUTATE_START( node ); … … 2186 3029 template< typename pass_type > 2187 3030 void PassVisitor< pass_type >::visit( BasicType * node ) { 3031 VISIT_START( node ); 3032 3033 maybeAccept_impl( node->forall, *this ); 3034 3035 VISIT_END( node ); 3036 } 3037 3038 template< typename pass_type > 3039 void PassVisitor< pass_type >::visit( const BasicType * node ) { 2188 3040 VISIT_START( node ); 2189 3041 … … 2216 3068 2217 3069 template< typename pass_type > 3070 void PassVisitor< pass_type >::visit( const PointerType * node ) { 3071 VISIT_START( node ); 3072 3073 maybeAccept_impl( node->forall, *this ); 3074 // xxx - should PointerType visit/mutate dimension? 3075 maybeAccept_impl( node->base, *this ); 3076 3077 VISIT_END( node ); 3078 } 3079 3080 template< typename pass_type > 2218 3081 Type * PassVisitor< pass_type >::mutate( PointerType * node ) { 2219 3082 MUTATE_START( node ); … … 2240 3103 2241 3104 template< typename pass_type > 3105 void PassVisitor< pass_type >::visit( const ArrayType * node ) { 3106 VISIT_START( node ); 3107 3108 maybeAccept_impl( node->forall, *this ); 3109 maybeAccept_impl( node->dimension, *this ); 3110 maybeAccept_impl( node->base, *this ); 3111 3112 VISIT_END( node ); 3113 } 3114 3115 template< typename pass_type > 2242 3116 Type * PassVisitor< pass_type >::mutate( ArrayType * node ) { 2243 3117 MUTATE_START( node ); … … 2263 3137 2264 3138 template< typename pass_type > 3139 void PassVisitor< pass_type >::visit( const ReferenceType * node ) { 3140 VISIT_START( node ); 3141 3142 maybeAccept_impl( node->forall, *this ); 3143 maybeAccept_impl( node->base, *this ); 3144 3145 VISIT_END( node ); 3146 } 3147 3148 template< typename pass_type > 2265 3149 Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) { 2266 3150 MUTATE_START( node ); … … 2286 3170 2287 3171 template< typename pass_type > 3172 void PassVisitor< pass_type >::visit( const QualifiedType * node ) { 3173 VISIT_START( node ); 3174 3175 maybeAccept_impl( node->forall, *this ); 3176 maybeAccept_impl( node->parent, *this ); 3177 maybeAccept_impl( node->child, *this ); 3178 3179 VISIT_END( node ); 3180 } 3181 3182 template< typename pass_type > 2288 3183 Type * PassVisitor< pass_type >::mutate( QualifiedType * node ) { 2289 3184 MUTATE_START( node ); … … 2300 3195 template< typename pass_type > 2301 3196 void PassVisitor< pass_type >::visit( FunctionType * node ) { 3197 VISIT_START( node ); 3198 3199 maybeAccept_impl( node->forall, *this ); 3200 maybeAccept_impl( node->returnVals, *this ); 3201 maybeAccept_impl( node->parameters, *this ); 3202 3203 VISIT_END( node ); 3204 } 3205 3206 template< typename pass_type > 3207 void PassVisitor< pass_type >::visit( const FunctionType * node ) { 2302 3208 VISIT_START( node ); 2303 3209 … … 2338 3244 2339 3245 template< typename pass_type > 3246 void PassVisitor< pass_type >::visit( const StructInstType * node ) { 3247 VISIT_START( node ); 3248 3249 maybeAccept_impl( node->forall , *this ); 3250 maybeAccept_impl( node->parameters, *this ); 3251 3252 VISIT_END( node ); 3253 } 3254 3255 template< typename pass_type > 2340 3256 Type * PassVisitor< pass_type >::mutate( StructInstType * node ) { 2341 3257 MUTATE_START( node ); … … 2370 3286 2371 3287 template< typename pass_type > 3288 void PassVisitor< pass_type >::visit( const UnionInstType * node ) { 3289 VISIT_START( node ); 3290 3291 maybeAccept_impl( node->forall , *this ); 3292 maybeAccept_impl( node->parameters, *this ); 3293 3294 VISIT_END( node ); 3295 } 3296 3297 template< typename pass_type > 2372 3298 Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) { 2373 3299 MUTATE_START( node ); … … 2397 3323 2398 3324 template< typename pass_type > 3325 void PassVisitor< pass_type >::visit( const EnumInstType * node ) { 3326 VISIT_START( node ); 3327 3328 maybeAccept_impl( node->forall, *this ); 3329 maybeAccept_impl( node->parameters, *this ); 3330 3331 VISIT_END( node ); 3332 } 3333 3334 template< typename pass_type > 2399 3335 Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) { 2400 3336 MUTATE_START( node ); … … 2419 3355 2420 3356 template< typename pass_type > 3357 void PassVisitor< pass_type >::visit( const TraitInstType * node ) { 3358 VISIT_START( node ); 3359 3360 maybeAccept_impl( node->forall , *this ); 3361 maybeAccept_impl( node->parameters, *this ); 3362 3363 VISIT_END( node ); 3364 } 3365 3366 template< typename pass_type > 2421 3367 Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) { 2422 3368 MUTATE_START( node ); … … 2432 3378 template< typename pass_type > 2433 3379 void PassVisitor< pass_type >::visit( TypeInstType * node ) { 3380 VISIT_START( node ); 3381 3382 maybeAccept_impl( node->forall , *this ); 3383 maybeAccept_impl( node->parameters, *this ); 3384 3385 VISIT_END( node ); 3386 } 3387 3388 template< typename pass_type > 3389 void PassVisitor< pass_type >::visit( const TypeInstType * node ) { 2434 3390 VISIT_START( node ); 2435 3391 … … 2464 3420 2465 3421 template< typename pass_type > 3422 void PassVisitor< pass_type >::visit( const TupleType * node ) { 3423 VISIT_START( node ); 3424 3425 maybeAccept_impl( node->forall, *this ); 3426 maybeAccept_impl( node->types, *this ); 3427 maybeAccept_impl( node->members, *this ); 3428 3429 VISIT_END( node ); 3430 } 3431 3432 template< typename pass_type > 2466 3433 Type * PassVisitor< pass_type >::mutate( TupleType * node ) { 2467 3434 MUTATE_START( node ); … … 2478 3445 template< typename pass_type > 2479 3446 void PassVisitor< pass_type >::visit( TypeofType * node ) { 3447 VISIT_START( node ); 3448 3449 assert( node->expr ); 3450 maybeAccept_impl( node->expr, *this ); 3451 3452 VISIT_END( node ); 3453 } 3454 3455 template< typename pass_type > 3456 void PassVisitor< pass_type >::visit( const TypeofType * node ) { 2480 3457 VISIT_START( node ); 2481 3458 … … 2514 3491 2515 3492 template< typename pass_type > 3493 void PassVisitor< pass_type >::visit( const AttrType * node ) { 3494 VISIT_START( node ); 3495 3496 if ( node->isType ) { 3497 assert( node->type ); 3498 maybeAccept_impl( node->type, *this ); 3499 } else { 3500 assert( node->expr ); 3501 maybeAccept_impl( node->expr, *this ); 3502 } // if 3503 3504 VISIT_END( node ); 3505 } 3506 3507 template< typename pass_type > 2516 3508 Type * PassVisitor< pass_type >::mutate( AttrType * node ) { 2517 3509 MUTATE_START( node ); … … 2540 3532 2541 3533 template< typename pass_type > 3534 void PassVisitor< pass_type >::visit( const VarArgsType * node ) { 3535 VISIT_START( node ); 3536 3537 maybeAccept_impl( node->forall, *this ); 3538 3539 VISIT_END( node ); 3540 } 3541 3542 template< typename pass_type > 2542 3543 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) { 2543 3544 MUTATE_START( node ); … … 2560 3561 2561 3562 template< typename pass_type > 3563 void PassVisitor< pass_type >::visit( const ZeroType * node ) { 3564 VISIT_START( node ); 3565 3566 maybeAccept_impl( node->forall, *this ); 3567 3568 VISIT_END( node ); 3569 } 3570 3571 template< typename pass_type > 2562 3572 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) { 2563 3573 MUTATE_START( node ); … … 2580 3590 2581 3591 template< typename pass_type > 3592 void PassVisitor< pass_type >::visit( const OneType * node ) { 3593 VISIT_START( node ); 3594 3595 maybeAccept_impl( node->forall, *this ); 3596 3597 VISIT_END( node ); 3598 } 3599 3600 template< typename pass_type > 2582 3601 Type * PassVisitor< pass_type >::mutate( OneType * node ) { 2583 3602 MUTATE_START( node ); … … 2600 3619 2601 3620 template< typename pass_type > 3621 void PassVisitor< pass_type >::visit( const GlobalScopeType * node ) { 3622 VISIT_START( node ); 3623 3624 maybeAccept_impl( node->forall, *this ); 3625 3626 VISIT_END( node ); 3627 } 3628 3629 template< typename pass_type > 2602 3630 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) { 2603 3631 MUTATE_START( node ); … … 2620 3648 2621 3649 template< typename pass_type > 3650 void PassVisitor< pass_type >::visit( const Designation * node ) { 3651 VISIT_START( node ); 3652 3653 maybeAccept_impl( node->designators, *this ); 3654 3655 VISIT_END( node ); 3656 } 3657 3658 template< typename pass_type > 2622 3659 Designation * PassVisitor< pass_type >::mutate( Designation * node ) { 2623 3660 MUTATE_START( node ); … … 2640 3677 2641 3678 template< typename pass_type > 3679 void PassVisitor< pass_type >::visit( const SingleInit * node ) { 3680 VISIT_START( node ); 3681 3682 visitExpression( node->value ); 3683 3684 VISIT_END( node ); 3685 } 3686 3687 template< typename pass_type > 2642 3688 Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) { 2643 3689 MUTATE_START( node ); … … 2652 3698 template< typename pass_type > 2653 3699 void PassVisitor< pass_type >::visit( ListInit * node ) { 3700 VISIT_START( node ); 3701 3702 maybeAccept_impl( node->designations, *this ); 3703 maybeAccept_impl( node->initializers, *this ); 3704 3705 VISIT_END( node ); 3706 } 3707 3708 template< typename pass_type > 3709 void PassVisitor< pass_type >::visit( const ListInit * node ) { 2654 3710 VISIT_START( node ); 2655 3711 … … 2684 3740 2685 3741 template< typename pass_type > 3742 void PassVisitor< pass_type >::visit( const ConstructorInit * node ) { 3743 VISIT_START( node ); 3744 3745 maybeAccept_impl( node->ctor, *this ); 3746 maybeAccept_impl( node->dtor, *this ); 3747 maybeAccept_impl( node->init, *this ); 3748 3749 VISIT_END( node ); 3750 } 3751 3752 template< typename pass_type > 2686 3753 Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) { 2687 3754 MUTATE_START( node ); … … 2704 3771 2705 3772 template< typename pass_type > 3773 void PassVisitor< pass_type >::visit( const Constant * node ) { 3774 VISIT_START( node ); 3775 3776 VISIT_END( node ); 3777 } 3778 3779 template< typename pass_type > 2706 3780 Constant * PassVisitor< pass_type >::mutate( Constant * node ) { 2707 3781 MUTATE_START( node ); … … 2714 3788 template< typename pass_type > 2715 3789 void PassVisitor< pass_type >::visit( Attribute * node ) { 3790 VISIT_START( node ); 3791 3792 maybeAccept_impl( node->parameters, *this ); 3793 3794 VISIT_END( node ); 3795 } 3796 3797 template< typename pass_type > 3798 void PassVisitor< pass_type >::visit( const Attribute * node ) { 2716 3799 VISIT_START( node ); 2717 3800
Note:
See TracChangeset
for help on using the changeset viewer.