// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library fasta.operators;

/// The user-definable operators in Dart.
///
/// The names have been chosen to represent their normal semantic meaning.
enum Operator {
  add,
  bitwiseAnd,
  bitwiseNot,
  bitwiseOr,
  bitwiseXor,
  divide,
  equals,
  greaterThan,
  greaterThanEquals,
  indexGet,
  indexSet,
  leftShift,
  lessThan,
  lessThanEquals,
  modulo,
  multiply,
  rightShift,
  tripleShift,
  subtract,
  truncatingDivide,
  unaryMinus,
}

Operator? operatorFromString(String string) {
  if (identical("+", string)) return Operator.add;
  if (identical("&", string)) return Operator.bitwiseAnd;
  if (identical("~", string)) return Operator.bitwiseNot;
  if (identical("|", string)) return Operator.bitwiseOr;
  if (identical("^", string)) return Operator.bitwiseXor;
  if (identical("/", string)) return Operator.divide;
  if (identical("==", string)) return Operator.equals;
  if (identical(">", string)) return Operator.greaterThan;
  if (identical(">=", string)) return Operator.greaterThanEquals;
  if (identical("[]", string)) return Operator.indexGet;
  if (identical("[]=", string)) return Operator.indexSet;
  if (identical("<<", string)) return Operator.leftShift;
  if (identical("<", string)) return Operator.lessThan;
  if (identical("<=", string)) return Operator.lessThanEquals;
  if (identical("%", string)) return Operator.modulo;
  if (identical("*", string)) return Operator.multiply;
  if (identical(">>", string)) return Operator.rightShift;
  if (identical(">>>", string)) return Operator.tripleShift;
  if (identical("-", string)) return Operator.subtract;
  if (identical("~/", string)) return Operator.truncatingDivide;
  if (identical("unary-", string)) return Operator.unaryMinus;
  return null;
}

String operatorToString(Operator operator) {
  switch (operator) {
    case Operator.add:
      return "+";
    case Operator.bitwiseAnd:
      return "&";
    case Operator.bitwiseNot:
      return "~";
    case Operator.bitwiseOr:
      return "|";
    case Operator.bitwiseXor:
      return "^";
    case Operator.divide:
      return "/";
    case Operator.equals:
      return "==";
    case Operator.greaterThan:
      return ">";
    case Operator.greaterThanEquals:
      return ">=";
    case Operator.indexGet:
      return "[]";
    case Operator.indexSet:
      return "[]=";
    case Operator.leftShift:
      return "<<";
    case Operator.lessThan:
      return "<";
    case Operator.lessThanEquals:
      return "<=";
    case Operator.modulo:
      return "%";
    case Operator.multiply:
      return "*";
    case Operator.rightShift:
      return ">>";
    case Operator.tripleShift:
      return ">>>";
    case Operator.subtract:
      return "-";
    case Operator.truncatingDivide:
      return "~/";
    case Operator.unaryMinus:
      return "unary-";
  }
}

int operatorRequiredArgumentCount(Operator operator) {
  switch (operator) {
    case Operator.bitwiseNot:
    case Operator.unaryMinus:
      return 0;

    case Operator.add:
    case Operator.bitwiseAnd:
    case Operator.bitwiseOr:
    case Operator.bitwiseXor:
    case Operator.divide:
    case Operator.equals:
    case Operator.greaterThan:
    case Operator.greaterThanEquals:
    case Operator.indexGet:
    case Operator.leftShift:
    case Operator.lessThan:
    case Operator.lessThanEquals:
    case Operator.modulo:
    case Operator.multiply:
    case Operator.rightShift:
    case Operator.tripleShift:
    case Operator.subtract:
    case Operator.truncatingDivide:
      return 1;

    case Operator.indexSet:
      return 2;
  }
}
