feat: FlinkSQL supports auto complete (#115)
* feat: add antlr4-c3 dependencies * feat: distinguish table, catalog and database from uid * feat: move semicolon from sqlStatements to sqlStatement * chore: move antlr4ts-cli to devDependencies * feat: improve basic parser and support suggestions of token and syntax * feat: implement suggest method in sql parsers * test: flink sql suggestion test cases * feat: optimize ts defination of suggestion * feat: add split listener and optimize performance of auto-completion * test: supplementary flink suggestion unit tests
This commit is contained in:
33
src/utils/findCaretTokenIndex.ts
Normal file
33
src/utils/findCaretTokenIndex.ts
Normal file
@ -0,0 +1,33 @@
|
||||
import { Token } from "antlr4ts";
|
||||
import { CaretPosition } from "../../src/parser/common/basic-parser-types";
|
||||
|
||||
/**
|
||||
* find token index via caret position (cursor position)
|
||||
* @param caretPosition
|
||||
* @param allTokens all the tokens
|
||||
* @returns caretTokenIndex
|
||||
*/
|
||||
export function findCaretTokenIndex(caretPosition: CaretPosition, allTokens: Token[]) {
|
||||
const { lineNumber: caretLine, column: caretCol } = caretPosition;
|
||||
let left = 0;
|
||||
let right = allTokens.length - 1;
|
||||
|
||||
while(left <= right) {
|
||||
const mid = left + ((right - left) >> 1);
|
||||
const token = allTokens[mid];
|
||||
if (token.line > caretLine || (
|
||||
token.line === caretLine
|
||||
&& token.charPositionInLine + 1 >= caretCol
|
||||
)) {
|
||||
right = mid - 1;
|
||||
} else if (token.line < caretLine || (
|
||||
token.line === caretLine
|
||||
&& token.charPositionInLine + token.text.length + 1 < caretCol
|
||||
)) {
|
||||
left = mid + 1;
|
||||
} else {
|
||||
return allTokens[mid].tokenIndex
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
Reference in New Issue
Block a user