// Copyright (c) 2011, 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.

#include "vm/token.h"

#include "vm/object.h"

namespace dart {

#define TOKEN_NAME(t, s, p, a) #t,
const char* const Token::name_[] = {DART_TOKEN_LIST(TOKEN_NAME)
                                        DART_KEYWORD_LIST(TOKEN_NAME)};
#undef TOKEN_NAME

#define TOKEN_STRING(t, s, p, a) s,
const char* const Token::tok_str_[] = {DART_TOKEN_LIST(TOKEN_STRING)
                                           DART_KEYWORD_LIST(TOKEN_STRING)};
#undef TOKEN_STRING

#define TOKEN_ATTRIBUTE(t, s, p, a) a,
const Token::Attribute Token::attributes_[] = {
    DART_TOKEN_LIST(TOKEN_ATTRIBUTE) DART_KEYWORD_LIST(TOKEN_ATTRIBUTE)};
#undef TOKEN_ATTRIBUTE

bool Token::IsBinaryOperator(Token::Kind token) {
  switch (token) {
    case Token::kOR:
    case Token::kAND:
      return true;
    default:
      return IsBinaryArithmeticOperator(token);
  }
}

bool Token::IsUnaryOperator(Token::Kind token) {
  return (token == kNOT) || IsUnaryArithmeticOperator(token);
}

bool Token::IsBinaryArithmeticOperator(Token::Kind token) {
  switch (token) {
    case Token::kADD:
    case Token::kSUB:
    case Token::kMUL:
    case Token::kDIV:
    case Token::kTRUNCDIV:
    case Token::kMOD:
    case Token::kBIT_OR:
    case Token::kBIT_XOR:
    case Token::kBIT_AND:
    case Token::kSHL:
    case Token::kSHR:
    case Token::kUSHR:
    case Token::kMAX:
    case Token::kMIN:
      return true;
    default:
      return false;
  }
}

bool Token::IsUnaryArithmeticOperator(Token::Kind token) {
  switch (token) {
    case Token::kBIT_NOT:
    case Token::kNEGATE:
    case Token::kABS:
    case Token::kSQRT:
    case Token::kSQUARE:
    case Token::kRECIPROCAL:
    case Token::kRECIPROCAL_SQRT:
    case Token::kTRUNCATE:
    case Token::kFLOOR:
    case Token::kCEILING:
      return true;
    default:
      return false;
  }
}

bool Token::IsBinaryBitwiseOperator(Token::Kind token) {
  switch (token) {
    case Token::kBIT_OR:
    case Token::kBIT_XOR:
    case Token::kBIT_AND:
    case Token::kSHL:
    case Token::kSHR:
    case Token::kUSHR:
      return true;
    default:
      return false;
  }
}

}  // namespace dart
