blob: cddd9174acaea15d41f9ae4b3ccb9f51e6f51f32 [file] [log] [blame]
/*
* 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 {
Operator::Precedence Operator::getBinaryPrecedence() const {
switch (fKind) {
case Kind::TK_STAR: // fall through
case Kind::TK_SLASH: // fall through
case Kind::TK_PERCENT: return Precedence::kMultiplicative;
case Kind::TK_PLUS: // fall through
case Kind::TK_MINUS: return Precedence::kAdditive;
case Kind::TK_SHL: // fall through
case Kind::TK_SHR: return Precedence::kShift;
case Kind::TK_LT: // fall through
case Kind::TK_GT: // fall through
case Kind::TK_LTEQ: // fall through
case Kind::TK_GTEQ: return Precedence::kRelational;
case Kind::TK_EQEQ: // fall through
case Kind::TK_NEQ: return Precedence::kEquality;
case Kind::TK_BITWISEAND: return Precedence::kBitwiseAnd;
case Kind::TK_BITWISEXOR: return Precedence::kBitwiseXor;
case Kind::TK_BITWISEOR: return Precedence::kBitwiseOr;
case Kind::TK_LOGICALAND: return Precedence::kLogicalAnd;
case Kind::TK_LOGICALXOR: return Precedence::kLogicalXor;
case Kind::TK_LOGICALOR: return Precedence::kLogicalOr;
case Kind::TK_EQ: // fall through
case Kind::TK_PLUSEQ: // fall through
case Kind::TK_MINUSEQ: // fall through
case Kind::TK_STAREQ: // fall through
case Kind::TK_SLASHEQ: // fall through
case Kind::TK_PERCENTEQ: // fall through
case Kind::TK_SHLEQ: // fall through
case Kind::TK_SHREQ: // fall through
case Kind::TK_BITWISEANDEQ: // fall through
case Kind::TK_BITWISEXOREQ: // fall through
case Kind::TK_BITWISEOREQ: return Precedence::kAssignment;
case Kind::TK_COMMA: return Precedence::kSequence;
default: SK_ABORT("unsupported binary operator");
}
}
bool Operator::isOperator() const {
switch (this->kind()) {
case Kind::TK_PLUS:
case Kind::TK_MINUS:
case Kind::TK_STAR:
case Kind::TK_SLASH:
case Kind::TK_PERCENT:
case Kind::TK_SHL:
case Kind::TK_SHR:
case Kind::TK_LOGICALNOT:
case Kind::TK_LOGICALAND:
case Kind::TK_LOGICALOR:
case Kind::TK_LOGICALXOR:
case Kind::TK_BITWISENOT:
case Kind::TK_BITWISEAND:
case Kind::TK_BITWISEOR:
case Kind::TK_BITWISEXOR:
case Kind::TK_EQ:
case Kind::TK_EQEQ:
case Kind::TK_NEQ:
case Kind::TK_LT:
case Kind::TK_GT:
case Kind::TK_LTEQ:
case Kind::TK_GTEQ:
case Kind::TK_PLUSEQ:
case Kind::TK_MINUSEQ:
case Kind::TK_STAREQ:
case Kind::TK_SLASHEQ:
case Kind::TK_PERCENTEQ:
case Kind::TK_SHLEQ:
case Kind::TK_SHREQ:
case Kind::TK_BITWISEANDEQ:
case Kind::TK_BITWISEOREQ:
case Kind::TK_BITWISEXOREQ:
case Kind::TK_PLUSPLUS:
case Kind::TK_MINUSMINUS:
case Kind::TK_COMMA:
return true;
default:
return false;
}
}
const char* Operator::operatorName() const {
switch (fKind) {
case Kind::TK_PLUS: return "+";
case Kind::TK_MINUS: return "-";
case Kind::TK_STAR: return "*";
case Kind::TK_SLASH: return "/";
case Kind::TK_PERCENT: return "%";
case Kind::TK_SHL: return "<<";
case Kind::TK_SHR: return ">>";
case Kind::TK_LOGICALNOT: return "!";
case Kind::TK_LOGICALAND: return "&&";
case Kind::TK_LOGICALOR: return "||";
case Kind::TK_LOGICALXOR: return "^^";
case Kind::TK_BITWISENOT: return "~";
case Kind::TK_BITWISEAND: return "&";
case Kind::TK_BITWISEOR: return "|";
case Kind::TK_BITWISEXOR: return "^";
case Kind::TK_EQ: return "=";
case Kind::TK_EQEQ: return "==";
case Kind::TK_NEQ: return "!=";
case Kind::TK_LT: return "<";
case Kind::TK_GT: return ">";
case Kind::TK_LTEQ: return "<=";
case Kind::TK_GTEQ: return ">=";
case Kind::TK_PLUSEQ: return "+=";
case Kind::TK_MINUSEQ: return "-=";
case Kind::TK_STAREQ: return "*=";
case Kind::TK_SLASHEQ: return "/=";
case Kind::TK_PERCENTEQ: return "%=";
case Kind::TK_SHLEQ: return "<<=";
case Kind::TK_SHREQ: return ">>=";
case Kind::TK_BITWISEANDEQ: return "&=";
case Kind::TK_BITWISEOREQ: return "|=";
case Kind::TK_BITWISEXOREQ: return "^=";
case Kind::TK_PLUSPLUS: return "++";
case Kind::TK_MINUSMINUS: return "--";
case Kind::TK_COMMA: return ",";
default:
SK_ABORT("unsupported operator: %d\n", (int) fKind);
}
}
bool Operator::isAssignment() const {
switch (fKind) {
case Kind::TK_EQ: // fall through
case Kind::TK_PLUSEQ: // fall through
case Kind::TK_MINUSEQ: // fall through
case Kind::TK_STAREQ: // fall through
case Kind::TK_SLASHEQ: // fall through
case Kind::TK_PERCENTEQ: // fall through
case Kind::TK_SHLEQ: // fall through
case Kind::TK_SHREQ: // fall through
case Kind::TK_BITWISEOREQ: // fall through
case Kind::TK_BITWISEXOREQ: // fall through
case Kind::TK_BITWISEANDEQ:
return true;
default:
return false;
}
}
Operator Operator::removeAssignment() const {
switch (fKind) {
case Kind::TK_PLUSEQ: return Operator{Kind::TK_PLUS};
case Kind::TK_MINUSEQ: return Operator{Kind::TK_MINUS};
case Kind::TK_STAREQ: return Operator{Kind::TK_STAR};
case Kind::TK_SLASHEQ: return Operator{Kind::TK_SLASH};
case Kind::TK_PERCENTEQ: return Operator{Kind::TK_PERCENT};
case Kind::TK_SHLEQ: return Operator{Kind::TK_SHL};
case Kind::TK_SHREQ: return Operator{Kind::TK_SHR};
case Kind::TK_BITWISEOREQ: return Operator{Kind::TK_BITWISEOR};
case Kind::TK_BITWISEXOREQ: return Operator{Kind::TK_BITWISEXOR};
case Kind::TK_BITWISEANDEQ: return Operator{Kind::TK_BITWISEAND};
default: return *this;
}
}
bool Operator::isLogical() const {
switch (kind()) {
case Token::Kind::TK_LT:
case Token::Kind::TK_GT:
case Token::Kind::TK_LTEQ:
case Token::Kind::TK_GTEQ:
return true;
default:
return false;
}
}
bool Operator::isOnlyValidForIntegralTypes() const {
switch (kind()) {
case Token::Kind::TK_SHL:
case Token::Kind::TK_SHR:
case Token::Kind::TK_BITWISEAND:
case Token::Kind::TK_BITWISEOR:
case Token::Kind::TK_BITWISEXOR:
case Token::Kind::TK_PERCENT:
case Token::Kind::TK_SHLEQ:
case Token::Kind::TK_SHREQ:
case Token::Kind::TK_BITWISEANDEQ:
case Token::Kind::TK_BITWISEOREQ:
case Token::Kind::TK_BITWISEXOREQ:
case Token::Kind::TK_PERCENTEQ:
return true;
default:
return false;
}
}
bool Operator::isValidForMatrixOrVector() const {
switch (kind()) {
case Token::Kind::TK_PLUS:
case Token::Kind::TK_MINUS:
case Token::Kind::TK_STAR:
case Token::Kind::TK_SLASH:
case Token::Kind::TK_PERCENT:
case Token::Kind::TK_SHL:
case Token::Kind::TK_SHR:
case Token::Kind::TK_BITWISEAND:
case Token::Kind::TK_BITWISEOR:
case Token::Kind::TK_BITWISEXOR:
case Token::Kind::TK_PLUSEQ:
case Token::Kind::TK_MINUSEQ:
case Token::Kind::TK_STAREQ:
case Token::Kind::TK_SLASHEQ:
case Token::Kind::TK_PERCENTEQ:
case Token::Kind::TK_SHLEQ:
case Token::Kind::TK_SHREQ:
case Token::Kind::TK_BITWISEANDEQ:
case Token::Kind::TK_BITWISEOREQ:
case Token::Kind::TK_BITWISEXOREQ:
return true;
default:
return false;
}
}
} // namespace SkSL