1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-17 23:56:05 +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 else
{ {
// This can happen if we have a conflicting type definition
savedTypeData = *savedTypeDataPtr; savedTypeData = *savedTypeDataPtr;
BF_DBG_FATAL("mSavedTypeData already had type name");
} }
savedTypeData->mTypeId = type->mTypeId; savedTypeData->mTypeId = type->mTypeId;
while ((int)mSavedTypeData.size() <= savedTypeData->mTypeId) while ((int)mSavedTypeData.size() <= savedTypeData->mTypeId)

View file

@ -3837,6 +3837,13 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
} }
else else
mPropTarget = target; 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; mOrigPropTarget = mPropTarget;
auto autoComplete = GetAutoComplete(); auto autoComplete = GetAutoComplete();
@ -12118,6 +12125,14 @@ BfTypedValue BfExprEvaluator::MakeCallableTarget(BfAstNode* targetSrc, BfTypedVa
return target; 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()) if (target.mType->IsWrappableType())
{ {
auto primStructType = mModule->GetWrappedStructType(target.mType); auto primStructType = mModule->GetWrappedStructType(target.mType);
@ -12148,7 +12163,7 @@ BfTypedValue BfExprEvaluator::MakeCallableTarget(BfAstNode* targetSrc, BfTypedVa
if ((!target.mType->IsTypeInstance()) && (!target.mType->IsConcreteInterfaceType())) 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(); return BfTypedValue();
} }