build: open ts strict check (#279)

* feat: no check lib dir

* feat: open strict check to src dir

* test: update test tsconfig.json

* feat: remove any type

* feat: do not export AbstractParseTreeVisitor

* feat: export StmtContextType as enum

* build: improve antlr4 script
This commit is contained in:
Hayden
2024-03-27 19:04:16 +08:00
committed by GitHub
parent bb0fad1dbe
commit c6615aecac
77 changed files with 439 additions and 349 deletions

View File

@ -19,7 +19,7 @@ describe('FlinkSQL benchmark tests', () => {
const reportData: string[] = [];
test('createTable Over 100 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('CreateTable Over 100 Rows', () => {
const [totalTimes, averageTimes] = benchmark('CreateTable Over 100 Rows', () => {
const testSQL = features.createTable[0];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -28,7 +28,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('createTable Over 1000 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('CreateTable Over 1000 Rows', () => {
const [totalTimes, averageTimes] = benchmark('CreateTable Over 1000 Rows', () => {
const testSQL = features.createTable[1];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -37,7 +37,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('createTable Over 5000 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('CreateTable Over 5000 Rows', () => {
const [totalTimes, averageTimes] = benchmark('CreateTable Over 5000 Rows', () => {
const testSQL = features.createTable[2];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -46,7 +46,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('selectTable Over 100 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('SelectTable Over 100 Rows', () => {
const [totalTimes, averageTimes] = benchmark('SelectTable Over 100 Rows', () => {
const testSQL = features.selectTable[0];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -55,7 +55,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('selectTable Over 1000 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('SelectTable Over 1000 Rows', () => {
const [totalTimes, averageTimes] = benchmark('SelectTable Over 1000 Rows', () => {
const testSQL = features.selectTable[1];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -64,7 +64,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('selectTable Over 5000 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('SelectTable Over 5000 Rows', () => {
const [totalTimes, averageTimes] = benchmark('SelectTable Over 5000 Rows', () => {
const testSQL = features.selectTable[2];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -73,7 +73,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('insertTable Over 100 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('InsertTable Over 100 Rows', () => {
const [totalTimes, averageTimes] = benchmark('InsertTable Over 100 Rows', () => {
const testSQL = features.insertTable[0];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -82,7 +82,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('insertTable Over 1000 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('InsertTable Over 1000 Rows', () => {
const [totalTimes, averageTimes] = benchmark('InsertTable Over 1000 Rows', () => {
const testSQL = features.insertTable[1];
const res = flink.validate(testSQL);
expect(res).toEqual([]);
@ -91,7 +91,7 @@ describe('FlinkSQL benchmark tests', () => {
});
test('insertTable Over 5000 Rows', async () => {
const [totalTimes, averageTimes, msg] = benchmark('InsertTable Over 5000 Rows', () => {
const [totalTimes, averageTimes] = benchmark('InsertTable Over 5000 Rows', () => {
const testSQL = features.insertTable[2];
const res = flink.validate(testSQL);
expect(res).toEqual([]);

View File

@ -1,4 +1,3 @@
import { ErrorNode, ParserRuleContext, TerminalNode } from 'antlr4ng';
import { FlinkSQL } from 'src/parser/flink';
import { FlinkSqlParserListener } from 'src/lib/flink/FlinkSqlParserListener';
import { TableExpressionContext } from 'src/lib/flink/FlinkSqlParser';
@ -11,20 +10,17 @@ describe('Flink SQL Listener Tests', () => {
const parseTree = flink.parse(sql);
test('Listener enterTableName', async () => {
let result = '';
class MyListener implements FlinkSqlParserListener {
enterTableExpression = (ctx: TableExpressionContext): void => {
result = ctx.getText().toLowerCase();
};
visitTerminal(node: TerminalNode): void {}
visitErrorNode(node: ErrorNode): void {}
enterEveryRule(node: ParserRuleContext): void {}
exitEveryRule(node: ParserRuleContext): void {}
}
const listenTableName = new MyListener();
class MyListener extends FlinkSqlParserListener {
result = '';
await flink.listen(listenTableName, parseTree);
expect(result).toBe(expectTableName);
enterTableExpression = (ctx: TableExpressionContext): void => {
this.result = ctx.getText().toLowerCase();
};
}
const listener = new MyListener();
flink.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
test('Split sql listener', async () => {

View File

@ -23,8 +23,6 @@ describe('Flink SQL Syntax Suggestion with collect entity', () => {
};
const sql = commentOtherLine(syntaxSql, pos.lineNumber);
const parseTree = flink.parse(sql);
const syntaxes = flink.getSuggestionAtCaretPosition(sql, pos)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === EntityContextType.COLUMN

View File

@ -1,7 +1,6 @@
import { FlinkSQL } from 'src/parser/flink';
import { FlinkSqlParserVisitor } from 'src/lib/flink/FlinkSqlParserVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ng';
import { TableExpressionContext } from 'src/lib/flink/FlinkSqlParser';
import { ProgramContext, TableExpressionContext } from 'src/lib/flink/FlinkSqlParser';
describe('Flink SQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -13,20 +12,22 @@ describe('Flink SQL Visitor Tests', () => {
});
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor
extends AbstractParseTreeVisitor<any>
implements FlinkSqlParserVisitor<any>
{
protected defaultResult() {
return result;
class MyVisitor extends FlinkSqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTableExpression(ctx: TableExpressionContext) {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx: ProgramContext) => {
return this.visitChildren(ctx);
};
visitTableExpression = (ctx: TableExpressionContext) => {
return ctx.getText().toLowerCase();
};
}
const visitor: any = new MyVisitor();
visitor.visit(parseTree);
const visitor = new MyVisitor();
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,6 +1,5 @@
import { ParseTreeListener } from 'antlr4ng';
import { HiveSQL } from 'src/parser/hive';
import { ProgramContext, SelectItemContext } from 'src/lib/hive/HiveSqlParser';
import { SelectItemContext } from 'src/lib/hive/HiveSqlParser';
import { HiveSqlParserListener } from 'src/lib/hive/HiveSqlParserListener';
describe('HiveSQL Listener Tests', () => {
@ -10,39 +9,33 @@ describe('HiveSQL Listener Tests', () => {
const sql = `select ${expectTableName} from tablename where inc_day='20190601' limit 1000;`;
const parseTree = hive.parse(sql);
let result = '';
class MyListener implements HiveSqlParserListener {
enterSelectItem(ctx: SelectItemContext) {
result = ctx.getText();
}
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
}
const listenTableName = new MyListener();
class MyListener extends HiveSqlParserListener {
result = '';
await hive.listen(listenTableName as ParseTreeListener, parseTree as ProgramContext);
expect(result).toBe(expectTableName);
enterSelectItem = (ctx: SelectItemContext) => {
this.result = ctx.getText();
};
}
const listener = new MyListener();
hive.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
test('Listener enterCreateTable', async () => {
const sql = `drop table table_name;`;
const parseTree = hive.parse(sql);
let result = '';
class MyListener implements HiveSqlParserListener {
enterDropTableStatement(ctx) {
result = ctx.getText();
}
class MyListener extends HiveSqlParserListener {
result = '';
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
enterDropTableStatement = (ctx) => {
this.result = ctx.getText();
};
}
const listenTableName = new MyListener();
const listener = new MyListener();
await hive.listen(listenTableName as ParseTreeListener, parseTree as ProgramContext);
expect(result).toBe('droptabletable_name');
hive.listen(listener, parseTree);
expect(listener.result).toBe('droptabletable_name');
});
test('Split sql listener', async () => {

View File

@ -1,5 +1,3 @@
import { AbstractParseTreeVisitor } from 'antlr4ng';
import { HiveSQL } from 'src/parser/hive';
import { HiveSqlParserVisitor } from 'src/lib/hive/HiveSqlParserVisitor';
import { ProgramContext, TableNameContext } from 'src/lib/hive/HiveSqlParser';
@ -14,19 +12,23 @@ describe('HiveSQL Visitor Tests', () => {
});
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends AbstractParseTreeVisitor<any> implements HiveSqlParserVisitor<any> {
defaultResult() {
return result;
class MyVisitor extends HiveSqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTableName(ctx: TableNameContext) {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx: ProgramContext) => {
return this.visitChildren(ctx);
};
visitTableName = (ctx: TableNameContext) => {
return ctx.getText().toLowerCase();
};
}
const visitor = new MyVisitor();
visitor.visit(parseTree as ProgramContext);
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,6 +1,5 @@
import { ImpalaSQL } from 'src/parser/impala';
import { ImpalaSqlParserListener } from 'src/lib/impala/ImpalaSqlParserListener';
import { ParseTreeListener } from 'antlr4ng';
describe('impala SQL Listener Tests', () => {
const expectTableName = 'user1';
@ -11,19 +10,14 @@ describe('impala SQL Listener Tests', () => {
test('Listener enterTableNamePath', async () => {
let result = '';
class MyListener implements ImpalaSqlParserListener {
class MyListener extends ImpalaSqlParserListener {
enterTableNamePath = (ctx): void => {
result = ctx.getText().toLowerCase();
};
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
}
const listenTableName = new MyListener();
const listener = new MyListener();
await impala.listen(listenTableName as ParseTreeListener, parseTree);
impala.listen(listener, parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,5 +1,4 @@
import { ImpalaSQL } from 'src/parser/impala';
import { AbstractParseTreeVisitor } from 'antlr4ng';
import { ImpalaSqlParserVisitor } from 'src/lib/impala/ImpalaSqlParserVisitor';
describe('impala SQL Visitor Tests', () => {
@ -12,20 +11,22 @@ describe('impala SQL Visitor Tests', () => {
});
test('Visitor visitTableNamePath', () => {
let result = '';
class MyVisitor
extends AbstractParseTreeVisitor<any>
implements ImpalaSqlParserVisitor<any>
{
protected defaultResult() {
return result;
class MyVisitor extends ImpalaSqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTableNamePath = (ctx): void => {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx) => {
return this.visitChildren(ctx);
};
visitTableNamePath = (ctx) => {
return ctx.getText().toLowerCase();
};
}
const visitor: any = new MyVisitor();
visitor.visit(parseTree);
const visitor = new MyVisitor();
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,6 +1,5 @@
import { MySQL } from 'src/parser/mysql';
import { MySqlParserListener } from 'src/lib/mysql/MySqlParserListener';
import { ParseTreeListener } from 'antlr4ng';
describe('MySQL Listener Tests', () => {
const expectTableName = 'user1';
@ -10,20 +9,17 @@ describe('MySQL Listener Tests', () => {
const parseTree = mysql.parse(sql);
test('Listener enterTableName', async () => {
let result = '';
class MyListener implements MySqlParserListener {
enterTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
};
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
}
const listenTableName: any = new MyListener();
class MyListener extends MySqlParserListener {
result = '';
await mysql.listen(listenTableName as ParseTreeListener, parseTree);
expect(result).toBe(expectTableName);
enterTableName = (ctx): void => {
this.result = ctx.getText().toLowerCase();
};
}
const listener = new MyListener();
mysql.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
test('Split sql listener', async () => {

View File

@ -1,6 +1,5 @@
import { MySQL } from 'src/parser/mysql';
import { MySqlParserVisitor } from 'src/lib/mysql/MySqlParserVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ng';
describe('MySQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -12,18 +11,22 @@ describe('MySQL Visitor Tests', () => {
});
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends AbstractParseTreeVisitor<any> implements MySqlParserVisitor<any> {
protected defaultResult() {
return result;
class MyVisitor extends MySqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx) => {
return this.visitChildren(ctx);
};
visitTableName = (ctx) => {
return ctx.getText().toLowerCase();
};
}
const visitor = new MyVisitor();
visitor.visit(parseTree);
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,5 +1,4 @@
import { PLSQL } from 'src/parser/plsql';
import { ParseTreeListener } from 'antlr4ng';
import { PlSqlParserListener } from 'src/lib/plsql/PlSqlParserListener';
describe('PLSQL Listener Tests', () => {
@ -10,19 +9,16 @@ describe('PLSQL Listener Tests', () => {
const parseTree = plsql.parse(sql);
test('Listener enterTableName', async () => {
let result = '';
class MyListener implements PlSqlParserListener {
enterTable_ref_list = (ctx): void => {
result = ctx.getText().toLowerCase();
};
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
}
const listenTableName = new MyListener();
class MyListener extends PlSqlParserListener {
result = '';
await plsql.listen(listenTableName as ParseTreeListener, parseTree);
expect(result).toBe(expectTableName);
enterTable_ref_list = (ctx) => {
this.result = ctx.getText().toLowerCase();
};
}
const listener = new MyListener();
plsql.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
});

View File

@ -1,5 +1,4 @@
import { PLSQL } from 'src/parser/plsql';
import { AbstractParseTreeVisitor } from 'antlr4ng';
import { PlSqlParserVisitor } from 'src/lib/plsql/PlSqlParserVisitor';
describe('PLSQL Visitor Tests', () => {
@ -10,17 +9,22 @@ describe('PLSQL Visitor Tests', () => {
const parseTree = plsql.parse(sql);
test('Visitor visitTable_ref_list', () => {
let result = '';
class MyVisitor extends AbstractParseTreeVisitor<any> implements PlSqlParserVisitor<any> {
protected defaultResult() {
return result;
class MyVisitor extends PlSqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTable_ref_list = (ctx): void => {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx) => {
return this.visitChildren(ctx);
};
visitTable_ref_list = (ctx) => {
return ctx.getText().toLowerCase();
};
}
const visitor: any = new MyVisitor();
visitor.visit(parseTree);
const visitor = new MyVisitor();
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,6 +1,5 @@
import { PostgreSQL } from 'src/parser/postgresql';
import { PostgreSqlParserListener } from 'src/lib/postgresql/PostgreSqlParserListener';
import { ParseTreeListener } from 'antlr4ng';
describe('PostgreSQL Listener Tests', () => {
const expectTableName = 'user1';
@ -10,20 +9,16 @@ describe('PostgreSQL Listener Tests', () => {
const parseTree = postgresql.parse(sql);
test('Listener enterTableName', async () => {
let result = '';
class MyListener implements PostgreSqlParserListener {
enterTable_ref(ctx) {
result = ctx.getText().toLowerCase();
}
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
class MyListener extends PostgreSqlParserListener {
result = '';
enterTable_ref = (ctx) => {
this.result = ctx.getText().toLowerCase();
};
}
const listenTableName = new MyListener();
const listener = new MyListener();
await postgresql.listen(listenTableName as ParseTreeListener, parseTree);
expect(result).toBe(expectTableName);
postgresql.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
test('Split sql listener', async () => {

View File

@ -1,5 +1,4 @@
import { PostgreSQL } from 'src/parser/postgresql';
import { AbstractParseTreeVisitor } from 'antlr4ng';
import { PostgreSqlParserVisitor } from 'src/lib/postgresql/PostgreSqlParserVisitor';
describe('MySQL Visitor Tests', () => {
@ -12,21 +11,22 @@ describe('MySQL Visitor Tests', () => {
});
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor
extends AbstractParseTreeVisitor<any>
implements PostgreSqlParserVisitor<any>
{
protected defaultResult() {
return result;
class MyVisitor extends PostgreSqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTable_ref(ctx) {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx) => {
return this.visitChildren(ctx);
};
visitTable_ref = (ctx) => {
return ctx.getText().toLowerCase();
};
}
const visitor: any = new MyVisitor();
visitor.visit(parseTree);
const visitor = new MyVisitor();
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});

View File

@ -1,6 +1,5 @@
import { SparkSQL } from 'src/parser/spark';
import { SparkSqlParserListener } from 'src/lib/spark/SparkSqlParserListener';
import { ParseTreeListener } from 'antlr4ng';
describe('Spark SQL Listener Tests', () => {
const expectTableName = 'user1';
@ -10,20 +9,16 @@ describe('Spark SQL Listener Tests', () => {
const parseTree = spark.parse(sql);
test('Listener exitTableName', () => {
let result = '';
class MyListener implements SparkSqlParserListener {
class MyListener extends SparkSqlParserListener {
result = '';
exitTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
this.result = ctx.getText().toLowerCase();
};
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
}
const listenTableName = new MyListener();
const listener = new MyListener();
spark.listen(listenTableName as ParseTreeListener, parseTree);
expect(result).toBe(expectTableName);
spark.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
test('Split sql listener', async () => {

View File

@ -1,6 +1,5 @@
import { SparkSQL } from 'src/parser/spark';
import { SparkSqlParserVisitor } from 'src/lib/spark/SparkSqlParserVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ng';
describe('Spark SQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -12,21 +11,23 @@ describe('Spark SQL Visitor Tests', () => {
});
test('Visitor visitTableName', () => {
class MyVisitor
extends AbstractParseTreeVisitor<any>
implements SparkSqlParserVisitor<any>
{
result: string = '';
protected defaultResult() {
return this.result;
class MyVisitor extends SparkSqlParserVisitor<string> {
defaultResult(): string {
return '';
}
visitTableName = (ctx): void => {
this.result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx) => {
return this.visitChildren(ctx);
};
visitTableName = (ctx) => {
return ctx.getText().toLowerCase();
};
}
const visitor = new MyVisitor();
visitor.visit(parseTree);
const result = visitor.visit(parseTree);
expect(visitor.result).toBe(expectTableName);
expect(result).toBe(expectTableName);
});
});

View File

@ -1,6 +1,5 @@
import { TrinoSQL } from 'src/parser/trino';
import { TrinoSqlListener } from 'src/lib/trino/TrinoSqlListener';
import { ParseTreeListener } from 'antlr4ng';
describe('trino SQL Listener Tests', () => {
const expectTableName = 'user1';
@ -10,20 +9,16 @@ describe('trino SQL Listener Tests', () => {
const parseTree = trino.parse(sql);
test('Listener enterTableName', async () => {
let result = '';
class MyListener implements TrinoSqlListener {
class MyListener extends TrinoSqlListener {
result = '';
enterTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
this.result = ctx.getText().toLowerCase();
};
visitTerminal() {}
visitErrorNode() {}
enterEveryRule() {}
exitEveryRule() {}
}
const listenTableName = new MyListener();
const listener = new MyListener();
await trino.listen(listenTableName as ParseTreeListener, parseTree);
expect(result).toBe(expectTableName);
trino.listen(listener, parseTree);
expect(listener.result).toBe(expectTableName);
});
test('Split sql listener', async () => {

View File

@ -1,6 +1,5 @@
import { TrinoSQL } from 'src/parser/trino';
import { TrinoSqlVisitor } from 'src/lib/trino/TrinoSqlVisitor';
import { AbstractParseTreeVisitor } from 'antlr4ng';
describe('trino SQL Visitor Tests', () => {
const expectTableName = 'user1';
@ -12,17 +11,22 @@ describe('trino SQL Visitor Tests', () => {
});
test('Visitor visitTableName', () => {
let result = '';
class MyVisitor extends AbstractParseTreeVisitor<any> implements TrinoSqlVisitor<any> {
protected defaultResult() {
return result;
class MyVisitor extends TrinoSqlVisitor<string> {
defaultResult(): string {
return '';
}
visitTableName = (ctx): void => {
result = ctx.getText().toLowerCase();
aggregateResult(aggregate: string, nextResult: string): string {
return aggregate + nextResult;
}
visitProgram = (ctx) => {
return this.visitChildren(ctx);
};
visitTableName = (ctx) => {
return ctx.getText().toLowerCase();
};
}
const visitor: any = new MyVisitor();
visitor.visit(parseTree);
const visitor = new MyVisitor();
const result = visitor.visit(parseTree);
expect(result).toBe(expectTableName);
});