in src/extension.ts [239:324]
export default async function highlightStackAttributions(): Promise<void> {
const document = vscode.window.activeTextEditor?.document
if (!document) return;
const config = vscode.workspace.getConfiguration("llm");
const attributionWindowSize = config.get("attributionWindowSize") as number;
const attributionEndpoint = config.get("attributionEndpoint") as string;
// get cursor postion and offset
const cursorPosition = vscode.window.activeTextEditor?.selection.active;
if (!cursorPosition) return;
const cursorOffset = document.offsetAt(cursorPosition);
const start = Math.max(0, cursorOffset - attributionWindowSize);
const end = Math.min(document.getText().length, cursorOffset + attributionWindowSize);
// Select the start to end span
if (!vscode.window.activeTextEditor) return;
vscode.window.activeTextEditor.selection = new vscode.Selection(document.positionAt(start), document.positionAt(end));
// new Range(document.positionAt(start), document.positionAt(end));
const text = document.getText();
const textAroundCursor = text.slice(start, end);
const body = { document: textAroundCursor };
// notify user request has started
void vscode.window.showInformationMessage("Searching for nearby code in the stack...");
const resp = await fetch(attributionEndpoint, {
method: "POST",
body: JSON.stringify(body),
headers: { "Content-Type": "application/json" },
});
if (!resp.ok) {
return;
}
const json = await resp.json() as any as { spans: [number, number][] }
const { spans } = json
if (spans.length === 0) {
void vscode.window.showInformationMessage("No code found in the stack");
return;
}
void vscode.window.showInformationMessage("Highlighted code was found in the stack.",
"Go to stack search"
).then(clicked => {
if (clicked) {
// open stack search url in browser
void vscode.env.openExternal(vscode.Uri.parse("https://huggingface.co/spaces/bigcode/search"));
}
});
// combine overlapping spans
const combinedSpans: [number, number][] = spans.reduce((acc, span) => {
const [s, e] = span;
if (acc.length === 0) return [[s, e]];
const [lastStart, lastEnd] = acc[acc.length - 1];
if (s <= lastEnd) {
acc[acc.length - 1] = [lastStart, Math.max(lastEnd, e)];
} else {
acc.push([s, e]);
}
return acc;
}, [] as [number, number][]);
const decorations = combinedSpans.map(([startChar, endChar]) => ({ range: new vscode.Range(document.positionAt(startChar + start), document.positionAt(endChar + start)), hoverMessage: "This code might be in the stack!" }))
// console.log("Highlighting", decorations.map(d => [d.range.start, d.range.end]));
const decorationType = vscode.window.createTextEditorDecorationType({
color: 'red',
textDecoration: 'underline',
});
vscode.window.activeTextEditor?.setDecorations(decorationType, decorations);
setTimeout(() => {
vscode.window.activeTextEditor?.setDecorations(decorationType, []);
}, 5000);
}