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); }
public override PapyrusType VisitBinaryOperationExpression(BinaryOperationExpressionNode node) { // TODO: boolean return(base.VisitBinaryOperationExpression(node)); }