From bdc6a17f79a7abdfb506df31c3d6ce4c02824905 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 3 Aug 2020 05:44:40 -0700 Subject: [PATCH] Propagating readonly with mixin arguments --- IDEHelper/Compiler/BfExprEvaluator.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index a822e017..2889c12c 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -13837,6 +13837,8 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo localVar->mIsReadOnly = argValue.IsReadOnly(); } + if (argValue.IsReadOnly()) + localVar->mIsReadOnly = true; if (argIdx == -1) { @@ -15041,6 +15043,12 @@ BfTypedValue BfExprEvaluator::GetResult(bool clearResult, bool resolveGenericTyp } } } + + if (mResultFieldInstance != NULL) + { + NOP; + } + mPropDef = NULL; mPropDefBypassVirtual = false; mIndexerValues.clear(); @@ -15354,7 +15362,10 @@ bool BfExprEvaluator::CheckModifyResult(BfTypedValue typedVal, BfAstNode* refNod { if (!mModule->mCurMethodInstance->IsMixin()) { - if ((localVar->mResolvedType->IsGenericParam()) && (onlyNeedsMut)) + if (mModule->mCurMethodState->mMixinState != NULL) + error = mModule->Fail(StrFormat("Cannot %s mixin parameter '%s'", modifyType, + localVar->mName.c_str(), mModule->MethodToString(mModule->mCurMethodInstance).c_str()), refNode); + else if ((localVar->mResolvedType->IsGenericParam()) && (onlyNeedsMut)) error = mModule->Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'mut' or 'ref' specifier to parameter or copying to a local variable.", modifyType, localVar->mName.c_str(), mModule->MethodToString(mModule->mCurMethodInstance).c_str()), refNode); else