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

Added errors panel

This commit is contained in:
Brian Fiete 2020-01-12 09:21:50 -08:00
parent aa0277485f
commit 9d1b85cceb
8 changed files with 234 additions and 90 deletions

View file

@ -6890,20 +6890,23 @@ BfTypedValue BfModule::FlushNullConditional(BfTypedValue result, bool ignoreNull
if (nullableTypedValue)
{
auto elementType = nullableType->GetUnderlyingType();
if (elementType->IsValuelessType())
if (elementType->IsVar())
{
// Do nothing
}
else if (elementType->IsValuelessType())
{
BfIRValue ptrValue = mBfIRBuilder->CreateInBoundsGEP(nullableTypedValue.mValue, 0, 1); // mHasValue
mBfIRBuilder->CreateStore(GetConstValue(1, GetPrimitiveType(BfTypeCode_Boolean)), ptrValue);
result = nullableTypedValue;
mBfIRBuilder->CreateStore(GetConstValue(1, GetPrimitiveType(BfTypeCode_Boolean)), ptrValue);
}
else
{
BfIRValue ptrValue = mBfIRBuilder->CreateInBoundsGEP(nullableTypedValue.mValue, 0, 1); // mValue
mBfIRBuilder->CreateStore(result.mValue, ptrValue);
ptrValue = mBfIRBuilder->CreateInBoundsGEP(nullableTypedValue.mValue, 0, 2); // mHasValue
mBfIRBuilder->CreateStore(GetConstValue(1, GetPrimitiveType(BfTypeCode_Boolean)), ptrValue);
result = nullableTypedValue;
mBfIRBuilder->CreateStore(GetConstValue(1, GetPrimitiveType(BfTypeCode_Boolean)), ptrValue);
}
result = nullableTypedValue;
}
mBfIRBuilder->CreateBr(pendingNullCond->mDoneBB);

View file

@ -652,12 +652,13 @@ void BfModule::TypeFailed(BfTypeInstance* typeInstance)
{
BfLogSysM("TypeFailed: %p\n", typeInstance);
typeInstance->mTypeFailed = true;
// Punt on field types - just substitute System.Object where we have NULLs
// Punt on field types - just substitute 'var' where we have NULLs
for (auto& fieldInstance : typeInstance->mFieldInstances)
{
{
if ((fieldInstance.mResolvedType == NULL) || (fieldInstance.mResolvedType->IsNull()))
{
fieldInstance.mResolvedType = mContext->mBfObjectType;
if (fieldInstance.mDataIdx >= 0)
fieldInstance.mResolvedType = GetPrimitiveType(BfTypeCode_Var);
}
if (fieldInstance.mOwner == NULL)
fieldInstance.mOwner = typeInstance;
@ -2268,6 +2269,8 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if ((fieldInstance->mResolvedType != NULL) || (!fieldInstance->mFieldIncluded))
continue;
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
BfType* resolvedFieldType = NULL;
if (field->IsEnumCaseEntry())
@ -2304,15 +2307,14 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
// For 'let', make read-only
}
else
{
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
{
resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam);
if (resolvedFieldType == NULL)
{
// Failed, just put in placeholder 'var'
AssertErrorState();
resolvedFieldType = GetPrimitiveType(BfTypeCode_Var);
}
}
}
if (resolvedFieldType->IsMethodRef())

View file

@ -198,7 +198,7 @@ BfAstNode* BfReducer::Fail(const StringImpl& errorMsg, BfAstNode* refNode)
if (mPassInstance->HasLastFailedAt(refNode)) // No duplicate failures
return NULL;
auto error = mPassInstance->Fail(errorMsg, refNode);
if (error != NULL)
if ((error != NULL) && (mSource != NULL))
error->mProject = mSource->mProject;
return NULL;
}
@ -207,7 +207,7 @@ BfAstNode* BfReducer::FailAfter(const StringImpl& errorMsg, BfAstNode* prevNode)
{
mStmtHasError = true;
auto error = mPassInstance->FailAfter(errorMsg, prevNode);
if (error != NULL)
if ((error != NULL) && (mSource != NULL))
error->mProject = mSource->mProject;
return NULL;
}
@ -4299,7 +4299,7 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm
return stmt;
auto error = mPassInstance->FailAfterAt("Semicolon expected", node->GetSourceData(), stmt->GetSrcEnd() - 1);
if (error != NULL)
if ((error != NULL) && (mSource != NULL))
error->mProject = mSource->mProject;
mPrevStmtHadError = true;
return stmt;