equicord-companion
Version:
Equicord Companion is a vscode extension to test Equicord patches & webpack finds right from the comfort of your IDE
79 lines (66 loc) • 1.97 kB
text/typescript
/* eslint-disable */
// MIT
// https://github.com/dsherret/ts-ast-viewer/blob/main/src/utils/createLineNumberAndColumns.ts
interface LineNumberAndColumn {
pos: number;
number: number;
length: number;
}
function createLineNumberAndColumns(text: string) {
const lineInfos: LineNumberAndColumn[] = [];
let lastPos = 0;
for (let i = 0; i < text.length; i++) {
if (text[i] === "\n") {
pushLineInfo(i);
}
}
pushLineInfo(text.length);
return lineInfos;
function pushLineInfo(pos: number) {
lineInfos.push({
pos: lastPos,
length: pos - lastPos,
number: lineInfos.length + 1,
});
lastPos = pos + 1;
}
}
export function getNumberAndColumnFromPos(text: string, pos: number) {
const lineInfos = createLineNumberAndColumns(text);
if (pos < 0) {
return { lineNumber: 1, column: 1 };
}
const index = binarySearch(lineInfos, info => {
if (pos < info.pos) {
return -1;
}
if (pos >= info.pos && pos < info.pos + info.length + 1) { // `+ 1` is for newline char
return 0;
}
return 1;
});
const lineInfo = index >= 0 ? lineInfos[index] : lineInfos[lineInfos.length - 1];
if (lineInfo == null) {
return { lineNumber: 1, column: 1 };
}
return { lineNumber: lineInfo.number, column: Math.min(pos - lineInfo.pos + 1, lineInfo.length + 1) };
}
function binarySearch<T>(
items: ReadonlyArray<T>,
compareTo: (value: T) => number,
) {
let top = items.length - 1;
let bottom = 0;
while (bottom <= top) {
const mid = Math.floor((top + bottom) / 2);
const comparisonResult = compareTo(items[mid]);
if (comparisonResult === 0) {
return mid;
} else if (comparisonResult < 0) {
top = mid - 1;
} else {
bottom = mid + 1;
}
}
return -1;
}