diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 03abd3f6..707bdcd3 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -17718,13 +17718,13 @@ bool BfExprEvaluator::CheckModifyResult(BfTypedValue typedVal, BfAstNode* refNod { if (mModule->mCurMethodState->mMixinState != NULL) error = _Fail(StrFormat("Cannot %s mixin parameter '%s'", modifyType, - localVar->mName.c_str(), mModule->MethodToString(mModule->mCurMethodInstance).c_str()), refNode); + localVar->mName.c_str()), refNode); else if ((localVar->mResolvedType->IsGenericParam()) && (onlyNeedsMut)) - error = _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); + error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'mut' or 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", modifyType, + localVar->mName.c_str(), localVar->mName.c_str()), refNode); else - error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'ref' specifier to parameter or copying to a local variable.", modifyType, - localVar->mName.c_str(), mModule->MethodToString(mModule->mCurMethodInstance).c_str()), refNode); + error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", modifyType, + localVar->mName.c_str(), localVar->mName.c_str()), refNode); return false; } } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index ceccb492..b785bea2 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -14734,11 +14734,16 @@ void BfModule::CheckVariableDef(BfLocalVariable* variableDef) if (checkLocal->mIsImplicitParam) return; // Ignore 'redefinition' if (checkLocal->IsParam()) - error = Fail(StrFormat("A parameter named '%s' has already been declared.", variableDef->mName.c_str()), variableDef->mNameNode); + { + if (variableDef->IsParam()) + error = Fail(StrFormat("A parameter named '%s' has already been declared", variableDef->mName.c_str()), variableDef->mNameNode); + else + error = Fail(StrFormat("The name '%s' is already used by a parameter. Consider declaring 'var %s;' if you wish to make a mutable copy of that parameter.", variableDef->mName.c_str(), variableDef->mName.c_str()), variableDef->mNameNode); + } else if (checkLocal->mLocalVarIdx < mCurMethodState->mCurScope->mLocalVarStart) - error = Fail(StrFormat("A variable named '%s' has already been declared in this parent's scope.", variableDef->mName.c_str()), variableDef->mNameNode); + error = Fail(StrFormat("A variable named '%s' has already been declared in this parent's scope", variableDef->mName.c_str()), variableDef->mNameNode); else - error = Fail(StrFormat("A variable named '%s' has already been declared in this scope.", variableDef->mName.c_str()), variableDef->mNameNode); + error = Fail(StrFormat("A variable named '%s' has already been declared in this scope", variableDef->mName.c_str()), variableDef->mNameNode); if ((checkLocal->mNameNode != NULL) && (error != NULL)) mCompiler->mPassInstance->MoreInfo("Previous declaration", checkLocal->mNameNode); return; @@ -14753,7 +14758,7 @@ BfScopeData* BfModule::FindScope(BfAstNode* scopeName, BfMixinState* fromMixinSt if (auto tokenNode = BfNodeDynCast(scopeName)) { if (tokenNode->GetToken() == BfToken_Colon) - { + { if ((!allowAcrossDeferredBlock) && (mCurMethodState->mInDeferredBlock)) { Fail("Cannot access method scope across deferred block boundary", scopeName);