فهرست منبع

Error fix for readonly field

Brian Fiete 5 سال پیش
والد
کامیت
1be4c24e45
1فایلهای تغییر یافته به همراه28 افزوده شده و 4 حذف شده
  1. 28 4
      IDEHelper/Compiler/BfExprEvaluator.cpp

+ 28 - 4
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -15744,8 +15744,32 @@ bool BfExprEvaluator::CheckModifyResult(BfTypedValue typedVal, BfAstNode* refNod
 			}
 			else
 			{
-				error = mModule->Fail(StrFormat("Cannot %s read-only local variable '%s'.", modifyType,
-					localVar->mName.c_str()), refNode);
+				if ((mResultLocalVarField != 0) && (!localVar->mIsReadOnly))
+				{
+					auto typeInst = localVar->mResolvedType->ToTypeInstance();
+					int dataIdx = mResultLocalVarField - 1;
+					if (typeInst != NULL)
+					{
+						for (auto& field : typeInst->mFieldInstances)
+						{
+							if (field.mDataIdx == dataIdx)
+							{
+								error = mModule->Fail(StrFormat("Cannot %s readonly field '%s.%s'.", modifyType,
+									mModule->TypeToString(typeInst).c_str(),
+									field.GetFieldDef()->mName.c_str()), refNode);
+								break;
+							}
+						}
+
+						
+					}					
+				}
+				
+				if (error == NULL)
+				{
+					error = mModule->Fail(StrFormat("Cannot %s read-only local variable '%s'.", modifyType,
+						localVar->mName.c_str()), refNode);
+				}
 				return false;
 			}			
 		}
@@ -18908,8 +18932,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
 		mResult = BfTypedValue(phi, leftValue.mType);
 		
 		return;
-	}	
-	
+	}
+
 	if ((binaryOp == BfBinaryOp_LeftShift) || (binaryOp == BfBinaryOp_RightShift))
 	{
 		forceLeftType = true;