/* eslint-disable new-cap,camelcase */
// https://github.com/antlr/grammars-v4/blob/master/sql/postgresql/Java/PostgreSQLParserBase.java
// eslint-disable-next-line no-invalid-this
const __extends = (this && this.__extends) || (function () {
    let extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) {
                d.__proto__ = b;
            }) ||
            function (d, b) {
                for (const p in b)
                    if (Object.prototype.hasOwnProperty.call(b, p))
                        d[p] = b[p];
            };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== 'function' && b !== null) {
            throw new TypeError('Class extends value ' + String(b) + ' is not a constructor or null');
        }
        extendStatics(d, b);
        function __() {
            this.constructor = d;
        }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
const PostgreSQLLexer_1 = require('../PostgreSQLLexer');
const PostgreSQLParser_1 = require('../PostgreSQLParser');
const antlr4 = require('antlr4/index');
const CharStreams = antlr4.CharStreams;
const CommonTokenStream = antlr4.CommonTokenStream;
const Parser = antlr4.Parser;
__extends(PostgreSQLParserBase, Parser);
function PostgreSQLParserBase(input) {
    return Parser.call(this, input) || this;
}
PostgreSQLParserBase.prototype.GetParsedSqlTree = function (script, line) {
    const ph = this.getPostgreSQLParser(script);
    return ph.program();
};
PostgreSQLParserBase.prototype.ParseRoutineBody = function (_localctx) {
    let lang = null;
    for (let _i = 0, _a = _localctx.createfunc_opt_item(); _i < _a.length; _i++) {
        const coi = _a[_i];
        if (!!coi.LANGUAGE()) {
            if (!!coi.nonreservedword_or_sconst()) {
                if (!!coi.nonreservedword_or_sconst().nonreservedword()) {
                    if (!!coi.nonreservedword_or_sconst().nonreservedword().identifier()) {
                        if (!!coi.nonreservedword_or_sconst().nonreservedword().identifier().Identifier()) {
                            lang = coi.nonreservedword_or_sconst().nonreservedword().identifier().Identifier().getText();
                            break;
                        }
                    }
                }
            }
        }
    }
    if (!lang) {
        return;
    }
    // eslint-disable-next-line camelcase
    let func_as = null;
    for (let _b = 0, _c = _localctx.createfunc_opt_item(); _b < _c.length; _b++) {
        const a = _c[_b];
        if (!a.func_as()) {
            // eslint-disable-next-line camelcase
            func_as = a;
            break;
        }
    }
    // eslint-disable-next-line camelcase
    if (!!func_as) {
        const txt = this.GetRoutineBodyString(func_as.func_as().sconst(0));
        const line = func_as.func_as().sconst(0).start.getLine();
        const ph = this.getPostgreSQLParser(txt);
        switch (lang) {
            case 'plpgsql':
                func_as.func_as().Definition = ph.plsqlroot();
                break;
            case 'sql':
                func_as.func_as().Definition = ph.program();
                break;
        }
    }
};
PostgreSQLParserBase.prototype.TrimQuotes = function (s) {
    return (!s) ? s : s.substring(1, s.length() - 1);
};
PostgreSQLParserBase.prototype.unquote = function (s) {
    const slength = s.length();
    const r = '';
    let i = 0;
    while (i < slength) {
        const c = s.charAt(i);
        r.append(c);
        if (c === '\'' && i < slength - 1 && (s.charAt(i + 1) === '\'')) {
            i++;
        }
        i++;
    }
    return r.toString();
};
PostgreSQLParserBase.prototype.GetRoutineBodyString = function (rule) {
    const anysconst = rule.anysconst();
    const StringConstant = anysconst.StringConstant();
    if (!!StringConstant) {
        return this.unquote(this.TrimQuotes(StringConstant.getText()));
    }
    const UnicodeEscapeStringConstant = anysconst.UnicodeEscapeStringConstant();
    if (!!UnicodeEscapeStringConstant) {
        return this.TrimQuotes(UnicodeEscapeStringConstant.getText());
    }
    const EscapeStringConstant = anysconst.EscapeStringConstant();
    if (!!EscapeStringConstant) {
        return this.TrimQuotes(EscapeStringConstant.getText());
    }
    let result = '';
    const dollartext = anysconst.DollarText();
    for (let _i = 0, dollartext_1 = dollartext; _i < dollartext_1.length; _i++) {
        const s = dollartext_1[_i];
        result += s.getText();
    }
    return result;
};
PostgreSQLParserBase.getPostgreSQLParser = function (script) {
    const charStream = CharStreams.fromString(script);
    const lexer = new PostgreSQLLexer_1.PostgreSQLLexer(charStream);
    const tokens = new CommonTokenStream(lexer);
    const parser = new PostgreSQLParser_1.PostgreSQLParser(tokens);
    lexer.removeErrorListeners();
    parser.removeErrorListeners();
    //  LexerDispatchingErrorListener listener_lexer = new LexerDispatchingErrorListener((Lexer)(((CommonTokenStream)(this.getInputStream())).getTokenSource()));
    //   ParserDispatchingErrorListener listener_parser = new ParserDispatchingErrorListener(this);
    //   lexer.addErrorListener(listener_lexer);
    //  parser.addErrorListener(listener_parser);
    return parser;
};
exports.PostgreSQLParserBase = PostgreSQLParserBase;
//# sourceMappingURL=PostgreSQLParserBase.js.map