| 20870 | } |
| 20871 | |
| 20872 | void BfExprEvaluator::AssignDeferrredTupleAssignData(BfAssignmentExpression* assignExpr, DeferredTupleAssignData& deferredTupleAssignData, BfTypedValue rightValue) |
| 20873 | { |
| 20874 | BF_ASSERT(rightValue.mType->IsTuple()); |
| 20875 | auto tupleType = (BfTypeInstance*)rightValue.mType; |
| 20876 | for (int valueIdx = 0; valueIdx < (int)deferredTupleAssignData.mChildren.size(); valueIdx++) |
| 20877 | { |
| 20878 | auto& child = deferredTupleAssignData.mChildren[valueIdx]; |
| 20879 | BfFieldInstance* fieldInstance = &tupleType->mFieldInstances[valueIdx]; |
| 20880 | BfTypedValue elementValue; |
| 20881 | if (fieldInstance->mDataIdx >= 0) |
| 20882 | { |
| 20883 | rightValue = mModule->LoadOrAggregateValue(rightValue); |
| 20884 | mModule->mBfIRBuilder->PopulateType(rightValue.mType); |
| 20885 | auto extractedValue = mModule->mBfIRBuilder->CreateExtractValue(rightValue.mValue, fieldInstance->mDataIdx); |
| 20886 | elementValue = BfTypedValue(extractedValue, fieldInstance->GetResolvedType()); |
| 20887 | if (child.mInnerTuple != NULL) |
| 20888 | { |
| 20889 | AssignDeferrredTupleAssignData(assignExpr, *child.mInnerTuple, elementValue); |
| 20890 | delete child.mInnerTuple; |
| 20891 | child.mInnerTuple = NULL; |
| 20892 | } |
| 20893 | else |
| 20894 | { |
| 20895 | if (child.mExprEvaluator->HasResult()) |
| 20896 | { |
| 20897 | child.mExprEvaluator->mBfEvalExprFlags = (BfEvalExprFlags)(child.mExprEvaluator->mBfEvalExprFlags | BfEvalExprFlags_NoAutoComplete); |
| 20898 | child.mExprEvaluator->PerformAssignment(assignExpr, true, elementValue); |
| 20899 | } |
| 20900 | } |
| 20901 | } |
| 20902 | |
| 20903 | if (child.mVarType != NULL) |
| 20904 | { |
| 20905 | if (auto varDecl = BfNodeDynCast<BfVariableDeclaration>(child.mExpr)) |
| 20906 | { |
| 20907 | if (!elementValue) |
| 20908 | elementValue = mModule->GetDefaultTypedValue(fieldInstance->GetResolvedType()); |
| 20909 | mModule->HandleVariableDeclaration(varDecl, elementValue); |
| 20910 | } |
| 20911 | else |
| 20912 | { |
| 20913 | // This handles the 'a*b' disambiguated variable decl case |
| 20914 | mModule->HandleVariableDeclaration(child.mVarType, child.mVarNameNode, elementValue); |
| 20915 | } |
| 20916 | } |
| 20917 | } |
| 20918 | } |
| 20919 | |
| 20920 | void BfExprEvaluator::DoTupleAssignment(BfAssignmentExpression* assignExpr) |
| 20921 | { |
nothing calls this directly
no test coverage detected