1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Fixed do/while detection

This commit is contained in:
Brian Fiete 2025-02-23 06:59:30 -08:00
parent 546c4d7e7e
commit 188ff74128
2 changed files with 56 additions and 1 deletions

View file

@ -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<BfTokenNode>(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<BfTokenNode>(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);

View file

@ -189,6 +189,14 @@ namespace Tests
for (var i in emptySpan.Reversed)
Test.FatalError();
do
{
}
while (false)
{
}
}
public static void TestEnumerator1(EnumeratorTest e)