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

Added support for global:: lookups

This commit is contained in:
Brian Fiete 2025-05-18 12:13:15 +02:00
parent ee50457885
commit 958a1630aa
13 changed files with 202 additions and 28 deletions

View file

@ -4248,6 +4248,11 @@ BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createS
FailAfter("Expected scope name", deferStmt);
}
}
else if (nextTokenNode->GetToken() == BfToken_ColonColon)
{
MEMBER_SET(deferStmt, mColonToken, nextTokenNode);
mVisitorPos.MoveNext();
}
else if (nextTokenNode->GetToken() == BfToken_LParen)
{
mPassInstance->Warn(0, "Syntax deprecated", nextTokenNode);
@ -5868,7 +5873,7 @@ BfTypeReference* BfReducer::CreateRefTypeRef(BfTypeReference* elementType, BfTok
return refTypeRef;
}
BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode)
BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode, bool allowGlobalLookup)
{
AssertCurrentNode(leftNode);
@ -5879,9 +5884,15 @@ BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode)
auto leftIdentifier = (BfIdentifierNode*)leftNode;
while (true)
{
bool isGlobalLookup = false;
auto nextToken = mVisitorPos.Get(mVisitorPos.mReadPos + 1);
auto tokenNode = BfNodeDynCast<BfTokenNode>(nextToken);
if ((tokenNode == NULL) || ((tokenNode->GetToken() != BfToken_Dot) /*&& (tokenNode->GetToken() != BfToken_QuestionDot)*/))
if ((tokenNode != NULL) && (tokenNode->mToken == BfToken_ColonColon) && (leftNode->IsExact<BfIdentifierNode>()) && (leftNode->Equals("global")) && (allowGlobalLookup))
{
isGlobalLookup = true;
}
else if ((tokenNode == NULL) || ((tokenNode->GetToken() != BfToken_Dot) /*&& (tokenNode->GetToken() != BfToken_QuestionDot)*/))
return leftIdentifier;
auto nextNextToken = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
@ -5906,6 +5917,22 @@ BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode)
return leftIdentifier;
}
if (isGlobalLookup)
{
// For 'global::', we put 'global' on the left and the rest on the right which is different from normal
mVisitorPos.MoveNext(); // past .
mVisitorPos.MoveNext(); // past right
auto rightSide = CompactQualifiedName(rightIdentifier, false);
auto qualifiedNameNode = mAlloc->Alloc<BfQualifiedNameNode>();
ReplaceNode(leftIdentifier, qualifiedNameNode);
qualifiedNameNode->mLeft = leftIdentifier;
MEMBER_SET(qualifiedNameNode, mDot, tokenNode);
MEMBER_SET(qualifiedNameNode, mRight, rightSide);
return qualifiedNameNode;
}
// If the previous dotted span failed (IE: had chevrons) then don't insert qualified names in the middle of it
auto prevNodeToken = BfNodeDynCast<BfTokenNode>(prevNode);
if ((prevNodeToken != NULL) &&
@ -7935,7 +7962,7 @@ BfInvocationExpression* BfReducer::CreateInvocationExpression(BfAstNode* target,
if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
{
if (nextToken->GetToken() == BfToken_Colon)
if ((nextToken->GetToken() == BfToken_Colon) || (nextToken->GetToken() == BfToken_ColonColon))
{
auto scopedInvocationTarget = CreateScopedInvocationTarget(invocationExpr->mTarget, nextToken);
invocationExpr->SetSrcEnd(scopedInvocationTarget->GetSrcEnd());
@ -8317,6 +8344,10 @@ BfScopedInvocationTarget* BfReducer::CreateScopedInvocationTarget(BfAstNode*& ta
MEMBER_SET(scopedInvocationTarget, mColonToken, colonToken);
mVisitorPos.MoveNext();
if (colonToken->mToken == BfToken_ColonColon)
return scopedInvocationTarget;
if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
{
if ((nextToken->GetToken() == BfToken_Colon) || (nextToken->GetToken() == BfToken_Mixin))
@ -8473,7 +8504,7 @@ BfAstNode* BfReducer::CreateAllocNode(BfTokenNode* allocToken)
auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
if (nextToken == NULL)
return allocToken;
if ((nextToken->mToken != BfToken_Colon) && (nextToken->mToken != BfToken_LBracket))
if ((nextToken->mToken != BfToken_Colon) && (nextToken->mToken != BfToken_ColonColon) && (nextToken->mToken != BfToken_LBracket))
return allocToken;
auto scopeNode = mAlloc->Alloc<BfScopeNode>();
@ -8504,6 +8535,11 @@ BfAstNode* BfReducer::CreateAllocNode(BfTokenNode* allocToken)
FailAfter("Expected scope name", scopeNode);
}
}
else if (nextToken->mToken == BfToken_ColonColon)
{
MEMBER_SET(scopeNode, mColonToken, nextToken);
mVisitorPos.MoveNext();
}
nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
if (nextToken == NULL)