public override AstNode Visit(BinaryOperation node) { // Process the left expression. Expression left = node.GetLeftExpression(); left = (Expression)left.Accept(this); node.SetLeftExpression(left); // Process the right expression. Expression right = node.GetRightExpression(); right = (Expression)right.Accept(this); node.SetRightExpression(node); // Get the node type. IChelaType nodeType = node.GetNodeType(); if(!nodeType.IsConstant()) return node; // Perform left constant coercion. ConstantValue leftConstant = (ConstantValue)left.GetNodeValue(); IChelaType leftType = left.GetNodeType(); IChelaType leftCoercion = node.GetCoercionType(); if(leftType != leftCoercion) leftConstant = leftConstant.Cast(leftCoercion); // Perform right constant coercion. ConstantValue rightConstant = (ConstantValue)right.GetNodeValue(); IChelaType rightType = right.GetNodeType(); IChelaType rightCoercion = node.GetSecondCoercion(); if(rightType != rightCoercion) rightConstant = rightConstant.Cast(rightCoercion); // Perform the constant operation. ConstantValue res = null; switch(node.GetOperation()) { case BinaryOperation.OpAdd: res = leftConstant + rightConstant; break; case BinaryOperation.OpSub: res = leftConstant - rightConstant; break; case BinaryOperation.OpMul: res = leftConstant * rightConstant; break; case BinaryOperation.OpDiv: res = leftConstant / rightConstant; break; case BinaryOperation.OpMod: res = leftConstant % rightConstant; break; case BinaryOperation.OpEQ: res = ConstantValue.Equals(leftConstant, rightConstant); break; case BinaryOperation.OpNEQ: res = ConstantValue.NotEquals(leftConstant, rightConstant); break; case BinaryOperation.OpLT: res = leftConstant < rightConstant; break; case BinaryOperation.OpLEQ: res = leftConstant <= rightConstant; break; case BinaryOperation.OpGT: res = leftConstant > rightConstant; break; case BinaryOperation.OpGEQ: res = leftConstant >= rightConstant; break; case BinaryOperation.OpBitAnd: res = leftConstant & rightConstant; break; case BinaryOperation.OpBitOr: res = leftConstant | rightConstant; break; case BinaryOperation.OpBitXor: res = leftConstant ^ rightConstant; break; case BinaryOperation.OpBitLeft: res = ConstantValue.BitLeft(leftConstant, rightConstant); break; case BinaryOperation.OpBitRight: res = ConstantValue.BitRight(leftConstant, rightConstant); break; case BinaryOperation.OpLAnd: res = new ConstantValue(leftConstant.GetBoolValue() && rightConstant.GetBoolValue()); break; case BinaryOperation.OpLOr: res = new ConstantValue(leftConstant.GetBoolValue() || rightConstant.GetBoolValue()); break; default: throw new System.NotImplementedException(); } // Return the result node. return res.ToAstNode(node.GetPosition()); }