1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-14 14:24:10 +02:00

Parse fixes for failed attempted cast

This commit is contained in:
Brian Fiete 2020-06-23 09:29:26 -07:00
parent 807d8eba7e
commit fb5eaaa010

View file

@ -2067,32 +2067,47 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
if (isCastExpr) if (isCastExpr)
{ {
auto bfCastExpr = mAlloc->Alloc<BfCastExpression>(); BfCastExpression* bfCastExpr = NULL;
if (isTuple) if (isTuple)
{ {
// Create typeRef including the parens (tuple type) // Create typeRef including the parens (tuple type)
auto castTypeRef = CreateTypeRef(tokenNode); auto castTypeRef = CreateTypeRef(tokenNode);
if (castTypeRef != NULL)
{
bfCastExpr = mAlloc->Alloc<BfCastExpression>();
ReplaceNode(castTypeRef, bfCastExpr); ReplaceNode(castTypeRef, bfCastExpr);
bfCastExpr->mTypeRef = castTypeRef; bfCastExpr->mTypeRef = castTypeRef;
} }
}
else else
{ {
auto castTypeRef = CreateTypeRefAfter(tokenNode);
if (castTypeRef != NULL)
{
bfCastExpr = mAlloc->Alloc<BfCastExpression>();
ReplaceNode(tokenNode, bfCastExpr); ReplaceNode(tokenNode, bfCastExpr);
bfCastExpr->mOpenParen = tokenNode; bfCastExpr->mOpenParen = tokenNode;
auto castTypeRef = CreateTypeRefAfter(bfCastExpr);
MEMBER_SET_CHECKED(bfCastExpr, mTypeRef, castTypeRef); MEMBER_SET_CHECKED(bfCastExpr, mTypeRef, castTypeRef);
tokenNode = ExpectTokenAfter(bfCastExpr, BfToken_RParen); tokenNode = ExpectTokenAfter(bfCastExpr, BfToken_RParen);
MEMBER_SET_CHECKED(bfCastExpr, mCloseParen, tokenNode); MEMBER_SET_CHECKED(bfCastExpr, mCloseParen, tokenNode);
} }
}
if (bfCastExpr == NULL)
isCastExpr = false;
else
{
auto expression = CreateExpressionAfter(bfCastExpr); auto expression = CreateExpressionAfter(bfCastExpr);
if (expression == NULL) if (expression == NULL)
return bfCastExpr; return bfCastExpr;
MEMBER_SET(bfCastExpr, mExpression, expression); MEMBER_SET(bfCastExpr, mExpression, expression);
unaryOpExpr = bfCastExpr; unaryOpExpr = bfCastExpr;
} }
else }
if (!isCastExpr)
{ {
if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext())) if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
{ {