Create SkSLOperators, centralize functionality

Change-Id: I3593e7ab0caac2fd572346038cbc8ff63e6fe970
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/366406
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/sksl/SkSLOperators.cpp b/src/sksl/SkSLOperators.cpp
new file mode 100644
index 0000000..e6890d2
--- /dev/null
+++ b/src/sksl/SkSLOperators.cpp
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2021 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "include/core/SkTypes.h"
+#include "src/sksl/SkSLOperators.h"
+
+namespace SkSL {
+namespace Operators {
+
+Precedence GetBinaryPrecedence(Token::Kind op) {
+    switch (op) {
+        case Token::Kind::TK_STAR:         // fall through
+        case Token::Kind::TK_SLASH:        // fall through
+        case Token::Kind::TK_PERCENT:      return Precedence::kMultiplicative;
+        case Token::Kind::TK_PLUS:         // fall through
+        case Token::Kind::TK_MINUS:        return Precedence::kAdditive;
+        case Token::Kind::TK_SHL:          // fall through
+        case Token::Kind::TK_SHR:          return Precedence::kShift;
+        case Token::Kind::TK_LT:           // fall through
+        case Token::Kind::TK_GT:           // fall through
+        case Token::Kind::TK_LTEQ:         // fall through
+        case Token::Kind::TK_GTEQ:         return Precedence::kRelational;
+        case Token::Kind::TK_EQEQ:         // fall through
+        case Token::Kind::TK_NEQ:          return Precedence::kEquality;
+        case Token::Kind::TK_BITWISEAND:   return Precedence::kBitwiseAnd;
+        case Token::Kind::TK_BITWISEXOR:   return Precedence::kBitwiseXor;
+        case Token::Kind::TK_BITWISEOR:    return Precedence::kBitwiseOr;
+        case Token::Kind::TK_LOGICALAND:   return Precedence::kLogicalAnd;
+        case Token::Kind::TK_LOGICALXOR:   return Precedence::kLogicalXor;
+        case Token::Kind::TK_LOGICALOR:    return Precedence::kLogicalOr;
+        case Token::Kind::TK_EQ:           // fall through
+        case Token::Kind::TK_PLUSEQ:       // fall through
+        case Token::Kind::TK_MINUSEQ:      // fall through
+        case Token::Kind::TK_STAREQ:       // fall through
+        case Token::Kind::TK_SLASHEQ:      // fall through
+        case Token::Kind::TK_PERCENTEQ:    // fall through
+        case Token::Kind::TK_SHLEQ:        // fall through
+        case Token::Kind::TK_SHREQ:        // fall through
+        case Token::Kind::TK_BITWISEANDEQ: // fall through
+        case Token::Kind::TK_BITWISEXOREQ: // fall through
+        case Token::Kind::TK_BITWISEOREQ:  return Precedence::kAssignment;
+        case Token::Kind::TK_COMMA:        return Precedence::kSequence;
+        default: SK_ABORT("unsupported binary operator");
+    }
+}
+
+
+const char* OperatorName(Token::Kind op) {
+    switch (op) {
+        case Token::Kind::TK_PLUS:         return "+";
+        case Token::Kind::TK_MINUS:        return "-";
+        case Token::Kind::TK_STAR:         return "*";
+        case Token::Kind::TK_SLASH:        return "/";
+        case Token::Kind::TK_PERCENT:      return "%";
+        case Token::Kind::TK_SHL:          return "<<";
+        case Token::Kind::TK_SHR:          return ">>";
+        case Token::Kind::TK_LOGICALNOT:   return "!";
+        case Token::Kind::TK_LOGICALAND:   return "&&";
+        case Token::Kind::TK_LOGICALOR:    return "||";
+        case Token::Kind::TK_LOGICALXOR:   return "^^";
+        case Token::Kind::TK_BITWISENOT:   return "~";
+        case Token::Kind::TK_BITWISEAND:   return "&";
+        case Token::Kind::TK_BITWISEOR:    return "|";
+        case Token::Kind::TK_BITWISEXOR:   return "^";
+        case Token::Kind::TK_EQ:           return "=";
+        case Token::Kind::TK_EQEQ:         return "==";
+        case Token::Kind::TK_NEQ:          return "!=";
+        case Token::Kind::TK_LT:           return "<";
+        case Token::Kind::TK_GT:           return ">";
+        case Token::Kind::TK_LTEQ:         return "<=";
+        case Token::Kind::TK_GTEQ:         return ">=";
+        case Token::Kind::TK_PLUSEQ:       return "+=";
+        case Token::Kind::TK_MINUSEQ:      return "-=";
+        case Token::Kind::TK_STAREQ:       return "*=";
+        case Token::Kind::TK_SLASHEQ:      return "/=";
+        case Token::Kind::TK_PERCENTEQ:    return "%=";
+        case Token::Kind::TK_SHLEQ:        return "<<=";
+        case Token::Kind::TK_SHREQ:        return ">>=";
+        case Token::Kind::TK_BITWISEANDEQ: return "&=";
+        case Token::Kind::TK_BITWISEOREQ:  return "|=";
+        case Token::Kind::TK_BITWISEXOREQ: return "^=";
+        case Token::Kind::TK_PLUSPLUS:     return "++";
+        case Token::Kind::TK_MINUSMINUS:   return "--";
+        case Token::Kind::TK_COMMA:        return ",";
+        default:
+            SK_ABORT("unsupported operator: %d\n", (int) op);
+    }
+}
+
+
+bool IsAssignment(Token::Kind op) {
+    switch (op) {
+        case Token::Kind::TK_EQ:           // fall through
+        case Token::Kind::TK_PLUSEQ:       // fall through
+        case Token::Kind::TK_MINUSEQ:      // fall through
+        case Token::Kind::TK_STAREQ:       // fall through
+        case Token::Kind::TK_SLASHEQ:      // fall through
+        case Token::Kind::TK_PERCENTEQ:    // fall through
+        case Token::Kind::TK_SHLEQ:        // fall through
+        case Token::Kind::TK_SHREQ:        // fall through
+        case Token::Kind::TK_BITWISEOREQ:  // fall through
+        case Token::Kind::TK_BITWISEXOREQ: // fall through
+        case Token::Kind::TK_BITWISEANDEQ:
+            return true;
+        default:
+            return false;
+    }
+}
+
+Token::Kind RemoveAssignment(Token::Kind op) {
+    switch (op) {
+        case Token::Kind::TK_PLUSEQ:       return Token::Kind::TK_PLUS;
+        case Token::Kind::TK_MINUSEQ:      return Token::Kind::TK_MINUS;
+        case Token::Kind::TK_STAREQ:       return Token::Kind::TK_STAR;
+        case Token::Kind::TK_SLASHEQ:      return Token::Kind::TK_SLASH;
+        case Token::Kind::TK_PERCENTEQ:    return Token::Kind::TK_PERCENT;
+        case Token::Kind::TK_SHLEQ:        return Token::Kind::TK_SHL;
+        case Token::Kind::TK_SHREQ:        return Token::Kind::TK_SHR;
+        case Token::Kind::TK_BITWISEOREQ:  return Token::Kind::TK_BITWISEOR;
+        case Token::Kind::TK_BITWISEXOREQ: return Token::Kind::TK_BITWISEXOR;
+        case Token::Kind::TK_BITWISEANDEQ: return Token::Kind::TK_BITWISEAND;
+        default: return op;
+    }
+}
+
+}  // namespace Operators
+}  // namespace SkSL