// 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.

#ifndef SRC_READER_WGSL_TOKEN_H_
#define SRC_READER_WGSL_TOKEN_H_

#include <stddef.h>

#include <ostream>
#include <string>

#include "src/source.h"

namespace tint {
namespace reader {
namespace wgsl {

/// Stores tokens generated by the Lexer
class Token {
 public:
  /// The type of the parsed token
  enum class Type {
    /// Error result
    kError = -2,
    /// Reserved keyword
    kReservedKeyword = -1,
    /// Uninitialized token
    kUninitialized = 0,
    /// End of input string reached
    kEOF,

    /// An identifier
    kIdentifier,
    /// A string value
    kStringLiteral,
    /// A float value
    kFloatLiteral,
    /// An int value
    kIntLiteral,
    /// A uint value
    kUintLiteral,

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

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

  /// Converts a token type to a name
  /// @param type the type to convert
  /// @returns the token type as as string
  static std::string TypeToName(Type type);

  /// Creates an uninitialized token
  Token();
  /// Create a Token
  /// @param type the Token::Type of the token
  /// @param source the source of the token
  Token(Type type, const Source& source);

  /// Create a string Token
  /// @param type the Token::Type of the token
  /// @param source the source of the token
  /// @param val the source string for the token
  Token(Type type, const Source& source, const std::string& val);
  /// Create a unsigned integer Token
  /// @param source the source of the token
  /// @param val the source unsigned for the token
  Token(const Source& source, uint32_t val);
  /// Create a signed integer Token
  /// @param source the source of the token
  /// @param val the source integer for the token
  Token(const Source& source, int32_t val);
  /// Create a float Token
  /// @param source the source of the token
  /// @param val the source float for the token
  Token(const Source& source, float val);
  /// Move constructor
  Token(Token&&);
  /// Copy constructor
  Token(const Token&);
  ~Token();

  /// Assignment operator
  /// @param b the token to copy
  /// @return Token
  Token& operator=(const Token& b);

  /// Returns true if the token is of the given type
  /// @param t the type to check against.
  /// @returns true if the token is of type |t|
  bool Is(Type t) const { return type_ == t; }

  /// @returns true if the token is uninitialized
  bool IsUninitialized() const { return type_ == Type::kUninitialized; }
  /// @returns true if the token is reserved
  bool IsReservedKeyword() const { return type_ == Type::kReservedKeyword; }
  /// @returns true if the token is an error
  bool IsError() const { return type_ == Type::kError; }
  /// @returns true if the token is EOF
  bool IsEof() const { return type_ == Type::kEOF; }
  /// @returns true if the token is an identifier
  bool IsIdentifier() const { return type_ == Type::kIdentifier; }
  /// @returns true if the token is a string
  bool IsStringLiteral() const { return type_ == Type::kStringLiteral; }
  /// @returns true if the token is a float
  bool IsFloatLiteral() const { return type_ == Type::kFloatLiteral; }
  /// @returns true if the token is an int
  bool IsIntLiteral() const { return type_ == Type::kIntLiteral; }
  /// @returns true if the token is a unsigned int
  bool IsUintLiteral() const { return type_ == Type::kUintLiteral; }

