diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 96175c4e..334931d7 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -4045,9 +4045,56 @@ BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createS } else if (token == BfToken_Do) { + bool isRepeat = false; + auto checkNode = mVisitorPos.Get(mVisitorPos.mReadPos + 2); auto checkToken = BfNodeDynCast(checkNode); - if ((checkToken != NULL) && (checkToken->GetToken() == BfToken_While)) + + if ((checkToken != NULL) && (checkToken->mToken == BfToken_While)) + { + // Check to see if it's a 'do {} while (...);' or an indepent 'while' statement + int checkIdx = mVisitorPos.mReadPos + 3; + int openCount = 0; + + while (true) + { + auto checkNode = mVisitorPos.Get(checkIdx); + if (checkNode == NULL) + break; + + if (auto tokenNode = BfNodeDynCast(checkNode)) + { + if (tokenNode->mToken == BfToken_LParen) + { + if ((openCount == 0) && (checkIdx != mVisitorPos.mReadPos + 3)) + break; + openCount++; + } + else if (tokenNode->mToken == BfToken_RParen) + { + openCount--; + if (openCount < 0) + break; + } + else if (tokenNode->mToken == BfToken_Semicolon) + { + isRepeat = true; + break; + } + else if (openCount == 0) + break; + } + else + { + if (openCount == 0) + break; + } + + checkIdx++; + } + } + + if (isRepeat) return CreateRepeatStatement(node); else return CreateDoStatement(node); diff --git a/IDEHelper/Tests/src/Loops.bf b/IDEHelper/Tests/src/Loops.bf index 3ed41260..d131a47a 100644 --- a/IDEHelper/Tests/src/Loops.bf +++ b/IDEHelper/Tests/src/Loops.bf @@ -189,6 +189,14 @@ namespace Tests for (var i in emptySpan.Reversed) Test.FatalError(); + + do + { + } + while (false) + { + + } } public static void TestEnumerator1(EnumeratorTest e)