From 53337c7c5088c4a7c3c1b5c0ec882c293fc2d01b Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 25 Apr 2020 15:01:02 -0700 Subject: [PATCH] Improved error for calling ptr to ref type. Fixed properties on ptr --- IDEHelper/Compiler/BfContext.cpp | 4 ++-- IDEHelper/Compiler/BfExprEvaluator.cpp | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index ec1fb778..224b42cc 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -1335,8 +1335,8 @@ void BfContext::SaveDeletingType(BfType* type) } else { - savedTypeData = *savedTypeDataPtr; - BF_DBG_FATAL("mSavedTypeData already had type name"); + // This can happen if we have a conflicting type definition + savedTypeData = *savedTypeDataPtr; } savedTypeData->mTypeId = type->mTypeId; while ((int)mSavedTypeData.size() <= savedTypeData->mTypeId) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index f3721585..63082e27 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3827,7 +3827,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar mModule->TypeToString(curCheckType).c_str(), mPropDef->mName.c_str()), targetSrc); } } - + if (prop->mIsStatic) mPropTarget = BfTypedValue(curCheckType); else if (isBaseLookup) @@ -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(); }