  /// @returns true if token is a '&'
  bool IsAnd() const { return type_ == Type::kAnd; }
  /// @returns true if token is a '&&'
  bool IsAndAnd() const { return type_ == Type::kAndAnd; }
  /// @returns true if token is a '->'
  bool IsArrow() const { return type_ == Type::kArrow; }
  /// @returns true if token is a '[['
  bool IsAttrLeft() const { return type_ == Type::kAttrLeft; }
  /// @returns true if token is a ']]'
  bool IsAttrRight() const { return type_ == Type::kAttrRight; }
  /// @returns true if token is a '/'
  bool IsForwardSlash() const { return type_ == Type::kForwardSlash; }
  /// @returns true if token is a '!'
  bool IsBang() const { return type_ == Type::kBang; }
  /// @returns true if token is a '['
  bool IsBracketLeft() const { return type_ == Type::kBracketLeft; }
  /// @returns true if token is a ']'
  bool IsBracketRight() const { return type_ == Type::kBracketRight; }
  /// @returns true if token is a '{'
  bool IsBraceLeft() const { return type_ == Type::kBraceLeft; }
  /// @returns true if token is a '}'
  bool IsBraceRight() const { return type_ == Type::kBraceRight; }
  /// @returns true if token is a ':'
  bool IsColon() const { return type_ == Type::kColon; }
  /// @returns true if token is a ','
  bool IsComma() const { return type_ == Type::kComma; }
  /// @returns true if token is a '='
  bool IsEqual() const { return type_ == Type::kEqual; }
  /// @returns true if token is a '=='
  bool IsEqualEqual() const { return type_ == Type::kEqualEqual; }
  /// @returns true if token is a '>'
  bool IsGreaterThan() const { return type_ == Type::kGreaterThan; }
  /// @returns true if token is a '>='
  bool IsGreaterThanEqual() const { return type_ == Type::kGreaterThanEqual; }
  /// @returns true if token is a '<'
  bool IsLessThan() const { return type_ == Type::kLessThan; }
  /// @returns true if token is a '<='
  bool IsLessThanEqual() const { return type_ == Type::kLessThanEqual; }
  /// @returns true if token is a '%'
  bool IsMod() const { return type_ == Type::kMod; }
  /// @returns true if token is a '-'
  bool IsMinus() const { return type_ == Type::kMinus; }
  /// @returns true if token is a '::'
  bool IsNamespace() const { return type_ == Type::kNamespace; }
  /// @returns true if token is a '!='
  bool IsNotEqual() const { return type_ == Type::kNotEqual; }
  /// @returns true if token is a '.'
  bool IsPeriod() const { return type_ == Type::kPeriod; }
  /// @returns true if token is a '+'
  bool IsPlus() const { return type_ == Type::kPlus; }
  /// @returns true if token is a '|'
  bool IsOr() const { return type_ == Type::kOr; }
  /// @returns true if token is a '||'
  bool IsOrOr() const { return type_ == Type::kOrOr; }
  /// @returns true if token is a '('
  bool IsParenLeft() const { return type_ == Type::kParenLeft; }
  /// @returns true if token is a ')'
  bool IsParenRight() const { return type_ == Type::kParenRight; }
  /// @returns true if token is a ';'
  bool IsSemicolon() const { return type_ == Type::kSemicolon; }
  /// @returns true if token is a '*'
  bool IsStar() const { return type_ == Type::kStar; }
  /// @returns true if token is a '^'
  bool IsXor() const { return type_ == Type::kXor; }

