void BinaryOperatorExpressionSyntax::resolveTypes(types::NameResolutionContextStack *ctx) { _left->resolveTypes(ctx); _right->resolveTypes(ctx); auto bin_op = getBinaryOperator(); if (bin_op == nullptr) return; _overload = bin_op->findOverload(_left->getExpressionType(), _right->getExpressionType()); if (_overload == nullptr) { this->reportError("Cannot find binary operator overload for operator %s", getOperatorSymbol()); return; } _left->suggestExpressionType(_overload->getParameterInfo(0)->getType()); _right->suggestExpressionType(_overload->getParameterInfo(1)->getType()); _left->resolveTypes(ctx); _right->resolveTypes(ctx); if (!_left->getExpressionType()->isSameAs(_overload->getParameterInfo(0)->getType())) { _castLeft = op::Operator::implicitCast()->findOverload(_left->getExpressionType(), _overload->getParameterInfo(0)->getType()); } if (!_right->getExpressionType()->isSameAs(_overload->getParameterInfo(1)->getType())) { _castRight = op::Operator::implicitCast()->findOverload(_right->getExpressionType(), _overload->getParameterInfo(1)->getType()); } }
ArithmeticAssignmentNode* ArithmeticAssignmentNode::fromArithmeticAssignmentToken(const SourcePos& sourcePos, Compiler::Token::Type token, Node *left, Node *right) { return new ArithmeticAssignmentNode(sourcePos, getBinaryOperator(token), left, right); }