MCPcopy Create free account
hub / github.com/beefytech/Beef / CheckBinaryOperatorPrecedence

Method CheckBinaryOperatorPrecedence

IDEHelper/Compiler/BfReducer.cpp:1275–1490  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1273}
1274
1275BfExpression* BfReducer::CheckBinaryOperatorPrecedence(BfBinaryOperatorExpression* binOpExpression)
1276{
1277 BfExpression* resultExpr = binOpExpression;
1278
1279 bool dbg = false;
1280
1281#ifdef BF_AST_HAS_PARENT_MEMBER
1282 BF_ASSERT(BfNodeDynCast<BfBinaryOperatorExpression>(binOpExpression->mParent) == NULL);
1283#endif
1284
1285 SizedArray<BfBinaryOperatorExpression*, 8> binOpParents;
1286 SizedArray<BfBinaryOperatorExpression*, 8> deferredChecks;
1287
1288 BfBinaryOperatorExpression* checkBinOpExpression = binOpExpression;
1289 while (true)
1290 {
1291 if (checkBinOpExpression == NULL)
1292 {
1293 if (deferredChecks.size() == 0)
1294 break;
1295 checkBinOpExpression = deferredChecks.back();
1296 deferredChecks.pop_back();
1297 }
1298
1299 if (dbg)
1300 OutputDebugStrF("Checking: %s\n", DbgNodeToString(checkBinOpExpression).c_str());
1301
1302#ifdef BF_AST_HAS_PARENT_MEMBER
1303 BfBinaryOperatorExpression* prevBinOpExpression = BfNodeDynCast<BfBinaryOperatorExpression>(checkBinOpExpression->mParent);
1304 if (prevBinOpExpression != NULL)
1305 {
1306 BF_ASSERT(binOpParents.back() == prevBinOpExpression);
1307 }
1308#else
1309 BfBinaryOperatorExpression* prevBinOpExpression = NULL;
1310#endif
1311
1312 if (!binOpParents.IsEmpty())
1313 {
1314 prevBinOpExpression = binOpParents.back();
1315 }
1316
1317 BfBinaryOperatorExpression* nextBinaryOperatorExpression = NULL;
1318
1319 bool didCondSwap = false;
1320 while (auto rightCondExpression = BfNodeDynCast<BfConditionalExpression>(checkBinOpExpression->mRight))
1321 {
1322 if (rightCondExpression->mTrueExpression == NULL)
1323 break;
1324
1325 // Turn (A || (B ? C : D)) into ((A || B) ? C : D)
1326
1327 BfExpression* exprA = checkBinOpExpression->mLeft;
1328 BfExpression* exprB = rightCondExpression->mConditionExpression;
1329 BfExpression* exprC = rightCondExpression->mTrueExpression;
1330 checkBinOpExpression->SetSrcEnd(exprB->GetSrcEnd());
1331
1332 MEMBER_SET(rightCondExpression, mConditionExpression, checkBinOpExpression);

Callers

nothing calls this directly

Calls 13

DbgNodeToStringFunction · 0.85
SetSrcEndMethod · 0.80
HasFailedMethod · 0.80
SetSrcStartMethod · 0.80
sizeMethod · 0.45
backMethod · 0.45
pop_backMethod · 0.45
c_strMethod · 0.45
IsEmptyMethod · 0.45
GetSrcEndMethod · 0.45
AddMethod · 0.45
GetSrcStartMethod · 0.45

Tested by

no test coverage detected