1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-17 07:44:09 +02:00

Improved error for calling ptr to ref type. Fixed properties on ptr

This commit is contained in:
Brian Fiete 2020-04-25 15:01:02 -07:00
parent 1bd94d7a52
commit 53337c7c50
2 changed files with 19 additions and 4 deletions

View file

@ -1335,8 +1335,8 @@ void BfContext::SaveDeletingType(BfType* type)
}
else
{
// This can happen if we have a conflicting type definition
savedTypeData = *savedTypeDataPtr;
BF_DBG_FATAL("mSavedTypeData already had type name");
}
savedTypeData->mTypeId = type->mTypeId;
while ((int)mSavedTypeData.size() <= savedTypeData->mTypeId)

View file

@ -3837,6 +3837,13 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
}
else
mPropTarget = target;
if (mPropTarget.mType->IsStructPtr())
{
mPropTarget = mModule->LoadValue(mPropTarget);
mPropTarget = BfTypedValue(mPropTarget.mValue, mPropTarget.mType->GetUnderlyingType(), mPropTarget.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
}
mOrigPropTarget = mPropTarget;
auto autoComplete = GetAutoComplete();
@ -12118,6 +12125,14 @@ BfTypedValue BfExprEvaluator::MakeCallableTarget(BfAstNode* targetSrc, BfTypedVa
return target;
}
if ((target.mType->IsPointer()) && (target.mType->GetUnderlyingType()->IsObjectOrInterface()))
{
mModule->Fail(StrFormat("Methods cannot be called on type '%s' because the type is a pointer to a reference type (ie: a double-reference).",
mModule->TypeToString(target.mType).c_str()), targetSrc);
target.mType = mModule->mContext->mBfObjectType;
return target;
}
if (target.mType->IsWrappableType())
{
auto primStructType = mModule->GetWrappedStructType(target.mType);
@ -12148,7 +12163,7 @@ BfTypedValue BfExprEvaluator::MakeCallableTarget(BfAstNode* targetSrc, BfTypedVa
if ((!target.mType->IsTypeInstance()) && (!target.mType->IsConcreteInterfaceType()))
{
mModule->Fail(StrFormat("Invalid target type: '%s'", mModule->TypeToString(target.mType).c_str()), targetSrc);
mModule->Fail(StrFormat("Methods cannot be called on type '%s'", mModule->TypeToString(target.mType).c_str()), targetSrc);
return BfTypedValue();
}