/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.
 */
package com.google.idea.blaze.base.lang.buildfile.lexer;

import com.google.common.collect.ImmutableSet;

/** A TokenKind is an enumeration of each different kind of lexical symbol. */
public enum TokenKind {
  ASSERT("assert"),
  AND("and"),
  AS("as"),
  BREAK("break"),
  CLASS("class"),
  COLON(":"),
  COMMA(","),
  COMMENT("comment"),
  CONTINUE("continue"),
  DEF("def"),
  DEL("del"),
  DOT("."),
  ELIF("elif"),
  ELSE("else"),
  EOF("EOF"),
  EQUALS("="),
  EQUALS_EQUALS("=="),
  EXCEPT("except"),
  FINALLY("finally"),
  FOR("for"),
  FROM("from"),
  GLOBAL("global"),
  GREATER(">"),
  GREATER_EQUALS(">="),
  IDENTIFIER("identifier"),
  IF("if"),
  ILLEGAL("illegal character"),
  IMPORT("import"),
  IN("in"),
  INDENT("indent"),
  INT("integer"),
  IS("is"),
  LAMBDA("lambda"),
  LBRACE("{"),
  LBRACKET("["),
  LESS("<"),
  LESS_EQUALS("<="),
  LOAD("load"),
  LPAREN("("),
  MINUS("-"),
  NEWLINE("newline"),
  NONLOCAL("nonlocal"),
  NOT("not"),
  NOT_EQUALS("!="),
  NOT_IN("not in"), // used internally by the parser; not directly created by the lexer
  OR("or"),
  DEDENT("dedent"),
  PASS("pass"),
  PERCENT("%"),
  PIPE("|"),
  PLUS("+"),
  PLUS_EQUALS("+="),
  MINUS_EQUALS("-="),
  STAR_EQUALS("*="),
  SLASH_EQUALS("/="),
  PERCENT_EQUALS("%="),
  RAISE("raise"),
  RBRACE("}"),
  RBRACKET("]"),
  RETURN("return"),
  RPAREN(")"),
  SEMI(";"),
  SLASH("/"),
  STAR("*"),
  STAR_STAR("**"),
  STRING("string"),
  TRY("try"),
  WHILE("while"),
  WITH("with"),
  YIELD("yield"),
  // We need to tokenize all characters.
  // Whitespace will be used for all tokens which should be ignored by the parser.
  WHITESPACE("whitespace");

  private final String name;

  TokenKind(String name) {
    this.name = name;
  }

  /**
   * This is a user-friendly name. For keywords (if, yield, True, etc.), it's also the exact
   * character sequence used by the lexer.
   */
  @Override
  public String toString() {
    return name;
  }

  public static final ImmutableSet<TokenKind> KEYWORDS =
      ImmutableSet.of(
          AND, AS, ASSERT, BREAK, CLASS, CONTINUE, DEF, DEL, ELIF, ELSE, EXCEPT, FINALLY, FOR, FROM,
          GLOBAL, IF, IMPORT, IN, IS, LAMBDA, NONLOCAL, NOT, OR, PASS, RAISE, RETURN, TRY, WHILE,
          WITH, YIELD);

  public static final ImmutableSet<TokenKind> OPERATIONS =
      ImmutableSet.of(
          AND,
          EQUALS_EQUALS,
          GREATER,
          GREATER_EQUALS,
          IN,
          LESS,
          LESS_EQUALS,
          MINUS,
          NOT_EQUALS,
          NOT_IN,
          OR,
          PERCENT,
          SLASH,
          PLUS,
          PIPE,
          STAR);

  public static final ImmutableSet<TokenKind> AUGMENTED_ASSIGNMENT_OPS =
      ImmutableSet.of(PLUS_EQUALS, MINUS_EQUALS, STAR_EQUALS, SLASH_EQUALS, PERCENT_EQUALS);
}
