/// <summary> /// Return the provided operator as a <see cref="CodeBinaryOperatorType"/> /// </summary> /// <param name="op"></param> /// <returns></returns> /// <exception cref="ArgumentException">If there is no <see cref="CodeBinaryOperatorType"/> equivalent</exception> /// <exception cref="ArgumentOutOfRangeException"></exception> public static CodeBinaryOperatorType AsCodeBinaryOperatorType(this CodeBinaryOperatorTypeMore op) { switch (op) { case CodeBinaryOperatorTypeMore.Add: case CodeBinaryOperatorTypeMore.Subtract: case CodeBinaryOperatorTypeMore.Multiply: case CodeBinaryOperatorTypeMore.Divide: case CodeBinaryOperatorTypeMore.Modulus: case CodeBinaryOperatorTypeMore.Assign: case CodeBinaryOperatorTypeMore.IdentityInequality: case CodeBinaryOperatorTypeMore.IdentityEquality: case CodeBinaryOperatorTypeMore.ValueEquality: case CodeBinaryOperatorTypeMore.BitwiseOr: case CodeBinaryOperatorTypeMore.BitwiseAnd: case CodeBinaryOperatorTypeMore.BooleanOr: case CodeBinaryOperatorTypeMore.BooleanAnd: case CodeBinaryOperatorTypeMore.LessThan: case CodeBinaryOperatorTypeMore.LessThanOrEqual: case CodeBinaryOperatorTypeMore.GreaterThan: case CodeBinaryOperatorTypeMore.GreaterThanOrEqual: return((CodeBinaryOperatorType)op); case CodeBinaryOperatorTypeMore.LeftBitShift: case CodeBinaryOperatorTypeMore.RightBitShift: case CodeBinaryOperatorTypeMore.NullCoalescing: case CodeBinaryOperatorTypeMore.ValueInequality: case CodeBinaryOperatorTypeMore.BitwiseXOr: throw new ArgumentException(); default: throw new ArgumentOutOfRangeException(nameof(op), op, null); } }
/// <summary> /// Returns if the operator can be used as a shorthand operator /// </summary> /// <param name="op"></param> /// <returns></returns> public static bool CanBeShorthandOperator(this CodeBinaryOperatorTypeMore op) { return(op == CodeBinaryOperatorTypeMore.Add || op == CodeBinaryOperatorTypeMore.Subtract || op == CodeBinaryOperatorTypeMore.Multiply || op == CodeBinaryOperatorTypeMore.Divide || op == CodeBinaryOperatorTypeMore.Modulus || op == CodeBinaryOperatorTypeMore.BitwiseAnd || op == CodeBinaryOperatorTypeMore.BitwiseOr || op == CodeBinaryOperatorTypeMore.BitwiseXOr || op == CodeBinaryOperatorTypeMore.LeftBitShift || op == CodeBinaryOperatorTypeMore.RightBitShift); }
/// <summary> /// Constructor setting all values /// </summary> /// <param name="leftExpression"></param> /// <param name="operatorType"></param> /// <param name="rightExpression"></param> public CodeBinaryOperatorExpressionMore(CodeExpression leftExpression, CodeBinaryOperatorTypeMore operatorType, CodeExpression rightExpression) { LeftExpression = leftExpression; RightExpression = rightExpression; OperatorType = operatorType; }
/// <summary> /// Returns the string for the provided operator if it can be used as a shorthand operator or null /// </summary> /// <param name="op"></param> /// <returns></returns> protected abstract string GetShorthandOperatorSymbol(CodeBinaryOperatorTypeMore op);
/// <inheritdoc/> protected override string GetShorthandOperatorSymbol(CodeBinaryOperatorTypeMore op) { return(op.CanBeShorthandOperator() ? CSharpKeywordsUtils.OperatorSymbol(op) : null); }
/// <summary> /// Returns the symbol for the provided operator /// </summary> /// <param name="operatorType"></param> /// <returns></returns> /// <exception cref="ArgumentOutOfRangeException"></exception> public static string OperatorSymbol(CodeBinaryOperatorTypeMore operatorType) { switch (operatorType) { case CodeBinaryOperatorTypeMore.Add: return("+"); case CodeBinaryOperatorTypeMore.Subtract: return("-"); case CodeBinaryOperatorTypeMore.Multiply: return("*"); case CodeBinaryOperatorTypeMore.Divide: return("/"); case CodeBinaryOperatorTypeMore.Modulus: return("Mod"); case CodeBinaryOperatorTypeMore.Assign: return("="); case CodeBinaryOperatorTypeMore.IdentityInequality: return("IsNot"); case CodeBinaryOperatorTypeMore.IdentityEquality: return("Is"); case CodeBinaryOperatorTypeMore.ValueEquality: return("="); case CodeBinaryOperatorTypeMore.BitwiseOr: return("Or"); case CodeBinaryOperatorTypeMore.BitwiseAnd: return("And"); case CodeBinaryOperatorTypeMore.BooleanOr: return("OrElse"); case CodeBinaryOperatorTypeMore.BooleanAnd: return("AndAlso"); case CodeBinaryOperatorTypeMore.LessThan: return("<"); case CodeBinaryOperatorTypeMore.LessThanOrEqual: return("<="); case CodeBinaryOperatorTypeMore.GreaterThan: return(">"); case CodeBinaryOperatorTypeMore.GreaterThanOrEqual: return(">="); case CodeBinaryOperatorTypeMore.ValueInequality: return("<>"); case CodeBinaryOperatorTypeMore.LeftBitShift: return("<<"); case CodeBinaryOperatorTypeMore.RightBitShift: return(">>"); case CodeBinaryOperatorTypeMore.BitwiseXOr: return("Xor"); case CodeBinaryOperatorTypeMore.NullCoalescing: default: throw new ArgumentOutOfRangeException(nameof(operatorType), operatorType, null); } }