35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import { Token } from 'antlr4ts';
|
|
import { CaretPosition } from '../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;
|
|
}
|