/*
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
/*
 * Portions Copyright (c) 2011 Jonas Maebe
 */



package fpc.tools.javapp;

/**
 * This interface defines constant that are used
 * throughout the compiler. It inherits from RuntimeConstants,
 * which is an autogenerated class that contains contstants
 * defined in the interpreter.
 */

public
interface Constants extends RuntimeConstants {

     /**
     * End of input
     */
    public static final int EOF = -1;

   /*
     * Flags
     */
    public static final int F_VERBOSE           = 1 << 0;
    public static final int F_DUMP              = 1 << 1;
    public static final int F_WARNINGS          = 1 << 2;
    public static final int F_DEBUG             = 1 << 3;
    public static final int F_OPTIMIZE          = 1 << 4;
    public static final int F_DEPENDENCIES      = 1 << 5;

    /*
     * Type codes
     */
    public static final int TC_BOOLEAN   = 0;
    public static final int TC_BYTE      = 1;
    public static final int TC_CHAR      = 2;
    public static final int TC_SHORT     = 3;
    public static final int TC_INT       = 4;
    public static final int TC_LONG      = 5;
    public static final int TC_FLOAT     = 6;
    public static final int TC_DOUBLE    = 7;
    public static final int TC_NULL      = 8;
    public static final int TC_ARRAY     = 9;
    public static final int TC_CLASS     = 10;
    public static final int TC_VOID      = 11;
    public static final int TC_METHOD    = 12;
    public static final int TC_ERROR     = 13;

    /*
     * Type Masks
     */
    public static final int TM_NULL      = 1 << TC_NULL;
    public static final int TM_VOID      = 1 << TC_VOID;
    public static final int TM_BOOLEAN   = 1 << TC_BOOLEAN;
    public static final int TM_BYTE      = 1 << TC_BYTE;
    public static final int TM_CHAR      = 1 << TC_CHAR;
    public static final int TM_SHORT     = 1 << TC_SHORT;
    public static final int TM_INT       = 1 << TC_INT;
    public static final int TM_LONG      = 1 << TC_LONG;
    public static final int TM_FLOAT     = 1 << TC_FLOAT;
    public static final int TM_DOUBLE    = 1 << TC_DOUBLE;
    public static final int TM_ARRAY     = 1 << TC_ARRAY;
    public static final int TM_CLASS     = 1 << TC_CLASS;
    public static final int TM_METHOD    = 1 << TC_METHOD;
    public static final int TM_ERROR     = 1 << TC_ERROR;

    public static final int TM_INT32     = TM_BYTE | TM_SHORT | TM_CHAR | TM_INT;
    public static final int TM_NUM32     = TM_INT32 | TM_FLOAT;
    public static final int TM_NUM64     = TM_LONG | TM_DOUBLE;
    public static final int TM_INTEGER   = TM_INT32 | TM_LONG;
    public static final int TM_REAL      = TM_FLOAT | TM_DOUBLE;
    public static final int TM_NUMBER    = TM_INTEGER | TM_REAL;
    public static final int TM_REFERENCE = TM_ARRAY | TM_CLASS | TM_NULL;

    /*
     * Class status
     */
    public static final int CS_UNDEFINED        = 0;
    public static final int CS_UNDECIDED        = 1;
    public static final int CS_BINARY           = 2;
    public static final int CS_SOURCE           = 3;
    public static final int CS_PARSED           = 4;
    public static final int CS_COMPILED         = 5;
    public static final int CS_NOTFOUND         = 6;

    /*
     * Attributes
     */
    public static final int ATT_ALL             = -1;
    public static final int ATT_CODE            = 1;

    /*
     * Number of bits used in file offsets
     */
    public static final int OFFSETBITS          = 19;
    public static final int MAXFILESIZE         = (1 << OFFSETBITS) - 1;
    public static final int MAXLINENUMBER       = (1 << (32 - OFFSETBITS)) - 1;

    /*
     * Operators
     */
    public final int COMMA              = 0;
    public final int ASSIGN             = 1;

    public final int ASGMUL             = 2;
    public final int ASGDIV             = 3;
    public final int ASGREM             = 4;
    public final int ASGADD             = 5;
    public final int ASGSUB             = 6;
    public final int ASGLSHIFT          = 7;
    public final int ASGRSHIFT          = 8;
    public final int ASGURSHIFT         = 9;
    public final int ASGBITAND          = 10;
    public final int ASGBITOR           = 11;
    public final int ASGBITXOR          = 12;

    public final int COND               = 13;
    public final int OR                 = 14;
    public final int AND                = 15;
    public final int BITOR              = 16;
    public final int BITXOR             = 17;
    public final int BITAND             = 18;
    public final int NE                 = 19;
    public final int EQ                 = 20;
    public final int GE                 = 21;
    public final int GT                 = 22;
    public final int LE                 = 23;
    public final int LT                 = 24;
    public final int INSTANCEOF         = 25;
    public final int LSHIFT             = 26;
    public final int RSHIFT             = 27;
    public final int URSHIFT            = 28;
    public final int ADD                = 29;
    public final int SUB                = 30;
    public final int DIV                = 31;
    public final int REM                = 32;
    public final int MUL                = 33;
    public final int CAST               = 34;           // (x)y
    public final int POS                = 35;           // +x
    public final int NEG                = 36;           // -x
    public final int NOT                = 37;
    public final int BITNOT             = 38;
    public final int PREINC             = 39;           // ++x
    public final int PREDEC             = 40;           // --x
    public final int NEWARRAY           = 41;
    public final int NEWINSTANCE        = 42;
    public final int NEWFROMNAME        = 43;
    public final int POSTINC            = 44;           // x++
    public final int POSTDEC            = 45;           // x--
    public final int FIELD              = 46;
    public final int METHOD             = 47;           // x(y)
    public final int ARRAYACCESS        = 48;           // x[y]
    public final int NEW                = 49;
    public final int INC                = 50;
    public final int DEC                = 51;

    public final int CONVERT            = 55;           // implicit conversion
    public final int EXPR               = 56;           // (x)
    public final int ARRAY              = 57;           // {x, y, ...}
    public final int GOTO               = 58;

    /*
     * Value tokens
     */
    public final int IDENT              = 60;
    public final int BOOLEANVAL         = 61;
    public final int BYTEVAL            = 62;
    public final int CHARVAL            = 63;
    public final int SHORTVAL           = 64;
    public final int INTVAL                     = 65;
    public final int LONGVAL            = 66;
    public final int FLOATVAL           = 67;
    public final int DOUBLEVAL          = 68;
    public final int STRINGVAL          = 69;

    /*
     * Type keywords
     */
    public final int BYTE               = 70;
    public final int CHAR               = 71;
    public final int SHORT              = 72;
    public final int INT                = 73;
    public final int LONG               = 74;
    public final int FLOAT              = 75;
    public final int DOUBLE             = 76;
    public final int VOID               = 77;
    public final int BOOLEAN            = 78;

    /*
     * Expression keywords
     */
    public final int TRUE               = 80;
    public final int FALSE              = 81;
    public final int THIS               = 82;
    public final int SUPER              = 83;
    public final int NULL               = 84;

    /*
     * Statement keywords
     */
    public final int IF                 = 90;
    public final int ELSE               = 91;
    public final int FOR                = 92;
    public final int WHILE              = 93;
    public final int DO                 = 94;
    public final int SWITCH             = 95;
    public final int CASE               = 96;
    public final int DEFAULT            = 97;
    public final int BREAK              = 98;
    public final int CONTINUE           = 99;
    public final int RETURN             = 100;
    public final int TRY                = 101;
    public final int CATCH              = 102;
    public final int FINALLY            = 103;
    public final int THROW              = 104;
    public final int STAT               = 105;
    public final int EXPRESSION         = 106;
    public final int DECLARATION        = 107;
    public final int VARDECLARATION     = 108;

    /*
     * Declaration keywords
     */
    public final int IMPORT             = 110;
    public final int CLASS              = 111;
    public final int EXTENDS            = 112;
    public final int IMPLEMENTS         = 113;
    public final int INTERFACE          = 114;
    public final int PACKAGE            = 115;

