mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +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)
|
else if (token == BfToken_Do)
|
||||||
{
|
{
|
||||||
|
bool isRepeat = false;
|
||||||
|
|
||||||
auto checkNode = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
|
auto checkNode = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
|
||||||
auto checkToken = BfNodeDynCast<BfTokenNode>(checkNode);
|
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);
|
return CreateRepeatStatement(node);
|
||||||
else
|
else
|
||||||
return CreateDoStatement(node);
|
return CreateDoStatement(node);
|
||||||
|
|
|
@ -189,6 +189,14 @@ namespace Tests
|
||||||
|
|
||||||
for (var i in emptySpan.Reversed)
|
for (var i in emptySpan.Reversed)
|
||||||
Test.FatalError();
|
Test.FatalError();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
}
|
||||||
|
while (false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TestEnumerator1(EnumeratorTest e)
|
public static void TestEnumerator1(EnumeratorTest e)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue