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

Made AssertCurrentNode a soft error

This commit is contained in:
Brian Fiete 2025-06-12 05:43:15 +02:00
parent 61a1f077ab
commit cc107ae341
2 changed files with 48 additions and 24 deletions

View file

@ -77,25 +77,30 @@ bool BfReducer::StringEquals(BfAstNode* node, BfAstNode* node2)
}
int gAssertCurrentNodeIdx = 0;
void BfReducer::AssertCurrentNode(BfAstNode* node)
bool BfReducer::AssertCurrentNode(BfAstNode* node)
{
if (mSkipCurrentNodeAssert)
return;
return true;
bool success = true;
auto currentNode = mVisitorPos.GetCurrent();
if (currentNode == NULL)
return;
return success;
if ((!node->LocationEndEquals(currentNode)) && (mLastErrorSrcEnd != currentNode->mSrcEnd))
{
const char* lastCPtr = &node->GetSourceData()->mSrc[node->GetSrcEnd() - 1];
// We have an "exceptional" case where breaking a double chevron will look like a position error
if ((lastCPtr[0] != '>') || (lastCPtr[1] != '>'))
{
BF_FATAL("Internal parsing error");
//BF_FATAL("Internal parsing error");
Fail("Internal parsing error", currentNode);
AddErrorNode(currentNode);
success = false;
}
}
gAssertCurrentNodeIdx++;
mAssertCurrentNodeIdx++;
return success;
}
// For autocomplete we only do a reduce on nodes the cursor is in
@ -243,7 +248,8 @@ void BfReducer::AddErrorNode(BfAstNode* astNode, bool removeNode)
bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int endNode, int* retryNode, int* outEndNode, bool* couldBeExpr, bool* isGenericType, bool* isTuple)
{
AssertCurrentNode(checkNode);
if (!AssertCurrentNode(checkNode))
return false;
if (couldBeExpr != NULL)
*couldBeExpr = true;
@ -1081,7 +1087,8 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int
bool BfReducer::IsLocalMethod(BfAstNode* nameNode)
{
AssertCurrentNode(nameNode);
if (!AssertCurrentNode(nameNode))
return false;
int parenDepth = 0;
bool hadParens = false;
@ -1608,7 +1615,8 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
}
}
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto rhsCreateExprFlags = (CreateExprFlags)(createExprFlags & CreateExprFlags_BreakOnRChevron);
@ -3154,7 +3162,8 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat
BfExpression* BfReducer::CreateExpressionAfter(BfAstNode* node, CreateExprFlags createExprFlags)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
bool isEmpty = false;
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
@ -4876,7 +4885,8 @@ bool BfReducer::IsTerminatingExpression(BfAstNode* node)
BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStmtFlags)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
if ((createStmtFlags & CreateStmtFlags_CheckStack) != 0)
{
@ -4989,7 +4999,8 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm
BfAstNode* BfReducer::CreateStatementAfter(BfAstNode* node, CreateStmtFlags createStmtFlags)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
if (nextNode == NULL)
{
@ -5062,7 +5073,8 @@ BfTypeReference* BfReducer::DoCreateNamedTypeRef(BfIdentifierNode* identifierNod
BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefFlags createTypeRefFlags, int endNode)
{
AssertCurrentNode(firstNode);
if (!AssertCurrentNode(firstNode))
return NULL;
bool parseArrayBracket = (createTypeRefFlags & CreateTypeRefFlags_NoParseArrayBrackets) == 0;
@ -5822,7 +5834,8 @@ BfTypeReference* BfReducer::CreateTypeRef(BfAstNode* firstNode, CreateTypeRefFla
BfTypeReference* BfReducer::CreateTypeRefAfter(BfAstNode* astNode, CreateTypeRefFlags createTypeRefFlags)
{
AssertCurrentNode(astNode);
if (!AssertCurrentNode(astNode))
return NULL;
auto nextNode = mVisitorPos.GetNext();
if (nextNode == NULL)
{
@ -5883,7 +5896,8 @@ BfTypeReference* BfReducer::CreateRefTypeRef(BfTypeReference* elementType, BfTok
BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode, bool allowGlobalLookup)
{
AssertCurrentNode(leftNode);
if (!AssertCurrentNode(leftNode))
return NULL;
if ((leftNode == NULL) || (!leftNode->IsA<BfIdentifierNode>()))
return NULL;
@ -7357,7 +7371,10 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
// prevTypeMemberNodeStart.Set();
if (mCurTypeDecl != NULL)
AssertCurrentNode(node);
{
if (!AssertCurrentNode(node))
return NULL;
}
BfTokenNode* refToken = NULL;
@ -9127,8 +9144,9 @@ BfAstNode* BfReducer::HandleTopLevel(BfBlock* node)
}
BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDirective* attributes, BfAstNode* deferredHeadNode, bool isAnonymous)
{
AssertCurrentNode(tokenNode);
{
if (!AssertCurrentNode(tokenNode))
return NULL;
bool isSimpleEnum = false;
if (tokenNode->GetToken() == BfToken_Enum)
@ -9914,7 +9932,8 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken token)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
if ((tokenNode == NULL) ||
@ -9929,7 +9948,8 @@ BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken token)
BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
if ((tokenNode == NULL) ||
@ -9944,7 +9964,8 @@ BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToke
BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB, BfToken tokenC)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
@ -9963,7 +9984,8 @@ BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToke
BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB, BfToken tokenC, BfToken tokenD)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
BfToken token = BfToken_Null;
@ -9981,7 +10003,8 @@ BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToke
BfIdentifierNode* BfReducer::ExpectIdentifierAfter(BfAstNode* node, const char* typeName)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
auto identifierNode = BfNodeDynCast<BfIdentifierNode>(nextNode);
if (identifierNode == NULL)
@ -9998,7 +10021,8 @@ BfIdentifierNode* BfReducer::ExpectIdentifierAfter(BfAstNode* node, const char*
BfBlock* BfReducer::ExpectBlockAfter(BfAstNode* node)
{
AssertCurrentNode(node);
if (!AssertCurrentNode(node))
return NULL;
auto nextNode = mVisitorPos.GetNext();
auto block = BfNodeDynCast<BfBlock>(nextNode);
if (block == NULL)

View file

@ -209,7 +209,7 @@ public:
BfTokenNode* BreakQuestionLBracket(BfTokenNode* tokenNode);
BfCommentNode* FindDocumentation(BfAstNode* defNodeHead, BfAstNode* defNodeEnd = NULL, bool checkDocAfter = false);
void AssertCurrentNode(BfAstNode* node);
bool AssertCurrentNode(BfAstNode* node);
bool IsNodeRelevant(BfAstNode* astNode);
bool IsCursorInside(BfAstNode* astNode);
bool IsNodeRelevant(BfAstNode* startNode, BfAstNode* endNode);