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

Added [IgnoreErrors] block attribute

This commit is contained in:
Brian Fiete 2020-08-16 08:33:51 -07:00
parent 65d960a6e6
commit 99419097c5
16 changed files with 307 additions and 79 deletions

View file

@ -3394,9 +3394,19 @@ void BfModule::VisitCodeBlock(BfBlock* block)
{
if (mCurMethodState->mCurScope->mExprEvaluator != NULL)
{
// Evaluate last child as an expression
mCurMethodState->mCurScope->mExprEvaluator->VisitChild(expr);
mCurMethodState->mCurScope->mExprEvaluator->FinishExpressionResult();
if ((mAttributeState != NULL) &&
((mAttributeState->mFlags & (BfAttributeState::Flag_StopOnError | BfAttributeState::Flag_HadError)) == (BfAttributeState::Flag_StopOnError | BfAttributeState::Flag_HadError)))
{
// Resolve as just 'false'
mCurMethodState->mCurScope->mExprEvaluator->mResult = GetDefaultTypedValue(GetPrimitiveType(BfTypeCode_Boolean));
}
else
{
// Evaluate last child as an expression
mCurMethodState->mCurScope->mExprEvaluator->VisitChild(expr);
mCurMethodState->mCurScope->mExprEvaluator->FinishExpressionResult();
}
break;
}
else if (mCurMethodState->InMainMixinScope())
@ -3416,10 +3426,17 @@ void BfModule::VisitCodeBlock(BfBlock* block)
}
}
}
UpdateSrcPos(child);
BfAutoParentNodeEntry autoParentNode(this, child);
child->Accept(this);
if ((mAttributeState != NULL) &&
((mAttributeState->mFlags & (BfAttributeState::Flag_StopOnError | BfAttributeState::Flag_HadError)) == (BfAttributeState::Flag_StopOnError | BfAttributeState::Flag_HadError)))
{
// Ignore child
}
else
child->Accept(this);
mSystem->CheckLockYield();
@ -3740,6 +3757,41 @@ void BfModule::Visit(BfLocalMethodDeclaration* methodDecl)
Fail("Local method declarations must be wrapped in a block statement", methodDecl->mMethodDeclaration->mNameNode);
}
void BfModule::Visit(BfAttributedStatement* attribStmt)
{
BfAttributeState attributeState;
attributeState.mTarget = (BfAttributeTargets)(BfAttributeTargets_Invocation | BfAttributeTargets_MemberAccess);
if (auto block = BfNodeDynCast<BfBlock>(attribStmt->mStatement))
attributeState.mTarget = BfAttributeTargets_Block;
attributeState.mCustomAttributes = GetCustomAttributes(attribStmt->mAttributes, attributeState.mTarget);
SetAndRestoreValue<BfAttributeState*> prevAttributeState(mAttributeState, &attributeState);
if (auto ignoreErrorsAttrib = attributeState.mCustomAttributes->Get(mCompiler->mIgnoreErrorsAttributeTypeDef))
{
SetAndRestoreValue<bool> ignoreErrors(mIgnoreErrors, true);
if (!ignoreErrorsAttrib->mCtorArgs.IsEmpty())
{
auto constant = mCurTypeInstance->mConstHolder->GetConstant(ignoreErrorsAttrib->mCtorArgs[0]);
if (constant->mBool)
attributeState.mFlags = BfAttributeState::Flag_StopOnError;
}
VisitChild(attribStmt->mStatement);
attributeState.mUsed = true;
}
else
{
VisitChild(attribStmt->mStatement);
}
if (!attributeState.mUsed)
{
Fail("Unused attributes", attribStmt->mAttributes);
}
}
void BfModule::Visit(BfExpression* expression)
{
UpdateSrcPos(expression);