/*
 * 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.ImmutableMap;
import com.google.idea.blaze.base.lang.buildfile.language.BuildFileType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;

/** The IElementTypes used by the BUILD language */
public class BuildToken extends IElementType {

  private static ImmutableMap<TokenKind, BuildToken> types = createMap();

  private static ImmutableMap<TokenKind, BuildToken> createMap() {
    ImmutableMap.Builder<TokenKind, BuildToken> builder = ImmutableMap.builder();
    for (TokenKind kind : TokenKind.values()) {
      builder.put(kind, new BuildToken(kind));
    }
    return builder.build();
  }

  public static BuildToken fromKind(TokenKind kind) {
    return types.get(kind);
  }

  public static final BuildToken IDENTIFIER = fromKind(TokenKind.IDENTIFIER);

  public static final TokenSet WHITESPACE_AND_NEWLINE =
      TokenSet.create(fromKind(TokenKind.WHITESPACE), fromKind(TokenKind.NEWLINE));

  public final TokenKind kind;

  private BuildToken(TokenKind kind) {
    super(kind.name(), BuildFileType.INSTANCE.getLanguage());
    this.kind = kind;
  }

  @Override
  public String toString() {
    return kind.toString();
  }
}
