// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/reader/wgsl/token.h"

namespace tint {
namespace reader {
namespace wgsl {

// static
std::string Token::TypeToName(Type type) {
  switch (type) {
    case Token::Type::kError:
      return "kError";
    case Token::Type::kReservedKeyword:
      return "kReservedKeyword";
    case Token::Type::kEOF:
      return "kEOF";
    case Token::Type::kIdentifier:
      return "kIdentifier";
    case Token::Type::kStringLiteral:
      return "kStringLiteral";
    case Token::Type::kFloatLiteral:
      return "kFloatLiteral";
    case Token::Type::kIntLiteral:
      return "kIntLiteral";
    case Token::Type::kUintLiteral:
      return "kUintLiteral";
    case Token::Type::kUninitialized:
      return "kUninitialized";

    case Token::Type::kAnd:
      return "&";
    case Token::Type::kAndAnd:
      return "&&";
    case Token::Type::kArrow:
      return "->";
    case Token::Type::kAttrLeft:
      return "[[";
    case Token::Type::kAttrRight:
      return "]]";
    case Token::Type::kForwardSlash:
      return "/";
    case Token::Type::kBang:
      return "!";
    case Token::Type::kBraceLeft:
      return "[";
    case Token::Type::kBraceRight:
      return "]";
    case Token::Type::kBracketLeft:
      return "{";
    case Token::Type::kBracketRight:
      return "}";
    case Token::Type::kColon:
      return ":";
    case Token::Type::kComma:
      return ",";
    case Token::Type::kEqual:
      return "=";
    case Token::Type::kEqualEqual:
      return "==";
    case Token::Type::kGreaterThan:
      return ">";
    case Token::Type::kGreaterThanEqual:
      return ">=";
    case Token::Type::kLessThan:
      return "<";
    case Token::Type::kLessThanEqual:
      return "<=";
    case Token::Type::kMod:
      return "%";
    case Token::Type::kNotEqual:
      return "!=";
    case Token::Type::kMinus:
      return "-";
    case Token::Type::kNamespace:
      return "::";
    case Token::Type::kPeriod:
      return ".";
    case Token::Type::kPlus:
      return "+";
    case Token::Type::kOr:
      return "|";
    case Token::Type::kOrOr:
      return "||";
    case Token::Type::kParenLeft:
      return "(";
    case Token::Type::kParenRight:
      return ")";
    case Token::Type::kSemicolon:
      return ";";
    case Token::Type::kStar:
      return "*";
    case Token::Type::kXor:
      return "^";

    case Token::Type::kAll:
      return "all";
    case Token::Type::kAny:
      return "any";
    case Token::Type::kArray:
      return "array";
    case Token::Type::kAs:
      return "as";
    case Token::Type::kBinding:
      return "binding";
    case Token::Type::kBlock:
      return "block";
    case Token::Type::kBool:
      return "bool";
    case Token::Type::kBreak:
      return "break";
    case Token::Type::kBuiltin:
      return "builtin";
    case Token::Type::kCase:
      return "case";
    case Token::Type::kCast:
      return "cast";
    case Token::Type::kCompute:
      return "compute";
    case Token::Type::kConst:
      return "const";
    case Token::Type::kContinue:
      return "continue";
    case Token::Type::kContinuing:
      return "continuing";
    case Token::Type::kCoarse:
      return "coarse";
    case Token::Type::kDefault:
      return "default";
    case Token::Type::kDot:
      return "dot";
    case Token::Type::kDpdx:
      return "dpdx";
    case Token::Type::kDpdy:
      return "dpdy";
    case Token::Type::kElse:
      return "else";
    case Token::Type::kElseIf:
      return "elseif";
    case Token::Type::kEntryPoint:
      return "entry_point";
    case Token::Type::kF32:
      return "f32";
    case Token::Type::kFallthrough:
      return "fallthrough";
    case Token::Type::kFalse:
      return "false";
    case Token::Type::kFine:
      return "fine";
    case Token::Type::kFn:
      return "fn";
    case Token::Type::kFragCoord:
      return "frag_coord";
    case Token::Type::kFragDepth:
      return "frag_depth";
    case Token::Type::kFragment:
      return "fragment";
    case Token::Type::kFrontFacing:
      return "front_facing";
    case Token::Type::kFunction:
      return "function";
    case Token::Type::kFwidth:
      return "fwidth";
    case Token::Type::kGlobalInvocationId:
      return "global_invocation_id";
    case Token::Type::kI32:
      return "i32";
    case Token::Type::kIf:
      return "if";
    case Token::Type::kImage:
      return "image";
    case Token::Type::kImport:
      return "import";
    case Token::Type::kIn:
      return "in";
    case Token::Type::kInstanceIdx:
      return "instance_idx";
    case Token::Type::kIsNan:
      return "is_nan";
    case Token::Type::kIsInf:
      return "is_inf";
    case Token::Type::kIsFinite:
      return "is_finite";
    case Token::Type::kIsNormal:
      return "is_normal";
    case Token::Type::kKill:
      return "kill";
    case Token::Type::kLocalInvocationId:
      return "local_invocation_id";
    case Token::Type::kLocalInvocationIdx:
      return "local_invocation_idx";
    case Token::Type::kLocation:
      return "location";
    case Token::Type::kLoop:
      return "loop";
    case Token::Type::kMat2x2:
      return "mat2x2";
    case Token::Type::kMat2x3:
      return "mat2x3";
    case Token::Type::kMat2x4:
      return "mat2x4";
    case Token::Type::kMat3x2:
      return "mat3x2";
    case Token::Type::kMat3x3:
      return "mat3x3";
    case Token::Type::kMat3x4:
      return "mat3x4";
    case Token::Type::kMat4x2:
      return "mat4x2";
    case Token::Type::kMat4x3:
      return "mat4x3";
    case Token::Type::kMat4x4:
      return "mat4x4";
    case Token::Type::kNop:
      return "nop";
    case Token::Type::kNumWorkgroups:
      return "num_workgroups";
    case Token::Type::kOffset:
      return "offset";
    case Token::Type::kOut:
      return "out";
    case Token::Type::kOuterProduct:
      return "outer_product";
    case Token::Type::kPosition:
      return "position";
    case Token::Type::kPremerge:
      return "premerge";
    case Token::Type::kPrivate:
      return "private";
    case Token::Type::kPtr:
      return "ptr";
    case Token::Type::kPushConstant:
      return "push_constant";
    case Token::Type::kRegardless:
      return "regardless";
    case Token::Type::kReturn:
      return "return";
    case Token::Type::kSet:
      return "set";
    case Token::Type::kStorageBuffer:
      return "storage_buffer";
    case Token::Type::kStruct:
      return "struct";
    case Token::Type::kSwitch:
      return "switch";
    case Token::Type::kTrue:
      return "true";
    case Token::Type::kType:
      return "type";
    case Token::Type::kU32:
      return "u32";
    case Token::Type::kUniform:
      return "uniform";
    case Token::Type::kUniformConstant:
      return "uniform_constant";
    case Token::Type::kUnless:
      return "unless";
    case Token::Type::kVar:
      return "var";
    case Token::Type::kVec2:
      return "vec2";
    case Token::Type::kVec3:
      return "vec3";
    case Token::Type::kVec4:
      return "vec4";
    case Token::Type::kVertex:
      return "vertex";
    case Token::Type::kVertexIdx:
      return "vertex_idx";
    case Token::Type::kVoid:
      return "void";
    case Token::Type::kWorkgroup:
      return "workgroup";
    case Token::Type::kWorkgroupSize:
      return "workgroup_size";
  }

  return "<unknown>";
}

Token::Token() : type_(Type::kUninitialized) {}

Token::Token(Type type, const Source& source, const std::string& val)
    : type_(type), source_(source), val_str_(val) {}

Token::Token(const Source& source, uint32_t val)
    : type_(Type::kUintLiteral), source_(source), val_uint_(val) {}

Token::Token(const Source& source, int32_t val)
    : type_(Type::kIntLiteral), source_(source), val_int_(val) {}

Token::Token(const Source& source, float val)
    : type_(Type::kFloatLiteral), source_(source), val_float_(val) {}

Token::Token(Type type, const Source& source) : Token(type, source, "") {}

Token::Token(Token&&) = default;

Token::Token(const Token&) = default;

Token::~Token() = default;

Token& Token::operator=(const Token&) = default;

std::string Token::to_str() const {
  if (type_ == Type::kFloatLiteral) {
    return std::to_string(val_float_);
  }
  if (type_ == Type::kIntLiteral) {
    return std::to_string(val_int_);
  }
  if (type_ == Type::kUintLiteral) {
    return std::to_string(val_uint_);
  }
  return val_str_;
}

float Token::to_f32() const {
  return val_float_;
}

uint32_t Token::to_u32() const {
  return val_uint_;
}

int32_t Token::to_i32() const {
  return val_int_;
}

}  // namespace wgsl
}  // namespace reader
}  // namespace tint
