MCPcopy Create free account
hub / github.com/GaijinEntertainment/daScript / replaceGeneratorIfThenElse

Function replaceGeneratorIfThenElse

src/ast/ast_generate.cpp:1230–1288  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1228 }
1229
1230 ExpressionPtr replaceGeneratorIfThenElse ( ExprIfThenElse * expr, const FunctionPtr & func ) {
1231 auto blk = new ExprBlock();
1232 blk->at = expr->at;
1233 blk->isCollapseable = true;
1234 if ( expr->if_false ) {
1235 auto else_label = func->totalGenLabel ++;
1236 auto end_label = func->totalGenLabel ++;
1237 auto gtel = new ExprGoto(expr->at, else_label);
1238 auto btel = new ExprBlock();
1239 btel->at = expr->at;
1240 btel->list.push_back(gtel);
1241 auto ncnd = new ExprOp1(expr->cond->at, "!", expr->cond->clone());
1242 auto ifnc = new ExprIfThenElse(expr->at, ncnd, btel, nullptr);
1243 blk->list.push_back(ifnc);
1244 auto ift = expr->if_true->clone();
1245 if ( ift->rtti_isBlock() ){
1246 auto iftb = static_cast<ExprBlock*>(ift);
1247 iftb->isCollapseable = true;
1248 giveBlockVariablesUniqueNames(ift);
1249 }
1250 blk->list.push_back(ift);
1251 auto gten = new ExprGoto(expr->at, end_label);
1252 blk->list.push_back(gten);
1253 auto elsel = new ExprLabel(expr->at, else_label,
1254 "else if at line " + to_string(expr->at.line));
1255 blk->list.push_back(elsel);
1256 auto iff = expr->if_false->clone();
1257 if ( iff->rtti_isBlock() ){
1258 auto iffb = static_cast<ExprBlock*>(iff);
1259 iffb->isCollapseable = true;
1260 giveBlockVariablesUniqueNames(iff);
1261 }
1262 blk->list.push_back(iff);
1263 auto enddl = new ExprLabel(expr->at, end_label,
1264 "end if at line " + to_string(expr->at.line));
1265 blk->list.push_back(enddl);
1266 } else {
1267 auto end_label = func->totalGenLabel ++;
1268 auto gtel = new ExprGoto(expr->at, end_label);
1269 auto btel = new ExprBlock();
1270 btel->at = expr->at;
1271 btel->list.push_back(gtel);
1272 auto ncnd = new ExprOp1(expr->cond->at, "!", expr->cond->clone());
1273 auto ifnc = new ExprIfThenElse(expr->at, ncnd, btel, nullptr);
1274 blk->list.push_back(ifnc);
1275 auto ift = expr->if_true->clone();
1276 if ( ift->rtti_isBlock() ){
1277 auto iftb = static_cast<ExprBlock*>(ift);
1278 iftb->isCollapseable = true;
1279 giveBlockVariablesUniqueNames(ift);
1280 }
1281 blk->list.push_back(ift);
1282 auto enddl = new ExprLabel(expr->at, end_label,
1283 "end if at line " + to_string(expr->at.line));
1284 blk->list.push_back(enddl);
1285 }
1286 verifyGenerated(blk);
1287 return blk;

Callers 1

visitMethod · 0.85

Calls 5

to_stringFunction · 0.85
verifyGeneratedFunction · 0.85
push_backMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected