benmarch/spel2js

View on GitHub
src/TokenKind.js

Summary

Maintainability
A
0 mins
Test Coverage
/*
 * Copyright 2002-2015 the original author or authors.
 *
 * 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.
 */

/**
 * @author Andy Clement
 * @author Ben March
 * @since 0.2.0
 */

var types = {

    LITERAL_INT: 1,             //tested

    LITERAL_LONG: 2,            //tested

    LITERAL_HEXINT: 3,          //tested

    LITERAL_HEXLONG: 4,         //tested

    LITERAL_STRING: 5,          //tested

    LITERAL_REAL: 6,            //tested

    LITERAL_REAL_FLOAT: 7,      //tested

    LPAREN: '(',                //tested

    RPAREN: ')',                //tested

    COMMA: ',',                 //tested

    IDENTIFIER: 0,              //tested

    COLON: ':',                 //tested

    HASH: '#',                  //tested

    RSQUARE: ']',               //tested

    LSQUARE: '[',               //tested

    LCURLY: '{',                //tested

    RCURLY: '}',                //tested

    DOT: '.',                   //tested

    PLUS: '+',                  //tested

    STAR: '*',                  //tested

    MINUS: '-',                 //tested

    SELECT_FIRST: '^[',         //tested

    SELECT_LAST: '$[',          //tested

    QMARK: '?',                 //tested

    PROJECT: '![',              //tested

    DIV: '/',                   //tested

    GE: '>=',                   //tested

    GT: '>',                    //tested

    LE: '<=',                   //tested

    LT: '<',                    //tested

    EQ: '==',                   //tested

    NE: '!=',                   //tested

    MOD: '%',                   //tested

    NOT: '!',                   //tested

    ASSIGN: '=',                //tested

    INSTANCEOF: 'instanceof',   //test fails

    MATCHES: 'matches',         //test fails

    BETWEEN: 'between',         //test fails

    SELECT: '?[',               //tested

    POWER: '^',                 //tested

    ELVIS: '?:',                //tested

    SAFE_NAVI: '?.',            //tested

    BEAN_REF: '@',              //tested

    SYMBOLIC_OR: '||',          //tested

    SYMBOLIC_AND: '&&',         //tested

    INC: '++',                  //tested

    DEC: '--'                   //tested
};

function TokenKind(type) {
    this.type = type;
    this.tokenChars = types[type];
    this._hasPayload = typeof types[type] !== 'string';
    if (typeof types[type] === 'number') {
        this._ordinal = types[type];
    }
}

//create enum
for (var t in types) {
    if (types.hasOwnProperty(t)) {
        TokenKind[t] = new TokenKind(t);
    }
}

TokenKind.prototype.toString = function () {
    return this.type + (this.tokenChars.length !== 0 ? '(' + this.tokenChars + ')' : '');
};

TokenKind.prototype.getLength = function () {
    return this.tokenChars.length;
};

TokenKind.prototype.hasPayload = function () {
    return this._hasPayload;
};

TokenKind.prototype.valueOf = function (id) {
    for (var t in types) {
        if (types.hasOwnProperty(t) && types[t] === id) {
            return TokenKind[t];
        }
    }
};

TokenKind.prototype.ordinal = function () {
    return this._ordinal;
};

export {TokenKind};