private TypeSymbolNode?BindInBinaryOperation(BinaryOperationExpressionNode binaryOperation,
                                                     VariableIdentifierMap variableIdentifierMap)
        {
            TypeSymbolNode?leftType = BindInExpression(binaryOperation.LeftOperandNode, variableIdentifierMap);

            if (leftType == null)
            {
                return(null);
            }

            TypeSymbolNode?rightType = BindInExpression(binaryOperation.RightOperandNode, variableIdentifierMap);

            if (rightType == null)
            {
                return(null);
            }

            Operator @operator = binaryOperation.Operator;

            BinaryOperationSymbolNode?operationSymbol = FindBestBinaryOperation(@operator,
                                                                                leftType,
                                                                                rightType,
                                                                                out ImplicitConversionSymbolNode? implicitConversionLeft,
                                                                                out ImplicitConversionSymbolNode? implicitConversionRight);

            if (implicitConversionLeft != null)
            {
                binaryOperation.LeftOperandNode.SpecifyImplicitConversion(implicitConversionLeft);
            }

            if (implicitConversionRight != null)
            {
                binaryOperation.RightOperandNode.SpecifyImplicitConversion(implicitConversionRight);
            }

            if (operationSymbol == null)
            {
                ErrorProvider.ReportError(ErrorCode.OperatorNotAvailableForTypes,
                                          Compilation,
                                          binaryOperation,
                                          $"Left type: {leftType.Identifier}",
                                          $"Right type: {rightType.Identifier}");
                return(null);
            }

            binaryOperation.Bind(operationSymbol);

            return(operationSymbol.ReturnTypeNode);
        }
Beispiel #2
0
 public override PapyrusType VisitBinaryOperationExpression(BinaryOperationExpressionNode node)
 {
     // TODO: boolean
     return(base.VisitBinaryOperationExpression(node));
 }