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

Added nameof

This commit is contained in:
Brian Fiete 2022-07-06 12:19:01 -07:00
parent dd0d67cca1
commit 7dd2324fcf
13 changed files with 307 additions and 13 deletions

View file

@ -2352,6 +2352,41 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
exprLeft = CreateMemberReferenceExpression(typeRef);
}
}
else if (tokenNode->GetToken() == BfToken_NameOf)
{
BfNameOfExpression* nameOfExpr = mAlloc->Alloc<BfNameOfExpression>();
ReplaceNode(tokenNode, nameOfExpr);
nameOfExpr->mToken = tokenNode;
tokenNode = ExpectTokenAfter(nameOfExpr, BfToken_LParen);
MEMBER_SET_CHECKED(nameOfExpr, mOpenParen, tokenNode);
mVisitorPos.MoveNext();
int outEndNode = -1;
bool isTypeRef = IsTypeReference(mVisitorPos.GetCurrent(), BfToken_RParen, -1, &outEndNode);
mVisitorPos.mReadPos--;
if ((isTypeRef) && (outEndNode > 0))
{
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode - 1)))
{
if ((tokenNode->mToken == BfToken_RChevron) || (tokenNode->mToken == BfToken_RDblChevron))
{
// Can ONLY be a type reference
auto typeRef = CreateTypeRefAfter(nameOfExpr);
MEMBER_SET_CHECKED(nameOfExpr, mTarget, typeRef);
}
}
}
if (nameOfExpr->mTarget == NULL)
{
auto expr = CreateExpressionAfter(nameOfExpr);
MEMBER_SET_CHECKED(nameOfExpr, mTarget, expr);
}
tokenNode = ExpectTokenAfter(nameOfExpr, BfToken_RParen);
MEMBER_SET_CHECKED(nameOfExpr, mCloseParen, tokenNode);
exprLeft = nameOfExpr;
}
if (exprLeft == NULL)
{