Changes in src/AST/Convert.cpp [172d9342:675d816]
- File:
-
- 1 edited
-
src/AST/Convert.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
r172d9342 r675d816 10 10 // Created On : Thu May 09 15::37::05 2019 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri May 17 1 2:13:00 201913 // Update Count : 312 // Last Modified On : Fri May 17 16:01:00 2019 13 // Update Count : 4 14 14 // 15 15 16 16 #include "Convert.hpp" 17 18 #include "AST/Pass.hpp" 17 19 18 20 #include "AST/Attribute.hpp" … … 21 23 #include "AST/Init.hpp" 22 24 #include "AST/Stmt.hpp" 23 #include "AST/TypeSubstitution.hpp" 25 24 26 25 27 #include "SynTree/Attribute.h" 26 28 #include "SynTree/Declaration.h" 27 #include "SynTree/TypeSubstitution.h"28 29 29 30 //================================================================================================ … … 41 42 //================================================================================================ 42 43 class ConverterNewToOld : public ast::Visitor { 44 BaseSyntaxNode * node = nullptr; 45 46 template<typename T> 47 struct Getter { 48 ConverterNewToOld & visitor; 49 50 template<typename U> 51 T * accept1( const ast::ptr<U> & ptr ) { 52 ptr->accept( visitor ); 53 T * ret = strict_dynamic_cast< T * >( visitor.node ); 54 visitor.node = nullptr; 55 return ret; 56 } 57 58 template<typename U> 59 std::list< T * > acceptL( const U & container ) { 60 std::list< T * > ret; 61 for (auto ptr : container ) { 62 ret.emplace_back( accept1( ptr ) ); 63 } 64 return ret; 65 } 66 }; 67 68 template<typename T> 69 Getter<T> get() { 70 return Getter<T>{ *this }; 71 } 72 73 Label makeLabel(Statement * labelled, const ast::Label& label) { 74 return Label( 75 label.name, 76 labelled, 77 get<Attribute>().acceptL(label.attributes) 78 ); 79 } 80 81 template<template <class...> class C> 82 std::list<Label> makeLabelL(Statement * labelled, const C<ast::Label>& labels) { 83 std::list<Label> ret; 84 for (auto label : labels) { 85 ret.push_back( makeLabel(labelled, label) ); 86 } 87 return ret; 88 } 89 43 90 public: 44 template<typename T> 45 T * get() { 46 T * ret = strict_dynamic_cast< T * >( node ); 47 node = nullptr; 48 return ret; 91 Declaration * decl( const ast::Decl * declNode ) { 92 return get<Declaration>().accept1( ast::ptr<ast::Decl>( declNode ) ); 49 93 } 50 94 51 95 private: 52 BaseSyntaxNode * node = nullptr;53 54 // All the visit functions:55 56 96 const ast::DeclWithType * visit( const ast::ObjectDecl * node ) override final { 57 97 (void)node; … … 105 145 106 146 const ast::CompoundStmt * visit( const ast::CompoundStmt * node ) override final { 107 (void)node; 147 auto stmt = new CompoundStmt( get<Statement>().acceptL( node->kids ) ); 148 stmt->location = node->location; 149 stmt->labels = makeLabelL( stmt, node->labels ); 150 this->node = stmt; 108 151 return nullptr; 109 152 } 110 153 111 154 const ast::Stmt * visit( const ast::ExprStmt * node ) override final { 112 (void)node; 155 auto stmt = new ExprStmt( get<Expression>().accept1( node->expr ) ); 156 stmt->location = node->location; 157 stmt->labels = makeLabelL( stmt, node->labels ); 158 this->node = stmt; 113 159 return nullptr; 114 160 } 115 161 116 162 const ast::Stmt * visit( const ast::AsmStmt * node ) override final { 117 (void)node; 163 auto stmt = new AsmStmt( 164 node->isVolatile, 165 get<Expression>().accept1( node->instruction ), 166 get<Expression>().acceptL( node->output ), 167 get<Expression>().acceptL( node->input ), 168 get<ConstantExpr>().acceptL( node->clobber ), 169 makeLabelL( nullptr, node->gotoLabels ) // What are these labelling? 170 ); 171 stmt->location = node->location; 172 stmt->labels = makeLabelL( stmt, node->labels ); 173 this->node = stmt; 118 174 return nullptr; 119 175 } 120 176 121 177 const ast::Stmt * visit( const ast::DirectiveStmt * node ) override final { 122 (void)node; 178 auto stmt = new DirectiveStmt( node->directive ); 179 stmt->location = node->location; 180 stmt->labels = makeLabelL( stmt, node->labels ); 181 this->node = stmt; 123 182 return nullptr; 124 183 } 125 184 126 185 const ast::Stmt * visit( const ast::IfStmt * node ) override final { 127 (void)node; 186 auto stmt = new IfStmt( 187 get<Expression>().accept1( node->cond ), 188 get<Statement>().accept1( node->thenPart ), 189 get<Statement>().accept1( node->elsePart ), 190 get<Statement>().acceptL( node->inits ) 191 ); 192 stmt->location = node->location; 193 stmt->labels = makeLabelL( stmt, node->labels ); 194 this->node = stmt; 195 return nullptr; 196 } 197 198 const ast::Stmt * visit( const ast::SwitchStmt * node ) override final { 199 auto stmt = new SwitchStmt( 200 get<Expression>().accept1( node->cond ), 201 get<Statement>().acceptL( node->stmts ) 202 ); 203 stmt->location = node->location; 204 stmt->labels = makeLabelL( stmt, node->labels ); 205 this->node = stmt; 206 return nullptr; 207 } 208 209 const ast::Stmt * visit( const ast::CaseStmt * node ) override final { 210 auto stmt = new CaseStmt( 211 get<Expression>().accept1( node->cond ), 212 get<Statement>().acceptL( node->stmts ), 213 node->isDefault() 214 ); 215 stmt->location = node->location; 216 stmt->labels = makeLabelL( stmt, node->labels ); 217 this->node = stmt; 128 218 return nullptr; 129 219 } 130 220 131 221 const ast::Stmt * visit( const ast::WhileStmt * node ) override final { 132 (void)node; 222 auto inits = get<Statement>().acceptL( node->inits ); 223 auto stmt = new WhileStmt( 224 get<Expression>().accept1( node->cond ), 225 get<Statement>().accept1( node->body ), 226 inits, 227 node->isDoWhile 228 ); 229 stmt->location = node->location; 230 stmt->labels = makeLabelL( stmt, node->labels ); 231 this->node = stmt; 133 232 return nullptr; 134 233 } 135 234 136 235 const ast::Stmt * visit( const ast::ForStmt * node ) override final { 137 (void)node; 138 return nullptr; 139 } 140 141 const ast::Stmt * visit( const ast::SwitchStmt * node ) override final { 142 (void)node; 143 return nullptr; 144 } 145 146 const ast::Stmt * visit( const ast::CaseStmt * node ) override final { 147 (void)node; 236 auto stmt = new ForStmt( 237 get<Statement>().acceptL( node->inits ), 238 get<Expression>().accept1( node->cond ), 239 get<Expression>().accept1( node->inc ), 240 get<Statement>().accept1( node->body ) 241 ); 242 stmt->location = node->location; 243 stmt->labels = makeLabelL( stmt, node->labels ); 244 this->node = stmt; 148 245 return nullptr; 149 246 } 150 247 151 248 const ast::Stmt * visit( const ast::BranchStmt * node ) override final { 152 (void)node; 249 BranchStmt * stmt; 250 if (node->computedTarget) { 251 stmt = new BranchStmt( get<Expression>().accept1( node->computedTarget ), 252 BranchStmt::Goto ); 253 } else { 254 BranchStmt::Type type; 255 switch (node->kind) { 256 #define CASE(n) \ 257 case ast::BranchStmt::n: \ 258 type = BranchStmt::n; \ 259 break 260 CASE(Goto); 261 CASE(Break); 262 CASE(Continue); 263 CASE(FallThrough); 264 CASE(FallThroughDefault); 265 #undef CASE 266 default: 267 assertf(false, "Invalid ast::BranchStmt::Kind: %d\n", node->kind); 268 } 269 270 // The labels here are also weird. 271 stmt = new BranchStmt( makeLabel( nullptr, node->originalTarget ), type ); 272 stmt->target = makeLabel( stmt, node->target ); 273 } 274 stmt->location = node->location; 275 stmt->labels = makeLabelL( stmt, node->labels ); 276 this->node = stmt; 153 277 return nullptr; 154 278 } 155 279 156 280 const ast::Stmt * visit( const ast::ReturnStmt * node ) override final { 157 (void)node; 281 auto stmt = new ReturnStmt( get<Expression>().accept1( node->expr ) ); 282 stmt->location = node->location; 283 stmt->labels = makeLabelL( stmt, node->labels ); 284 this->node = stmt; 158 285 return nullptr; 159 286 } 160 287 161 288 const ast::Stmt * visit( const ast::ThrowStmt * node ) override final { 162 (void)node; 289 ThrowStmt::Kind kind; 290 switch (node->kind) { 291 case ast::ThrowStmt::Terminate: 292 kind = ThrowStmt::Terminate; 293 break; 294 case ast::ThrowStmt::Resume: 295 kind = ThrowStmt::Resume; 296 break; 297 default: 298 assertf(false, "Invalid ast::ThrowStmt::Kind: %d\n", node->kind); 299 } 300 auto stmt = new ThrowStmt( 301 kind, 302 get<Expression>().accept1( node->expr ), 303 get<Expression>().accept1( node->target ) 304 ); 305 stmt->location = node->location; 306 stmt->labels = makeLabelL( stmt, node->labels ); 307 this->node = stmt; 163 308 return nullptr; 164 309 } 165 310 166 311 const ast::Stmt * visit( const ast::TryStmt * node ) override final { 167 (void)node; 312 auto handlers = get<CatchStmt>().acceptL( node->handlers ); 313 auto stmt = new TryStmt( 314 get<CompoundStmt>().accept1( node->body ), 315 handlers, 316 get<FinallyStmt>().accept1( node->finally ) 317 ); 318 stmt->location = node->location; 319 stmt->labels = makeLabelL( stmt, node->labels ); 320 this->node = stmt; 168 321 return nullptr; 169 322 } 170 323 171 324 const ast::Stmt * visit( const ast::CatchStmt * node ) override final { 172 (void)node; 325 CatchStmt::Kind kind; 326 switch (node->kind) { 327 case ast::CatchStmt::Terminate: 328 kind = CatchStmt::Terminate; 329 break; 330 case ast::CatchStmt::Resume: 331 kind = CatchStmt::Resume; 332 break; 333 default: 334 assertf(false, "Invalid ast::CatchStmt::Kind: %d\n", node->kind); 335 } 336 auto stmt = new CatchStmt( 337 kind, 338 get<Declaration>().accept1( node->decl ), 339 get<Expression>().accept1( node->cond ), 340 get<Statement>().accept1( node->body ) 341 ); 342 stmt->location = node->location; 343 stmt->labels = makeLabelL( stmt, node->labels ); 344 this->node = stmt; 173 345 return nullptr; 174 346 } 175 347 176 348 const ast::Stmt * visit( const ast::FinallyStmt * node ) override final { 177 (void)node; 349 auto stmt = new FinallyStmt( get<CompoundStmt>().accept1( node->body ) ); 350 stmt->location = node->location; 351 stmt->labels = makeLabelL( stmt, node->labels ); 352 this->node = stmt; 178 353 return nullptr; 179 354 } 180 355 181 356 const ast::Stmt * visit( const ast::WaitForStmt * node ) override final { 182 (void)node; 357 auto stmt = new WaitForStmt; 358 stmt->clauses.reserve( node->clauses.size() ); 359 for ( auto clause : node->clauses ) { 360 stmt->clauses.push_back({{ 361 get<Expression>().accept1( clause.target.function ), 362 get<Expression>().acceptL( clause.target.arguments ), 363 }, 364 get<Statement>().accept1( clause.stmt ), 365 get<Expression>().accept1( clause.cond ), 366 }); 367 } 368 stmt->timeout = { 369 get<Expression>().accept1( node->timeout.time ), 370 get<Statement>().accept1( node->timeout.stmt ), 371 get<Expression>().accept1( node->timeout.cond ), 372 }; 373 stmt->orelse = { 374 get<Statement>().accept1( node->orElse.stmt ), 375 get<Expression>().accept1( node->orElse.cond ), 376 }; 377 stmt->location = node->location; 378 stmt->labels = makeLabelL( stmt, node->labels ); 379 this->node = stmt; 183 380 return nullptr; 184 381 } 185 382 186 383 const ast::Stmt * visit( const ast::WithStmt * node ) override final { 187 (void)node; 384 auto stmt = new WithStmt( 385 get<Expression>().acceptL( node->exprs ), 386 get<Statement>().accept1( node->stmt ) 387 ); 388 stmt->location = node->location; 389 stmt->labels = makeLabelL( stmt, node->labels ); 390 this->node = stmt; 188 391 return nullptr; 189 392 } 190 393 191 394 const ast::NullStmt * visit( const ast::NullStmt * node ) override final { 192 (void)node; 395 auto stmt = new NullStmt(); 396 stmt->location = node->location; 397 stmt->labels = makeLabelL( stmt, node->labels ); 398 this->node = stmt; 193 399 return nullptr; 194 400 } 195 401 196 402 const ast::Stmt * visit( const ast::DeclStmt * node ) override final { 197 (void)node; 403 auto stmt = new DeclStmt( get<Declaration>().accept1( node->decl ) ); 404 stmt->location = node->location; 405 stmt->labels = makeLabelL( stmt, node->labels ); 406 this->node = stmt; 198 407 return nullptr; 199 408 } … … 514 723 std::list< Declaration * > decls; 515 724 for(auto d : translationUnit) { 516 d->accept( c ); 517 decls.emplace_back( c.get<Declaration>() ); 725 decls.emplace_back( c.decl( d ) ); 518 726 delete d; 519 727 } … … 964 1172 } 965 1173 966 ast::TypeSubstitution * convertTypeSubstitution(const TypeSubstitution * old) {967 968 ast::TypeSubstitution *rslt = new ast::TypeSubstitution();969 970 for (decltype(old->begin()) old_i = old->begin(); old_i != old->end(); old_i++) {971 rslt->add( old_i->first,972 getAccept1<ast::Type>(old_i->second) );973 }974 975 for (decltype(old->beginVar()) old_i = old->beginVar(); old_i != old->endVar(); old_i++) {976 rslt->addVar( old_i->first,977 getAccept1<ast::Expr>(old_i->second) );978 }979 }980 981 void convertInferUnion(ast::Expr::InferUnion &nwInferred, InferredParams oldInferParams, const std::vector<UniqueId> &oldResnSlots) {982 983 (void) nwInferred;984 (void) oldInferParams;985 (void) oldResnSlots;986 987 // TODO988 }989 990 ast::Expr * visitBaseExpr(Expression * old, ast::Expr * nw) {991 992 nw->result = GET_ACCEPT_1(result, Type);993 nw->env = convertTypeSubstitution(old->env);994 995 nw->extension = old->extension;996 convertInferUnion(nw->inferred, old->inferParams, old->resnSlots);997 998 return nw;999 }1000 1001 1174 virtual void visit( ApplicationExpr * ) override final { 1002 // TODO 1175 1003 1176 } 1004 1177 1005 1178 virtual void visit( UntypedExpr * ) override final { 1006 // TODO 1007 } 1008 1009 virtual void visit( NameExpr * old ) override final { 1010 this->node = visitBaseExpr( old, 1011 new ast::NameExpr( 1012 old->location, 1013 old->get_name() 1014 ) 1015 ); 1179 1180 } 1181 1182 virtual void visit( NameExpr * ) override final { 1183 1016 1184 } 1017 1185 1018 1186 virtual void visit( CastExpr * ) override final { 1019 // TODO ... (rest) 1187 1020 1188 } 1021 1189
Note:
See TracChangeset
for help on using the changeset viewer.