/*
 * Copyright 2010 Jon S Akhtar (Sylvanaar)
 *
 *   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.sylvanaar.idea.Lua.lang.lexer;

import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;


/**
 * Interface that contains all tokens returned by LuaLexer
 *
 * @author sylvanaar
 */
public interface LuaTokenTypes {
    //IFileElementType FILE = new IFileElementType(Language.findInstance(LuaLanguage.class));
    /**
     * Wrong token. Use for debugger needs
     */
    IElementType WRONG = new LuaElementType("wrong token");


    /* **************************************************************************************************
   *  Whitespaces & NewLines
   * ****************************************************************************************************/

    IElementType WS = new LuaElementType("white space");
    IElementType NEWLINE = new LuaElementType("new line");

    TokenSet WHITE_SPACES_SET = TokenSet.create(WS, NEWLINE);

    /* **************************************************************************************************
   *  Comments
   * ****************************************************************************************************/

    IElementType SHEBANG = new LuaElementType("shebang - should ignore");

    IElementType LONGCOMMENT = new LuaElementType("long comment");
    IElementType SHORTCOMMENT = new LuaElementType("short comment");

    IElementType LONGCOMMENT_BEGIN = new LuaElementType("long comment start bracket");
    IElementType LONGCOMMENT_END = new LuaElementType("long comment end bracket");

    IElementType LUADOC_COMMENT = new LuaElementType("LuaDoc Comment");

    TokenSet COMMENT_SET = TokenSet.create(SHORTCOMMENT, LONGCOMMENT,  SHEBANG, LUADOC_COMMENT);
    TokenSet BLOCK_COMMENT_SET = TokenSet.create(LONGCOMMENT, LONGCOMMENT_BEGIN, LONGCOMMENT_END);

    /* **************************************************************************************************
   *  Identifiers
   * ****************************************************************************************************/

    IElementType NAME = new LuaElementType("identifier");

    /* **************************************************************************************************
   *  Integers & floats
   * ****************************************************************************************************/

    IElementType NUMBER = new LuaElementType("number");

    /* **************************************************************************************************
   *  Strings & regular expressions
   * ****************************************************************************************************/

    IElementType STRING = new LuaElementType("string");
    IElementType LONGSTRING = new LuaElementType("long string");

    IElementType LONGSTRING_BEGIN = new LuaElementType("long string start bracket");
    IElementType LONGSTRING_END = new LuaElementType("long string end bracket");
    TokenSet STRING_LITERAL_SET = TokenSet.create(STRING, LONGSTRING, LONGSTRING_BEGIN, LONGSTRING_END);


    IElementType UNTERMINATED_STRING = new LuaElementType("unterminated string");


    /* **************************************************************************************************
   *  Common tokens: operators, braces etc.
   * ****************************************************************************************************/


    IElementType DIV = new LuaElementType("/");
    IElementType MULT = new LuaElementType("*");
    IElementType LPAREN = new LuaElementType("(");
    IElementType RPAREN = new LuaElementType(")");
    IElementType LBRACK = new LuaElementType("[");
    IElementType RBRACK = new LuaElementType("]");
    IElementType LCURLY = new LuaElementType("{");
    IElementType RCURLY = new LuaElementType("}");
    IElementType COLON = new LuaElementType(":");
    IElementType COMMA = new LuaElementType(",");
    IElementType DOT = new LuaElementType(".");
    IElementType ASSIGN = new LuaElementType("=");
    IElementType SEMI = new LuaElementType(";");
    IElementType EQ = new LuaElementType("==");
    IElementType NE = new LuaElementType("~=");
    IElementType PLUS = new LuaElementType("+");
    IElementType MINUS = new LuaElementType("-");
    IElementType GE = new LuaElementType(">=");
    IElementType GT = new LuaElementType(">");
    IElementType EXP = new LuaElementType("^");
    IElementType LE = new LuaElementType("<=");
    IElementType LT = new LuaElementType("<");
    IElementType ELLIPSIS = new LuaElementType("...");
    IElementType CONCAT = new LuaElementType("..");
    IElementType GETN = new LuaElementType("#");
    IElementType MOD = new LuaElementType("%");

    /* **************************************************************************************************
   *  Keywords
   * ****************************************************************************************************/


    IElementType IF = new LuaElementType("if");
    IElementType ELSE = new LuaElementType("else");
    IElementType ELSEIF = new LuaElementType("elseif");
    IElementType WHILE = new LuaElementType("while");
    IElementType WITH = new LuaElementType("with");

    IElementType THEN = new LuaElementType("then");
    IElementType FOR = new LuaElementType("for");
    IElementType IN = new LuaElementType("in");
    IElementType RETURN = new LuaElementType("return");
    IElementType BREAK = new LuaElementType("break");

    IElementType CONTINUE = new LuaElementType("continue");
    IElementType TRUE = new LuaElementType("true");
    IElementType FALSE = new LuaElementType("false");
    IElementType NIL = new LuaElementType("nil");
    IElementType FUNCTION = new LuaElementType("function");

    IElementType DO = new LuaElementType("do");
    IElementType NOT = new LuaElementType("not");
    IElementType AND = new LuaElementType("and");
    IElementType OR = new LuaElementType("or");
    IElementType LOCAL = new LuaElementType("local");

    IElementType REPEAT = new LuaElementType("repeat");
    IElementType UNTIL = new LuaElementType("until");
    IElementType END = new LuaElementType("end");

    /*
    IElementType MODULE = new LuaElementType("module");
    IElementType REQUIRE = new LuaElementType("require");
    */



    TokenSet KEYWORDS = TokenSet.create(DO, FUNCTION, NOT, AND, OR,
            WITH, IF, THEN, ELSEIF, THEN, ELSE,
            WHILE, FOR, IN, RETURN, BREAK,
            CONTINUE, LOCAL,
            REPEAT, UNTIL, END/*, MODULE, REQUIRE */);

    TokenSet BRACES = TokenSet.create(LCURLY, RCURLY);
    TokenSet PARENS = TokenSet.create(LPAREN, RPAREN);
    TokenSet BRACKS = TokenSet.create(LBRACK, RBRACK);

    TokenSet BAD_INPUT = TokenSet.create(WRONG, UNTERMINATED_STRING);
    
    TokenSet DEFINED_CONSTANTS = TokenSet.create(NIL, TRUE, FALSE);

    TokenSet UNARY_OP_SET = TokenSet.create(NOT, MINUS, GETN);

    TokenSet BINARY_OP_SET = TokenSet.create(AND, OR,
            EQ, GE, GT, LT, LE, NE, DOT, COLON,
            MINUS, PLUS, DIV, MULT, EXP, MOD);

    TokenSet TABLE_ACCESS = TokenSet.create(DOT, COLON, LBRACK);

      TokenSet LITERALS_SET = TokenSet.create(NUMBER, NIL, TRUE, FALSE, STRING, LONGSTRING, LONGSTRING_BEGIN, LONGSTRING_END);

    TokenSet IDENTIFIERS_SET = TokenSet.create(NAME);
}

@@ -660,16 +660,51 @@
 lexer;%0A%0A
+import com.intellij.psi.TokenType;%0A
 import c
@@ -1537,16 +1537,39 @@
  NEWLINE
+, TokenType.WHITE_SPACE
 );%0A%0A    

include TokenType.WHITE_SPACE in the whitespace tokens - the groovy plugin does it, and http://youtrack.jetbrains.net/issue/IDEA-37739