/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
 
#ifndef SKSL_TOKEN
#define SKSL_TOKEN

#include "SkSLPosition.h"
#include "SkSLUtil.h"
 
namespace SkSL {

#undef IN
#undef OUT
#undef CONST

/**
 * Represents a lexical analysis token. Token is generally only used during the parse process, but
 * Token::Kind is also used to represent operator kinds.
 */
struct Token {
    enum Kind {
        END_OF_FILE,
        IDENTIFIER,
        INT_LITERAL,
        FLOAT_LITERAL,
        TRUE_LITERAL,
        FALSE_LITERAL,
        LPAREN,
        RPAREN,
        LBRACE,
        RBRACE,
        LBRACKET,
        RBRACKET,
        DOT,
        COMMA,
        PLUSPLUS,
        MINUSMINUS,
        PLUS,
        MINUS,
        STAR,
        SLASH,
        PERCENT,
        SHL,
        SHR,
        BITWISEOR,
        BITWISEXOR,
        BITWISEAND,
        LOGICALOR,
        LOGICALXOR,
        LOGICALAND,
        NOT,
        QUESTION,
        COLON,
        EQ,
        EQEQ,
        NEQ,
        GT,
        LT,
        GTEQ,
        LTEQ,
        PLUSEQ,
        MINUSEQ,
        STAREQ,
        SLASHEQ,
        PERCENTEQ,
        SHLEQ,
        SHREQ,
        BITWISEOREQ,
        BITWISEXOREQ,
        BITWISEANDEQ,
        LOGICALOREQ,
        LOGICALXOREQ,
        LOGICALANDEQ,
        SEMICOLON,
        IF,
        ELSE,
        FOR,
        WHILE,
        DO,
        RETURN,
        BREAK,
        CONTINUE,
        DISCARD,
        IN,
        OUT,
        INOUT,
        CONST,
        LOWP,
        MEDIUMP,
        HIGHP,
        UNIFORM,
        FLAT,
        NOPERSPECTIVE,
        STRUCT,
        LAYOUT,
        DIRECTIVE,
        PRECISION,
        INVALID_TOKEN
    };

    static std::string OperatorName(Kind kind) {
        switch (kind) {
            case Token::PLUS:         return "+";
            case Token::MINUS:        return "-";
            case Token::STAR:         return "*";
            case Token::SLASH:        return "/";
            case Token::PERCENT:      return "%";
            case Token::SHL:          return "<<";
            case Token::SHR:          return ">>";
            case Token::LOGICALAND:   return "&&";
            case Token::LOGICALOR:    return "||";
            case Token::LOGICALXOR:   return "^^";
            case Token::BITWISEAND:   return "&";
            case Token::BITWISEOR:    return "|";
            case Token::BITWISEXOR:   return "^";
            case Token::EQ:           return "=";
            case Token::EQEQ:         return "==";
            case Token::NEQ:          return "!=";
            case Token::LT:           return "<";
            case Token::GT:           return ">";
            case Token::LTEQ:         return "<=";
            case Token::GTEQ:         return ">=";
            case Token::PLUSEQ:       return "+=";
            case Token::MINUSEQ:      return "-=";
            case Token::STAREQ:       return "*=";
            case Token::SLASHEQ:      return "/=";
            case Token::PERCENTEQ:    return "%=";
            case Token::SHLEQ:        return "<<=";
            case Token::SHREQ:        return ">>=";
            case Token::LOGICALANDEQ: return "&&=";
            case Token::LOGICALOREQ:  return "||=";
            case Token::LOGICALXOREQ: return "^^=";
            case Token::BITWISEANDEQ: return "&=";
            case Token::BITWISEOREQ:  return "|=";
            case Token::BITWISEXOREQ: return "^=";
            case Token::PLUSPLUS:     return "++";
            case Token::MINUSMINUS:   return "--";
            case Token::NOT:          return "!";
            default:
                ABORT("unsupported operator: %d\n", kind); 
        }        
    }

    Token() {
    }

    Token(Position position, Kind kind, std::string text)
    : fPosition(position)
    , fKind(kind)
    , fText(std::move(text)) {}

    Position fPosition;
    Kind fKind;
    std::string fText;
};

} // namespace
#endif
