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:
parent
1bd94d7a52
commit
53337c7c50
2 changed files with 19 additions and 4 deletions
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue