// // BinaryOperatorExpression.cs // // Author: // Mike Krüger // // Copyright (c) 2009 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace ICSharpCode.NRefactory.CSharp { /// /// Left Operator Right /// public class BinaryOperatorExpression : Expression { public readonly static Role LeftRole = new Role("Left", Expression.Null); public readonly static Role OperatorRole = new Role("Operator", CSharpTokenNode.Null); public readonly static Role RightRole = new Role("Right", Expression.Null); public BinaryOperatorExpression() { } public BinaryOperatorExpression(Expression left, BinaryOperatorType op, Expression right) { this.Left = left; this.Operator = op; this.Right = right; } public BinaryOperatorType Operator { get; set; } public Expression Left { get { return GetChildByRole (LeftRole); } set { SetChildByRole(LeftRole, value); } } public CSharpTokenNode OperatorToken { get { return GetChildByRole (OperatorRole); } } public Expression Right { get { return GetChildByRole (RightRole); } set { SetChildByRole(RightRole, value); } } public override S AcceptVisitor (IAstVisitor visitor, T data) { return visitor.VisitBinaryOperatorExpression (this, data); } protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) { BinaryOperatorExpression o = other as BinaryOperatorExpression; return o != null && (this.Operator == BinaryOperatorType.Any || this.Operator == o.Operator) && this.Left.DoMatch(o.Left, match) && this.Right.DoMatch(o.Right, match); } public static string GetOperatorSymbol(BinaryOperatorType op) { switch (op) { case BinaryOperatorType.BitwiseAnd: return "&"; case BinaryOperatorType.BitwiseOr: return "|"; case BinaryOperatorType.ConditionalAnd: return "&&"; case BinaryOperatorType.ConditionalOr: return "||"; case BinaryOperatorType.ExclusiveOr: return "^"; case BinaryOperatorType.GreaterThan: return ">"; case BinaryOperatorType.GreaterThanOrEqual: return ">="; case BinaryOperatorType.Equality: return "=="; case BinaryOperatorType.InEquality: return "!="; case BinaryOperatorType.LessThan: return "<"; case BinaryOperatorType.LessThanOrEqual: return "<="; case BinaryOperatorType.Add: return "+"; case BinaryOperatorType.Subtract: return "-"; case BinaryOperatorType.Multiply: return "*"; case BinaryOperatorType.Divide: return "/"; case BinaryOperatorType.Modulus: return "%"; case BinaryOperatorType.ShiftLeft: return "<<"; case BinaryOperatorType.ShiftRight: return ">>"; case BinaryOperatorType.NullCoalescing: return "??"; default: throw new NotSupportedException("Invalid value for BinaryOperatorType"); } } } public enum BinaryOperatorType { // We avoid 'logical or' on purpose, because it's not clear if that refers to the bitwise // or to the short-circuiting (conditional) operator: // MCS and old NRefactory used bitwise='|', logical='||' // but the C# spec uses logical='|', conditional='||' /// left & right BitwiseAnd, /// left | right BitwiseOr, /// left && right ConditionalAnd, /// left || right ConditionalOr, /// left ^ right ExclusiveOr, /// left > right GreaterThan, /// left >= right GreaterThanOrEqual, /// left == right Equality, /// left != right InEquality, /// left < right LessThan, /// left <= right LessThanOrEqual, /// left + right Add, /// left - right Subtract, /// left * right Multiply, /// left / right Divide, /// left % right Modulus, /// left << right ShiftLeft, /// left >> right ShiftRight, /// left ?? right NullCoalescing, /// /// Any binary operator (used in pattern matching) /// Any } }