@@ -73,48 +73,52 @@ function updateFeatureStatus() {
7373
7474 if ( vscode . workspace . getConfiguration ( 'flink-sql-grammar-check' ) . get ( 'enable' ) ) {
7575 // 创建诊断集合,用于报告语法错误和警告
76- const diagnosticCollection = vscode . languages . createDiagnosticCollection ( 'flink-sql' ) ;
76+ const diagnosticCollection = vscode . languages . createDiagnosticCollection ( selector ) ;
7777
7878 // 监听文件更改事件
7979 vscode . workspace . onDidChangeTextDocument ( ( event : vscode . TextDocumentChangeEvent ) => {
8080 // 检查文件是否为Flink SQL文件
81- if ( event . document . languageId === 'flink-sql' ) {
82- // 清除之前的诊断信息
83- diagnosticCollection . clear ( ) ;
84-
85- // 使用生成的词法分析器和解析器进行语法检查
86- const inputStream = new ANTLRInputStream ( event . document . getText ( ) ) ;
87- const lexer = new FlinkSQLLexer ( inputStream ) ;
88- const tokenStream = new CommonTokenStream ( lexer ) ;
89- const parser = new FlinkSQLParser ( tokenStream ) ;
90- parser . removeErrorListeners ( ) ;
91- parser . addErrorListener ( {
92- syntaxError : ( recognizer : Recognizer < any , any > , offendingSymbol : any , line : number , charPositionInLine : number , msg : string , e : RecognitionException | undefined ) : void => {
93- vscode . window . showInformationMessage ( "parser error: line " + line + " position: " + charPositionInLine + " msg: " + msg ) ;
94- } ,
95- } )
96- parser . compileParseTreePattern
97- // 解析文件内容并获取语法树
98- const parseTree = parser . program ( ) ;
99-
100- // 创建访问器实例并访问语法树,以获取语法错误和警告
101- const visitor = new MyFlinkSqlVisitor ( ) ;
102- visitor . visit ( parseTree ) ;
103- const errors = visitor . getErrors ( ) ;
104- console . log ( "visitor errors: " + errors ) ;
105- // 使用VSCode的诊断API报告语法错误和警告
106- const diagnostics : vscode . Diagnostic [ ] = errors . map ( error => {
107- const range = new vscode . Range (
108-
109- event . document . positionAt ( error . getStartIndex ( ) ) ,
110- event . document . positionAt ( error . getStopIndex ( ) + 1 )
111- ) ;
112- const diagnostic = new vscode . Diagnostic ( range , error . message , vscode . DiagnosticSeverity . Error ) ;
113- return diagnostic ;
114- } ) ;
115-
116- diagnosticCollection . set ( event . document . uri , diagnostics ) ;
81+ if ( event . document . languageId !== selector ) {
82+ return ;
11783 }
84+ // 清除之前的诊断信息
85+ diagnosticCollection . clear ( ) ;
86+
87+ // 使用生成的词法分析器和解析器进行语法检查
88+ const inputStream = new ANTLRInputStream ( event . document . getText ( ) ) ;
89+ const lexer = new FlinkSQLLexer ( inputStream ) ;
90+ const tokenStream = new CommonTokenStream ( lexer ) ;
91+ const parser = new FlinkSQLParser ( tokenStream ) ;
92+ parser . removeErrorListeners ( ) ;
93+ parser . addErrorListener ( {
94+ syntaxError : ( recognizer : Recognizer < any , any > , offendingSymbol : any , line : number , charPositionInLine : number , msg : string , e : RecognitionException | undefined ) : void => {
95+ vscode . window . showErrorMessage ( "Parser flink sql error. line: " + line + " position: " + charPositionInLine + " msg: " + msg ) ;
96+ } ,
97+ } )
98+ parser . compileParseTreePattern
99+ // 解析文件内容并获取语法树
100+ const parseTree = parser . program ( ) ;
101+
102+ // 创建访问器实例并访问语法树,以获取语法错误和警告
103+ const visitor = new MyFlinkSqlVisitor ( ) ;
104+ visitor . visit ( parseTree ) ;
105+ const errors = visitor . getErrors ( ) ;
106+ errors . forEach ( error => {
107+ vscode . window . showInformationMessage ( "Visitor flink sql error. error: " + error ) ;
108+ } )
109+
110+ // 使用VSCode的诊断API报告语法错误和警告
111+ // const diagnostics: vscode.Diagnostic[] = errors.map(error => {
112+ // const range = new vscode.Range(
113+ // event.document.positionAt(error.getStartIndex()),
114+ // event.document.positionAt(error.getStopIndex() + 1)
115+ // );
116+ // const diagnostic = new vscode.Diagnostic(range, error.message, vscode.DiagnosticSeverity.Error);
117+ // return diagnostic;
118+ // });
119+
120+ // diagnosticCollection.set(event.document.uri, diagnostics);
121+
118122 } ) ;
119123 }
120124}
0 commit comments