import * as vscode from "vscode"; import { editorToSuggestions, editorSuggestionsLocked } from "../suggestions"; class SuggestionsCodeLensProvider implements vscode.CodeLensProvider { public provideCodeLenses( document: vscode.TextDocument, token: vscode.CancellationToken ): vscode.CodeLens[] | Thenable { const suggestions = editorToSuggestions.get(document.uri.toString()); if (!suggestions) { return []; } const locked = editorSuggestionsLocked.get(document.uri.fsPath.toString()); const codeLenses: vscode.CodeLens[] = []; for (const suggestion of suggestions) { const range = new vscode.Range( suggestion.oldRange.start, suggestion.newRange.end ); codeLenses.push( new vscode.CodeLens(range, { title: "Accept ✅", command: "continue.acceptSuggestion", arguments: [suggestion], }), new vscode.CodeLens(range, { title: "Reject ❌", command: "continue.rejectSuggestion", arguments: [suggestion], }) ); if (codeLenses.length === 2) { codeLenses.push( new vscode.CodeLens(range, { title: "(⌘⇧↩/⌘⇧⌫ to accept/reject all)", command: "", }) ); } } return codeLenses; } onDidChangeCodeLenses?: vscode.Event | undefined; constructor(emitter?: vscode.EventEmitter) { if (emitter) { this.onDidChangeCodeLenses = emitter.event; this.onDidChangeCodeLenses(() => { if (vscode.window.activeTextEditor) { this.provideCodeLenses( vscode.window.activeTextEditor.document, new vscode.CancellationTokenSource().token ); } }); } } } let suggestionsCodeLensDisposable: vscode.Disposable | undefined = undefined; export function registerAllCodeLensProviders(context: vscode.ExtensionContext) { if (suggestionsCodeLensDisposable) { suggestionsCodeLensDisposable.dispose(); } suggestionsCodeLensDisposable = vscode.languages.registerCodeLensProvider( "*", new SuggestionsCodeLensProvider() ); context.subscriptions.push(suggestionsCodeLensDisposable); }