blob: 917c3855a5028592f9f3c7c25ca0774ea606bc0c [file] [log] [blame]
// 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;
}
}