Changes in src/AST/Print.cpp [835d6e8:71806e0]
- File:
-
- 1 edited
-
src/AST/Print.cpp (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Print.cpp
r835d6e8 r71806e0 29 29 namespace ast { 30 30 31 namespace { 32 33 template<typename C, typename... T> 34 constexpr array<C, sizeof...(T)> make_array( T&&... values ) { 35 return array<C, sizeof...(T)>{ std::forward<T>( values )... }; 36 } 37 38 namespace Names { 39 static constexpr auto FuncSpecifiers = make_array<const char*>( 40 "inline", "_Noreturn", "fortran" 41 ); 42 43 static constexpr auto StorageClasses = make_array<const char*>( 44 "extern", "static", "auto", "register", "__thread", "_Thread_local" 45 ); 46 47 static constexpr auto Qualifiers = make_array<const char*>( 48 "const", "restrict", "volatile", "mutex", "_Atomic" 49 ); 50 } 51 52 template<typename bits_t, size_t N> 53 void print( ostream & os, const bits_t & bits, 54 const array<const char *, N> & names ) { 55 if ( !bits.any() ) return; 56 for ( size_t i = 0 ; i < N ; i += 1 ) { 57 if ( bits[i] ) { 58 os << names[i] << ' '; 59 } 60 } 31 template <typename C, typename... T> 32 constexpr array<C,sizeof...(T)> make_array(T&&... values) 33 { 34 return array<C,sizeof...(T)>{ 35 std::forward<T>(values)... 36 }; 61 37 } 62 38 … … 104 80 static const char* Names[]; 105 81 82 struct Names { 83 static constexpr auto FuncSpecifiers = make_array<const char*>( 84 "inline", "_Noreturn", "fortran" 85 ); 86 87 static constexpr auto StorageClasses = make_array<const char*>( 88 "extern", "static", "auto", "register", "__thread", "_Thread_local" 89 ); 90 91 static constexpr auto Qualifiers = make_array<const char*>( 92 "const", "restrict", "volatile", "mutex", "_Atomic" 93 ); 94 }; 95 96 template<typename storage_t, size_t N> 97 void print(const storage_t & storage, const array<const char *, N> & Names ) { 98 if ( storage.any() ) { 99 for ( size_t i = 0; i < Names.size(); i += 1 ) { 100 if ( storage[i] ) { 101 os << Names[i] << ' '; 102 } 103 } 104 } 105 } 106 107 void print( const ast::Function::Specs & specs ) { 108 print(specs, Names::FuncSpecifiers); 109 } 110 111 void print( const ast::Storage::Classes & storage ) { 112 print(storage, Names::StorageClasses); 113 } 114 115 void print( const ast::CV::Qualifiers & qualifiers ) { 116 print(qualifiers, Names::Qualifiers); 117 } 118 106 119 void print( const std::vector<ast::Label> & labels ) { 107 120 if ( labels.empty() ) return; … … 217 230 } 218 231 219 ast::print( os,node->storage );232 print( node->storage ); 220 233 os << node->typeString(); 221 234 … … 259 272 260 273 void preprint( const ast::Type * node ) { 261 ast::print( os,node->qualifiers );274 print( node->qualifiers ); 262 275 } 263 276 … … 265 278 print( node->forall ); 266 279 print( node->assertions ); 267 ast::print( os,node->qualifiers );280 print( node->qualifiers ); 268 281 } 269 282 270 283 void preprint( const ast::BaseInstType * node ) { 271 284 print( node->attributes ); 272 ast::print( os,node->qualifiers );285 print( node->qualifiers ); 273 286 } 274 287 … … 281 294 } 282 295 283 ast::print( os,node->storage );296 print( node->storage ); 284 297 285 298 if ( node->type ) { … … 325 338 if ( ! short_mode ) printAll( node->attributes ); 326 339 327 ast::print( os, node->storage ); 328 ast::print( os, node->funcSpec ); 340 print( node->storage ); 341 print( node->funcSpec ); 342 343 329 344 330 345 if ( node->type && node->isTypeFixed ) { … … 369 384 --indent; 370 385 } 371 }372 373 if ( ! node->withExprs.empty() ) {374 // Not with a clause, but the 'with clause'.375 ++indent;376 os << " with clause" << endl << indent;377 printAll( node->withExprs );378 --indent;379 386 } 380 387 … … 739 746 virtual const ast::Stmt * visit( const ast::SuspendStmt * node ) override final { 740 747 os << "Suspend Statement"; 741 switch (node-> kind) {742 case ast::SuspendStmt::None : os << " with implicit target"; break;743 case ast::SuspendStmt::Generator: os << " for generator"; break;744 case ast::SuspendStmt::Coroutine: os << " for coroutine"; break;748 switch (node->type) { 749 case ast::SuspendStmt::None : os << " with implicit target"; break; 750 case ast::SuspendStmt::Generator: os << " for generator"; break; 751 case ast::SuspendStmt::Coroutine: os << " for coroutine"; break; 745 752 } 746 753 os << endl; … … 1620 1627 }; 1621 1628 1622 } // namespace1623 1624 1629 void print( ostream & os, const ast::Node * node, Indenter indent ) { 1625 1630 Printer printer { os, indent, false }; … … 1632 1637 } 1633 1638 1634 void print( ostream & os, Function::Specs specs ) { 1635 print( os, specs, Names::FuncSpecifiers ); 1639 // Annoyingly these needed to be defined out of line to avoid undefined references. 1640 // The size here needs to be explicit but at least the compiler will produce an error 1641 // if the wrong size is specified 1642 constexpr array<const char*, 3> Printer::Names::FuncSpecifiers; 1643 constexpr array<const char*, 6> Printer::Names::StorageClasses; 1644 constexpr array<const char*, 5> Printer::Names::Qualifiers; 1636 1645 } 1637 1638 void print( ostream & os, Storage::Classes storage ) {1639 print( os, storage, Names::StorageClasses );1640 }1641 1642 void print( ostream & os, CV::Qualifiers qualifiers ) {1643 print( os, qualifiers, Names::Qualifiers );1644 }1645 1646 } // namespace ast
Note:
See TracChangeset
for help on using the changeset viewer.