diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs index fd5d205124..ff2e68fde7 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs @@ -199,29 +199,73 @@ namespace Grunwald.BooBinding.Designer _class.Members.Add(method); } + static CodeBinaryOperatorType GetOperatorType(BinaryOperatorType op) + { + switch (op) { + case BinaryOperatorType.Addition: + return CodeBinaryOperatorType.Add; + case BinaryOperatorType.And: + return CodeBinaryOperatorType.BooleanAnd; + case BinaryOperatorType.BitwiseAnd: + return CodeBinaryOperatorType.BitwiseAnd; + case BinaryOperatorType.BitwiseOr: + return CodeBinaryOperatorType.BitwiseOr; + case BinaryOperatorType.Division: + return CodeBinaryOperatorType.Divide; + case BinaryOperatorType.Equality: + return CodeBinaryOperatorType.ValueEquality; + case BinaryOperatorType.GreaterThan: + return CodeBinaryOperatorType.GreaterThan; + case BinaryOperatorType.GreaterThanOrEqual: + return CodeBinaryOperatorType.GreaterThanOrEqual; + case BinaryOperatorType.LessThan: + return CodeBinaryOperatorType.LessThan; + case BinaryOperatorType.LessThanOrEqual: + return CodeBinaryOperatorType.LessThanOrEqual; + case BinaryOperatorType.Modulus: + return CodeBinaryOperatorType.Modulus; + case BinaryOperatorType.Multiply: + return CodeBinaryOperatorType.Multiply; + case BinaryOperatorType.Or: + return CodeBinaryOperatorType.BooleanOr; + case BinaryOperatorType.Subtraction: + return CodeBinaryOperatorType.Subtract; + default: + return CodeBinaryOperatorType.Assign; + } + } + public override void OnBinaryExpression(BinaryExpression node) { - BinaryOperatorType op = node.Operator; - if (op == BinaryOperatorType.Assign) { - _expression = null; + _expression = null; + CodeBinaryOperatorType op = GetOperatorType(node.Operator); + if (op == CodeBinaryOperatorType.Assign) { + // non-standard op + if (node.Operator == BinaryOperatorType.Assign) { + node.Left.Accept(this); + CodeExpression left = _expression; + _expression = null; + node.Right.Accept(this); + if (left != null && _expression != null) + _statements.Add(new CodeAssignStatement(left, _expression)); + _expression = null; + } else if (node.Operator == BinaryOperatorType.InPlaceAddition) { + node.Left.Accept(this); + CodeEventReferenceExpression left = _expression as CodeEventReferenceExpression; + _expression = null; + node.Right.Accept(this); + if (left != null && _expression != null) + _statements.Add(new CodeAttachEventStatement(left, _expression)); + _expression = null; + } else { + LoggingService.Warn("CodeDomVisitor: ignoring unknown Binary Operator" + node.Operator); + } + } else { node.Left.Accept(this); CodeExpression left = _expression; _expression = null; node.Right.Accept(this); - if (left != null && _expression != null) - _statements.Add(new CodeAssignStatement(left, _expression)); - _expression = null; - } else if (op == BinaryOperatorType.InPlaceAddition) { - _expression = null; - node.Left.Accept(this); - CodeEventReferenceExpression left = _expression as CodeEventReferenceExpression; - _expression = null; - node.Right.Accept(this); - if (left != null && _expression != null) - _statements.Add(new CodeAttachEventStatement(left, _expression)); - _expression = null; - } else { - LoggingService.Warn("CodeDomVisitor: ignoring unknown Binary Operator" + op); + _expression = new CodeBinaryOperatorExpression(left, op, _expression); } }