    /*
     * Modifier keywords
     */
    public final int PRIVATE    = 120;
    public final int PUBLIC             = 121;
    public final int PROTECTED  = 122;
    public final int CONST              = 123;
    public final int STATIC             = 124;
    public final int TRANSIENT          = 125;
    public final int SYNCHRONIZED       = 126;
    public final int NATIVE             = 127;
    public final int FINAL              = 128;
    public final int VOLATILE   = 129;
    public final int ABSTRACT   = 130;
    public final int STRICT             = 165;

    /*
     * Punctuation
     */
    public final int SEMICOLON  = 135;
    public final int COLON              = 136;
    public final int QUESTIONMARK       = 137;
    public final int LBRACE             = 138;
    public final int RBRACE             = 139;
    public final int LPAREN             = 140;
    public final int RPAREN             = 141;
    public final int LSQBRACKET = 142;
    public final int RSQBRACKET = 143;
    public final int THROWS     = 144;

    /*
     * Special tokens
     */
    public final int ERROR              = 145;          // an error
    public final int COMMENT    = 146;          // not used anymore.
    public final int TYPE               = 147;
    public final int LENGTH             = 148;
    public final int INLINERETURN       = 149;
    public final int INLINEMETHOD       = 150;
    public final int INLINENEWINSTANCE  = 151;

    /*
     * Added for jasm
     */
        public final int METHODREF      = 152;
        public final int FIELDREF       = 153;
    public final int STACK              = 154;
    public final int LOCAL              = 155;
    public final int CPINDEX    = 156;
    public final int CPNAME             = 157;
    public final int SIGN               = 158;
    public final int BITS               = 159;
    public final int INF                = 160;
    public final int NAN                = 161;
    public final int INNERCLASS = 162;
    public final int OF         = 163;
    public final int SYNTHETIC          = 164;
// last used=165;

   /*
     * Operator precedence
     */
    public static final int opPrecedence[] = {
        10,     11,     11,     11,     11,     11,     11,     11,     11,     11,
        11,     11,     11,     12,     13,     14,     15,     16,     17,     18,
        18,     19,     19,     19,     19,     19,     20,     20,     20,     21,
        21,     22,     22,     22,     23,     24,     24,     24,     24,     24,
        24,     25,     25,     26,     26,     26,     26,     26,     26
    };

    /*
     * Operator names
     */
    public static final String opNames[] = {
        ",",            "=",            "*=",           "/=",           "%=",
        "+=",           "-=",           "<<=",          ">>=",          "<<<=",
        "&=",           "|=",           "^=",           "?:",           "||",
        "&&",           "|",            "^",            "&",            "!=",
        "==",           ">=",           ">",            "<=",           "<",
        "instanceof",   "<<",           ">>",           "<<<",          "+",
        "-",            "/",            "%",            "*",            "cast",
        "+",            "-",            "!",            "~",            "++",
        "--",           "new",          "new",          "new",          "++",
        "--",           "field",        "method",       "[]",           "new",
        "++",           "--",           null,           null,           null,

        "convert",      "expr",         "array",        "goto",         null,

        "Identifier",   "Boolean",      "Byte",         "Char",         "Short",
        "Integer",              "Long",         "Float",        "Double",       "String",

        "byte",         "char",         "short",        "int",          "long",
        "float",        "double",       "void",         "boolean",      null,

        "true",         "false",        "this",         "super",        "null",
        null,           null,           null,           null,           null,

        "if",           "else",         "for",          "while",        "do",
        "switch",       "case",         "default",      "break",        "continue",
        "return",       "try",          "catch",        "finally",      "throw",
        "stat",         "expression",   "declaration",  "declaration",  null,

        "import",       "class",        "extends",      "implements",   "interface",
        "package",      null,           null,           null,           null,

        "private",      "public",       "protected",    "const",        "static",
        "transient",    "synchronized", "native",       "final",        "volatile",
        "abstract",     null,           null,           null,           null,

        ";",            ":",            "?",            "{",            "}",
        "(",            ")",            "[",            "]",            "throws",
        "error",        "comment",      "type",         "length",       "inline-return",
        "inline-method", "inline-new",
        "method", "field", "stack", "locals", "CPINDEX", "CPName", "SIGN",
        "bits", "INF", "NaN", "InnerClass", "of", "synthetic"
    };

}
