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:
parent
546c4d7e7e
commit
188ff74128
2 changed files with 56 additions and 1 deletions
|
@ -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);
|
||||
|
|
|
@ -189,6 +189,14 @@ namespace Tests
|
|||
|
||||
for (var i in emptySpan.Reversed)
|
||||
Test.FatalError();
|
||||
|
||||
do
|
||||
{
|
||||
}
|
||||
while (false)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static void TestEnumerator1(EnumeratorTest e)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue