| 1273 | } |
| 1274 | |
| 1275 | BfExpression* 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); |
nothing calls this directly
no test coverage detected