ソースを参照

Treat enum match out values as conditional assignments

Brian Fiete 3 年 前
コミット
f38cf6a1fd
1 ファイル変更21 行追加3 行削除
  1. 21 3
      IDEHelper/Compiler/BfStmtEvaluator.cpp

+ 21 - 3
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -2395,12 +2395,21 @@ void BfModule::HandleCaseEnumMatch_Tuple(BfTypedValue tupleVal, const BfSizedArr
 				BfExprEvaluator exprEvaluator(this);
 				exprEvaluator.mExpectingType = tupleFieldInstance->GetResolvedType();
 				exprEvaluator.mBfEvalExprFlags = BfEvalExprFlags_AllowOutExpr;
-				exprEvaluator.Evaluate(expr);
+				if (mCurMethodState->mDeferredLocalAssignData != NULL)
+				{
+					SetAndRestoreValue<bool> prevIsIfCondition(mCurMethodState->mDeferredLocalAssignData->mIsIfCondition, true);
+					SetAndRestoreValue<bool> prevIfMayBeSkipped(mCurMethodState->mDeferredLocalAssignData->mIfMayBeSkipped, true);
+					exprEvaluator.Evaluate(expr);
+				}
+				else
+				{
+					exprEvaluator.Evaluate(expr);
+				}
 				if (isMatchedBlockEnd)
 					matchedBlockEnd = mBfIRBuilder->GetInsertBlock();
 				if (isFalseBlockEnd)
 					falseBlockEnd = mBfIRBuilder->GetInsertBlock();
-				auto argValue = exprEvaluator.mResult;			
+				auto argValue = exprEvaluator.mResult;
 				if (!argValue)
 					continue;
 
@@ -2417,7 +2426,16 @@ void BfModule::HandleCaseEnumMatch_Tuple(BfTypedValue tupleVal, const BfSizedArr
 
 					DeferredAssign deferredAssign = { expr, argValue, tupleElement, tupleFieldIdx };
 					deferredAssigns.push_back(deferredAssign);
-					exprEvaluator.MarkResultAssigned();
+					if (mCurMethodState->mDeferredLocalAssignData != NULL)
+					{
+						SetAndRestoreValue<bool> prevIsIfCondition(mCurMethodState->mDeferredLocalAssignData->mIsIfCondition, true);
+						SetAndRestoreValue<bool> prevIfMayBeSkipped(mCurMethodState->mDeferredLocalAssignData->mIfMayBeSkipped, true);
+						exprEvaluator.MarkResultAssigned();
+					}
+					else
+					{
+						exprEvaluator.MarkResultAssigned();
+					}
 					continue;
 				}