  /// @returns true if token is a 'all'
  bool IsAll() const { return type_ == Type::kAll; }
  /// @returns true if token is a 'any'
  bool IsAny() const { return type_ == Type::kAny; }
  /// @returns true if token is a 'array'
  bool IsArray() const { return type_ == Type::kArray; }
  /// @returns true if token is a 'as'
  bool IsAs() const { return type_ == Type::kAs; }
  /// @returns true if token is a 'binding'
  bool IsBinding() const { return type_ == Type::kBinding; }
  /// @returns true if token is a 'block'
  bool IsBlock() const { return type_ == Type::kBlock; }
  /// @returns true if token is a 'bool'
  bool IsBool() const { return type_ == Type::kBool; }
  /// @returns true if token is a 'break'
  bool IsBreak() const { return type_ == Type::kBreak; }
  /// @returns true if token is a 'builtin'
  bool IsBuiltin() const { return type_ == Type::kBuiltin; }
  /// @returns true if token is a 'case'
  bool IsCase() const { return type_ == Type::kCase; }
  /// @returns true if token is a 'cast'
  bool IsCast() const { return type_ == Type::kCast; }
  /// @returns true if token is 'coarse'
  bool IsCoarse() const { return type_ == Type::kCoarse; }
  /// @returns true if token is a 'compute'
  bool IsCompute() const { return type_ == Type::kCompute; }
  /// @returns true if token is a 'const'
  bool IsConst() const { return type_ == Type::kConst; }
  /// @returns true if token is a 'continue'
  bool IsContinue() const { return type_ == Type::kContinue; }
  /// @returns true if token is a 'continuing'
  bool IsContinuing() const { return type_ == Type::kContinuing; }
  /// @returns true if token is a 'default'
  bool IsDefault() const { return type_ == Type::kDefault; }
  /// @returns true if token is a 'dot'
  bool IsDot() const { return type_ == Type::kDot; }
  /// @returns true if token is a 'dpdx'
  bool IsDpdx() const { return type_ == Type::kDpdx; }
  /// @returns true if token is a 'dpdy'
  bool IsDpdy() const { return type_ == Type::kDpdy; }
  /// @returns true if token is a 'else'
  bool IsElse() const { return type_ == Type::kElse; }
  /// @returns true if token is a 'elseif'
  bool IsElseIf() const { return type_ == Type::kElseIf; }
  /// @returns true if token is a 'entry_point'
  bool IsEntryPoint() const { return type_ == Type::kEntryPoint; }
  /// @returns true if token is a 'f32'
  bool IsF32() const { return type_ == Type::kF32; }
  /// @returns true if token is a 'fallthrough'
  bool IsFallthrough() const { return type_ == Type::kFallthrough; }
  /// @returns true if token is a 'false'
  bool IsFalse() const { return type_ == Type::kFalse; }
  /// @returns true if token is a 'fine'
  bool IsFine() const { return type_ == Type::kFine; }
  /// @returns true if token is a 'fn'
  bool IsFn() const { return type_ == Type::kFn; }
  /// @returns true if token is a 'frag_coord'
  bool IsFragCoord() const { return type_ == Type::kFragCoord; }
  /// @returns true if token is a 'frag_depth'
  bool IsFragDepth() const { return type_ == Type::kFragDepth; }
  /// @returns true if token is a 'fragment'
  bool IsFragment() const { return type_ == Type::kFragment; }
  /// @returns true if token is a 'front_facing'
  bool IsFrontFacing() const { return type_ == Type::kFrontFacing; }
  /// @returns true if token is a 'function'
  bool IsFunction() const { return type_ == Type::kFunction; }
  /// @returns true if token is a 'fwidth'
  bool IsFwidth() const { return type_ == Type::kFwidth; }
  /// @returns true if token is a 'global_invocation_id'
  bool IsGlobalInvocationId() const {
    return type_ == Type::kGlobalInvocationId;
  }
  /// @returns true if token is a 'i32'
  bool IsI32() const { return type_ == Type::kI32; }
  /// @returns true if token is a 'if'
  bool IsIf() const { return type_ == Type::kIf; }
  /// @returns true if token is a 'image'
  bool IsImage() const { return type_ == Type::kImage; }
  /// @returns true if token is a 'import'
  bool IsImport() const { return type_ == Type::kImport; }
  /// @returns true if token is a 'in'
  bool IsIn() const { return type_ == Type::kIn; }
  /// @returns true if token is a 'instance_idx'
  bool IsInstanceIdx() const { return type_ == Type::kInstanceIdx; }
  /// @returns true if token is a 'is_nan'
  bool IsIsNan() const { return type_ == Type::kIsNan; }
  /// @returns true if token is a 'is_inf'
  bool IsIsInf() const { return type_ == Type::kIsInf; }
  /// @returns true if token is a 'is_finite'
  bool IsIsFinite() const { return type_ == Type::kIsFinite; }
  /// @returns true if token is a 'is_normal'
  bool IsIsNormal() const { return type_ == Type::kIsNormal; }
  /// @returns true if token is a 'kill'
  bool IsKill() const { return type_ == Type::kKill; }
  /// @returns true if token is a 'local_invocation_id'
  bool IsLocalInvocationId() const { return type_ == Type::kLocalInvocationId; }
  /// @returns true if token is a 'local_invocation_idx'
  bool IsLocalInvocationIdx() const {
    return type_ == Type::kLocalInvocationIdx;
  }
  /// @returns true if token is a 'location'
  bool IsLocation() const { return type_ == Type::kLocation; }
  /// @returns true if token is a 'loop'
  bool IsLoop() const { return type_ == Type::kLoop; }
  /// @returns true if token is a 'mat2x2'
  bool IsMat2x2() const { return type_ == Type::kMat2x2; }
  /// @returns true if token is a 'mat2x3'
  bool IsMat2x3() const { return type_ == Type::kMat2x3; }
  /// @returns true if token is a 'mat2x4'
  bool IsMat2x4() const { return type_ == Type::kMat2x4; }
  /// @returns true if token is a 'mat3x2'
  bool IsMat3x2() const { return type_ == Type::kMat3x2; }
  /// @returns true if token is a 'mat3x3'
  bool IsMat3x3() const { return type_ == Type::kMat3x3; }
  /// @returns true if token is a 'mat3x4'
  bool IsMat3x4() const { return type_ == Type::kMat3x4; }
  /// @returns true if token is a 'mat4x2'
  bool IsMat4x2() const { return type_ == Type::kMat4x2; }
  /// @returns true if token is a 'mat4x3'
  bool IsMat4x3() const { return type_ == Type::kMat4x3; }
  /// @returns true if token is a 'mat4x4'
  bool IsMat4x4() const { return type_ == Type::kMat4x4; }
  /// @returns true if token is a 'num_workgroups'
  bool IsNumWorkgroups() const { return type_ == Type::kNumWorkgroups; }
  /// @returns true if token is a 'offset'
  bool IsOffset() const { return type_ == Type::kOffset; }
  /// @returns true if token is a 'out'
  bool IsOut() const { return type_ == Type::kOut; }
  /// @returns true if token is a 'outer_product'
  bool IsOuterProduct() const { return type_ == Type::kOuterProduct; }
  /// @returns true if token is a 'position'
  bool IsPosition() const { return type_ == Type::kPosition; }
  /// @returns true if token is a 'private'
  bool IsPrivate() const { return type_ == Type::kPrivate; }
  /// @returns true if token is a 'ptr'
  bool IsPtr() const { return type_ == Type::kPtr; }
  /// @returns true if token is a 'return'
  bool IsReturn() const { return type_ == Type::kReturn; }
  /// @returns true if token is a 'set'
  bool IsSet() const { return type_ == Type::kSet; }
  /// @returns true if token is a 'storage_buffer'
  bool IsStorageBuffer() const { return type_ == Type::kStorageBuffer; }
  /// @returns true if token is a 'struct'
  bool IsStruct() const { return type_ == Type::kStruct; }
  /// @returns true if token is a 'switch'
  bool IsSwitch() const { return type_ == Type::kSwitch; }
  /// @returns true if token is a 'true'
  bool IsTrue() const { return type_ == Type::kTrue; }
  /// @returns true if token is a 'type'
  bool IsType() const { return type_ == Type::kType; }
  /// @returns true if token is a 'u32'
  bool IsU32() const { return type_ == Type::kU32; }
  /// @returns true if token is a 'uniform'
  bool IsUniform() const { return type_ == Type::kUniform; }
  /// @returns true if token is a 'uniform_constant'
  bool IsUniformConstant() const { return type_ == Type::kUniformConstant; }
  /// @returns true if token is a 'unless'
  bool IsUnless() const { return type_ == Type::kUnless; }
  /// @returns true if token is a 'var'
  bool IsVar() const { return type_ == Type::kVar; }
  /// @returns true if token is a 'vec2'
  bool IsVec2() const { return type_ == Type::kVec2; }
  /// @returns true if token is a 'vec3'
  bool IsVec3() const { return type_ == Type::kVec3; }
  /// @returns true if token is a 'vec4'
  bool IsVec4() const { return type_ == Type::kVec4; }
  /// @returns true if token is a 'vertex'
  bool IsVertex() const { return type_ == Type::kVertex; }
  /// @returns true if token is a 'vertex_idx'
  bool IsVertexIdx() const { return type_ == Type::kVertexIdx; }
  /// @returns true if token is a 'void'
  bool IsVoid() const { return type_ == Type::kVoid; }
  /// @returns true if token is a 'workgroup'
  bool IsWorkgroup() const { return type_ == Type::kWorkgroup; }
  /// @returns true if token is a 'workgroup_size'
  bool IsWorkgroupSize() const { return type_ == Type::kWorkgroupSize; }

