Skip to content

Commit 5493578

Browse files
committed
Make error listeners configurable
1 parent 4b3298f commit 5493578

3 files changed

Lines changed: 51 additions & 6 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "antlr4ts-sql",
3-
"version": "1.0.2",
3+
"version": "1.0.3",
44
"description": "Pre-built ANTL4 lexers and parsers for SQL: PostgreSQL, MySQL, SQL Server and Oracle (PL/SQL)",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/antlr4tsSQL.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CommonTokenStream, ANTLRInputStream, Parser } from "antlr4ts";
1+
import { CommonTokenStream, ANTLRInputStream, Parser, ANTLRErrorListener, ConsoleErrorListener, Lexer } from "antlr4ts";
22
import { ParseTree } from "antlr4ts/tree/ParseTree";
33
import { CaseChangingStream } from "./models/CaseChangingStream";
44
import { SQLDialect } from "./models/SQLDialect";
@@ -19,10 +19,10 @@ export class antlr4tsSQL {
1919
this.dialect = dialect;
2020
}
2121

22-
getTokens(sqlScript: string): CommonTokenStream {
22+
getTokens(sqlScript: string, errorListeners?: ANTLRErrorListener<any>[]): CommonTokenStream {
2323
const chars = new ANTLRInputStream(sqlScript);
2424
const caseChangingCharStream = new CaseChangingStream(chars, true);
25-
let lexer = null;
25+
let lexer: Lexer = null;
2626
if (this.dialect === SQLDialect.TSQL) {
2727
lexer = new TSqlLexer(caseChangingCharStream);
2828
} else if (this.dialect === SQLDialect.PLSQL) {
@@ -32,12 +32,18 @@ export class antlr4tsSQL {
3232
} else if (this.dialect === SQLDialect.MYSQL) {
3333
lexer = new MySQLLexer(chars);
3434
}
35+
if (errorListeners !== null && errorListeners !== undefined) {
36+
lexer.removeErrorListener(ConsoleErrorListener.INSTANCE);
37+
for (const listener of errorListeners) {
38+
lexer.addErrorListener(listener);
39+
}
40+
}
3541
const tokens = new CommonTokenStream(lexer);
3642
return tokens;
3743
}
3844

39-
getParser(tokens: CommonTokenStream): Parser {
40-
let parser = null;
45+
getParser(tokens: CommonTokenStream, errorListeners?: ANTLRErrorListener<any>[]): Parser {
46+
let parser: Parser = null;
4147
if (this.dialect === SQLDialect.TSQL) {
4248
parser = new TSqlParser(tokens);
4349
} else if (this.dialect === SQLDialect.PLSQL) {
@@ -47,6 +53,12 @@ export class antlr4tsSQL {
4753
} else if (this.dialect === SQLDialect.MYSQL) {
4854
parser = new MultiQueryMySQLParser(tokens);
4955
}
56+
if (errorListeners !== null && errorListeners !== undefined) {
57+
parser.removeErrorListener(ConsoleErrorListener.INSTANCE);
58+
for (const listener of errorListeners) {
59+
parser.addErrorListener(listener);
60+
}
61+
}
5062
return parser;
5163
}
5264

test/common.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { antlr4tsSQL, ConsoleErrorListener, DiagnosticErrorListener, ProxyParserErrorListener, SQLDialect } from '../dist/index';
2+
3+
let antlr4tssql = null;
4+
beforeAll(() => {
5+
antlr4tssql = new antlr4tsSQL(SQLDialect.MYSQL);
6+
});
7+
8+
test('can customize error listeners', () => {
9+
const query = 'SELECT * FROM table1';
10+
let tokens = antlr4tssql.getTokens(query);
11+
expect(tokens._tokenSource._listeners.length).toBe(1);
12+
expect(tokens._tokenSource._listeners[0] instanceof ConsoleErrorListener).toBeTruthy();
13+
14+
let parser = antlr4tssql.getParser(tokens);
15+
expect(parser._listeners.length).toBe(1);
16+
expect(parser._listeners[0] instanceof ConsoleErrorListener).toBeTruthy();
17+
18+
tokens = antlr4tssql.getTokens(query, []);
19+
expect(tokens._tokenSource._listeners.length).toBe(0);
20+
21+
parser = antlr4tssql.getParser(tokens, []);
22+
expect(parser._listeners.length).toBe(0);
23+
24+
tokens = antlr4tssql.getTokens(query, [ConsoleErrorListener.INSTANCE, new DiagnosticErrorListener()]);
25+
expect(tokens._tokenSource._listeners.length).toBe(2);
26+
expect(tokens._tokenSource._listeners[0] instanceof ConsoleErrorListener).toBeTruthy();
27+
expect(tokens._tokenSource._listeners[1] instanceof DiagnosticErrorListener).toBeTruthy();
28+
29+
parser = antlr4tssql.getParser(tokens, [ConsoleErrorListener.INSTANCE, new DiagnosticErrorListener()]);
30+
expect(parser._listeners.length).toBe(2);
31+
expect(parser._listeners[0] instanceof ConsoleErrorListener).toBeTruthy();
32+
expect(parser._listeners[1] instanceof DiagnosticErrorListener).toBeTruthy();
33+
});

0 commit comments

Comments
 (0)