| 20749 | } |
| 20750 | |
| 20751 | void BfExprEvaluator::PopulateDeferrredTupleAssignData(BfTupleExpression* tupleExpr, DeferredTupleAssignData& deferredTupleAssignData) |
| 20752 | { |
| 20753 | BfTypeVector fieldTypes; |
| 20754 | Array<String> fieldNames; |
| 20755 | |
| 20756 | // We need to evaluate each LHS tuple component in a separate BfExprEvaluator because each one |
| 20757 | // could be a property and the 'mPropDef' target info is tied to a single evaluator |
| 20758 | for (int valueIdx = 0; valueIdx < (int)tupleExpr->mValues.size(); valueIdx++) |
| 20759 | { |
| 20760 | DeferredTupleAssignData::Entry entry; |
| 20761 | entry.mExprEvaluator = NULL; |
| 20762 | entry.mInnerTuple = NULL; |
| 20763 | entry.mVarType = NULL; |
| 20764 | entry.mVarNameNode = NULL; |
| 20765 | |
| 20766 | BfExpression* valueExpr = tupleExpr->mValues[valueIdx]; |
| 20767 | entry.mExpr = valueExpr; |
| 20768 | BfType* fieldType = NULL; |
| 20769 | BfType* resultType = NULL; |
| 20770 | if (auto innerTupleExpr = BfNodeDynCast<BfTupleExpression>(valueExpr)) |
| 20771 | { |
| 20772 | entry.mInnerTuple = new DeferredTupleAssignData(); |
| 20773 | PopulateDeferrredTupleAssignData(innerTupleExpr, *entry.mInnerTuple); |
| 20774 | resultType = entry.mInnerTuple->mTupleType; |
| 20775 | } |
| 20776 | else |
| 20777 | { |
| 20778 | BfExprEvaluator* exprEvaluator = new BfExprEvaluator(mModule); |
| 20779 | entry.mExprEvaluator = exprEvaluator; |
| 20780 | |
| 20781 | if (valueExpr->IsA<BfUninitializedExpression>()) |
| 20782 | { |
| 20783 | resultType = mModule->GetPrimitiveType(BfTypeCode_None); |
| 20784 | } |
| 20785 | |
| 20786 | if (auto varDecl = BfNodeDynCast<BfVariableDeclaration>(valueExpr)) |
| 20787 | { |
| 20788 | if ((varDecl->mTypeRef->IsA<BfLetTypeReference>()) || (varDecl->mTypeRef->IsA<BfVarTypeReference>())) |
| 20789 | { |
| 20790 | resultType = mModule->GetPrimitiveType(BfTypeCode_Var); |
| 20791 | } |
| 20792 | else |
| 20793 | { |
| 20794 | resultType = ResolveTypeRef(varDecl->mTypeRef); |
| 20795 | if (resultType == NULL) |
| 20796 | resultType = mModule->GetPrimitiveType(BfTypeCode_Var); |
| 20797 | } |
| 20798 | entry.mVarType = resultType; |
| 20799 | } |
| 20800 | |
| 20801 | if (auto binOpExpr = BfNodeDynCast<BfBinaryOperatorExpression>(valueExpr)) |
| 20802 | { |
| 20803 | if (binOpExpr->mOp == BfBinaryOp_Multiply) |
| 20804 | { |
| 20805 | SetAndRestoreValue<bool> prevIgnoreError(mModule->mIgnoreErrors, true); |
| 20806 | auto resolvedType = mModule->ResolveTypeRef(binOpExpr->mLeft, NULL); |
| 20807 | prevIgnoreError.Restore(); |
| 20808 | if (resolvedType != NULL) |
nothing calls this directly
no test coverage detected