  /// @returns the source line of the token
  size_t line() const { return source_.line; }
  /// @returns the source column of the token
  size_t column() const { return source_.column; }
  /// @returns the source information for this token
  Source source() const { return source_; }

  /// Returns the string value of the token
  /// @return const std::string&
  std::string to_str() const;
  /// Returns the float value of the token. 0 is returned if the token does not
  /// contain a float value.
  /// @return float
  float to_f32() const;
  /// Returns the uint32 value of the token. 0 is returned if the token does not
  /// contain a unsigned integer value.
  /// @return uint32_t
  uint32_t to_u32() const;
  /// Returns the int32 value of the token. 0 is returned if the token does not
  /// contain a signed integer value.
  /// @return int32_t
  int32_t to_i32() const;

  /// @returns the token type as string
  std::string to_name() const { return Token::TypeToName(type_); }

 private:
  /// The Token::Type of the token
  Type type_ = Type::kError;
  /// The source where the token appeared
  Source source_;
  /// The string represented by the token
  std::string val_str_;
  /// The signed integer represented by the token
  int32_t val_int_ = 0;
  /// The unsigned integer represented by the token
  uint32_t val_uint_ = 0;
  /// The float value represented by the token
  float val_float_ = 0.0;
};

#ifndef NDEBUG
inline std::ostream& operator<<(std::ostream& out, Token::Type type) {
  out << Token::TypeToName(type);
  return out;
}
#endif  // NDEBUG

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

#endif  // SRC_READER_WGSL_TOKEN_H_
