// 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_view Token::TypeToName(Type type) {
  switch (type) {
    case Token::Type::kError:
      return "kError";
    case Token::Type::kEOF:
      return "kEOF";
    case Token::Type::kIdentifier:
      return "kIdentifier";
    case Token::Type::kFloatLiteral:
      return "kFloatLiteral";
    case Token::Type::kSintLiteral:
      return "kSintLiteral";
    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::kAttr:
      return "@";
    case Token::Type::kAttrLeft:
      return "[[";
    case Token::Type::kAttrRight:
      return "]]";
    case Token::Type::kForwardSlash:
      return "/";
    case Token::Type::kBang:
      return "!";
    case Token::Type::kBracketLeft:
      return "[";
    case Token::Type::kBracketRight:
      return "]";
    case Token::Type::kBraceLeft:
      return "{";
    case Token::Type::kBraceRight:
      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::kShiftRight:
      return ">>";
    case Token::Type::kLessThan:
      return "<";
    case Token::Type::kLessThanEqual:
      return "<=";
    case Token::Type::kShiftLeft:
      return "<<";
    case Token::Type::kMod:
      return "%";
    case Token::Type::kNotEqual:
      return "!=";
    case Token::Type::kMinus:
      return "-";
    case Token::Type::kMinusMinus:
      return "--";
    case Token::Type::kPeriod:
      return ".";
    case Token::Type::kPlus:
      return "+";
    case Token::Type::kPlusPlus:
      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::kTilde:
      return "~";
    case Token::Type::kUnderscore:
      return "_";
    case Token::Type::kXor:
      return "^";

    case Token::Type::kArray:
      return "array";
    case Token::Type::kAtomic:
      return "atomic";
    case Token::Type::kBitcast:
      return "bitcast";
    case Token::Type::kBool:
      return "bool";
    case Token::Type::kBreak:
      return "break";
    case Token::Type::kCase:
      return "case";
    case Token::Type::kContinue:
      return "continue";
    case Token::Type::kContinuing:
      return "continuing";
    case Token::Type::kDiscard:
      return "discard";
    case Token::Type::kDefault:
      return "default";
    case Token::Type::kElse:
      return "else";
    case Token::Type::kElseIf:
      return "elseif";
    case Token::Type::kF32:
      return "f32";
    case Token::Type::kFallthrough:
      return "fallthrough";
    case Token::Type::kFalse:
      return "false";
    case Token::Type::kFn:
      return "fn";
    case Token::Type::kFor:
      return "for";
    case Token::Type::kFunction:
      return "function";
    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::kLet:
      return "let";
    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::kPrivate:
      return "private";
    case Token::Type::kPtr:
      return "ptr";
    case Token::Type::kReturn:
      return "return";
    case Token::Type::kSampler:
      return "sampler";
    case Token::Type::kComparisonSampler:
      return "sampler_comparison";
    case Token::Type::kStorage:
      return "storage";
    case Token::Type::kStruct:
      return "struct";
    case Token::Type::kSwitch:
      return "switch";
    case Token::Type::kTextureDepth2d:
      return "texture_depth_2d";
    case Token::Type::kTextureDepth2dArray:
      return "texture_depth_2d_array";
    case Token::Type::kTextureDepthCube:
      return "texture_depth_cube";
    case Token::Type::kTextureDepthCubeArray:
      return "texture_depth_cube_array";
    case Token::Type::kTextureDepthMultisampled2d:
      return "texture_depth_multisampled_2d";
    case Token::Type::kTextureExternal:
      return "texture_external";
    case Token::Type::kTextureMultisampled2d:
      return "texture_multisampled_2d";
    case Token::Type::kTextureSampled1d:
      return "texture_1d";
    case Token::Type::kTextureSampled2d:
      return "texture_2d";
    case Token::Type::kTextureSampled2dArray:
      return "texture_2d_array";
    case Token::Type::kTextureSampled3d:
      return "texture_3d";
    case Token::Type::kTextureSampledCube:
      return "texture_cube";
    case Token::Type::kTextureSampledCubeArray:
      return "texture_cube_array";
    case Token::Type::kTextureStorage1d:
      return "texture_storage_1d";
    case Token::Type::kTextureStorage2d:
      return "texture_storage_2d";
    case Token::Type::kTextureStorage2dArray:
      return "texture_storage_2d_array";
    case Token::Type::kTextureStorage3d:
      return "texture_storage_3d";
    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::kVar:
      return "var";
    case Token::Type::kVec2:
      return "vec2";
    case Token::Type::kVec3:
      return "vec3";
    case Token::Type::kVec4:
      return "vec4";
    case Token::Type::kWorkgroup:
      return "workgroup";
  }

  return "<unknown>";
}

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

Token::Token(Type type, const Source& source, const std::string_view& view)
    : type_(type), source_(source), value_(view) {}

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

Token::Token(Type type, const Source& source, const char* str)
    : type_(type), source_(source), value_(std::string_view(str)) {}

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

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

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

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

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

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

Token::~Token() = default;

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

bool Token::operator==(std::string_view ident) {
  if (type_ != Type::kIdentifier) {
    return false;
  }
  if (auto* view = std::get_if<std::string_view>(&value_)) {
    return *view == ident;
  }
  return std::get<std::string>(value_) == ident;
}

std::string Token::to_str() const {
  switch (type_) {
    case Type::kFloatLiteral:
      return std::to_string(std::get<float>(value_));
    case Type::kSintLiteral:
      return std::to_string(std::get<int32_t>(value_));
    case Type::kUintLiteral:
      return std::to_string(std::get<uint32_t>(value_));
    case Type::kIdentifier:
    case Type::kError:
      if (auto* view = std::get_if<std::string_view>(&value_)) {
        return std::string(*view);
      }
      return std::get<std::string>(value_);
    default:
      return "";
  }
}

float Token::to_f32() const {
  return std::get<float>(value_);
}

uint32_t Token::to_u32() const {
  return std::get<uint32_t>(value_);
}

int32_t Token::to_i32() const {
  return std::get<int32_t>(value_);
}

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