// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TOOLS_GN_TOKEN_H_
#define TOOLS_GN_TOKEN_H_

#include "base/strings/string_piece.h"
#include "tools/gn/location.h"

class Token {
 public:
  enum Type {
    INVALID,
    INTEGER,     // 123
    STRING,      // "blah"
    TRUE_TOKEN,  // Not "TRUE" to avoid collisions with #define in windows.h.
    FALSE_TOKEN,

    // Various operators.
    EQUAL,
    PLUS,
    MINUS,
    PLUS_EQUALS,
    MINUS_EQUALS,
    EQUAL_EQUAL,
    NOT_EQUAL,
    LESS_EQUAL,
    GREATER_EQUAL,
    LESS_THAN,
    GREATER_THAN,
    BOOLEAN_AND,
    BOOLEAN_OR,
    BANG,
    DOT,

    LEFT_PAREN,
    RIGHT_PAREN,
    LEFT_BRACKET,
    RIGHT_BRACKET,
    LEFT_BRACE,
    RIGHT_BRACE,

    IF,
    ELSE,
    IDENTIFIER,            // foo
    COMMA,                 // ,
    UNCLASSIFIED_COMMENT,  // #...\n, of unknown style (will be converted
                           // to one below)
    LINE_COMMENT,          // #...\n on a line alone.
    SUFFIX_COMMENT,        // #...\n on a line following other code.
    BLOCK_COMMENT,         // #...\n line comment, but free-standing.

    UNCLASSIFIED_OPERATOR,

    NUM_TYPES
  };

  Token();
  Token(const Location& location, Type t, const base::StringPiece& v);
  Token(const Token& other);

  Type type() const { return type_; }
  const base::StringPiece& value() const { return value_; }
  const Location& location() const { return location_; }
  void set_location(Location location) { location_ = location; }
  LocationRange range() const {
    return LocationRange(
        location_,
        Location(location_.file(), location_.line_number(),
                 location_.column_number() + static_cast<int>(value_.size()),
                 location_.byte() + static_cast<int>(value_.size())));
  }

  // Helper functions for comparing this token to something.
  bool IsIdentifierEqualTo(const char* v) const;
  bool IsStringEqualTo(const char* v) const;

 private:
  Type type_;
  base::StringPiece value_;
  Location location_;
};

#endif  // TOOLS_GN_TOKEN_H_
