Skip to content

Commit 0511ac6

Browse files
committed
* Apply select quick fixes at the end of
- Inline Code Completion - Refactor edits * Only quick fixes associated with an "import" action will be applied * Tested with vscode [Auto Import Plugin](https://marketplace.visualstudio.com/items?itemName=steoates.autoimport)
1 parent cc9f7ef commit 0511ac6

File tree

4 files changed

+46
-10
lines changed

4 files changed

+46
-10
lines changed

clients/vscode/src/CodeAction.ts

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import { ContextVariables } from "./ContextVariables";
1313
export class CodeActionProvider implements CodeActionProviderInterface {
1414
constructor(private readonly contextVariables: ContextVariables) {}
1515

16+
public static readonly providedCodeActionKinds = [
17+
CodeActionKind.RefactorRewrite
18+
];
19+
1620
provideCodeActions(
1721
_document: TextDocument,
1822
_range: Range | Selection,

clients/vscode/src/Commands.ts

+36-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import {
1111
ProgressLocation,
1212
ThemeIcon,
1313
QuickPickItem,
14+
CodeActionKind,
15+
CodeAction,
16+
Range,
1417
} from "vscode";
1518
import os from "os";
1619
import path from "path";
@@ -25,6 +28,8 @@ import CommandPalette from "./CommandPalette";
2528
import { showOutputPanel } from "./logger";
2629
import { Issues } from "./Issues";
2730
import { InlineEditController } from "./inline-edit";
31+
import { getLogger } from "./logger";
32+
2833

2934
export class Commands {
3035
private chatEditCancellationTokenSource: CancellationTokenSource | null = null;
@@ -218,8 +223,16 @@ export class Commands {
218223
"inlineCompletion.trigger": () => {
219224
commands.executeCommand("editor.action.inlineSuggest.trigger");
220225
},
221-
"inlineCompletion.accept": () => {
222-
commands.executeCommand("editor.action.inlineSuggest.commit");
226+
"inlineCompletion.accept": async () => {
227+
const editor = window.activeTextEditor;
228+
if (!editor) {
229+
return;
230+
}
231+
const uri = editor.document.uri;
232+
const range = new Range(editor.selection.start.line, 0, editor.selection.end.line + 1, 0);
233+
await commands.executeCommand("editor.action.inlineSuggest.commit");
234+
await applyQuickFixes(uri, range)
235+
223236
},
224237
"inlineCompletion.acceptNextWord": () => {
225238
this.inlineCompletionProvider.handleEvent("accept_word");
@@ -312,12 +325,10 @@ export class Commands {
312325
}
313326
const location = {
314327
uri: editor.document.uri.toString(),
315-
range: {
316-
start: { line: editor.selection.start.line, character: 0 },
317-
end: { line: editor.selection.end.line + 1, character: 0 },
318-
},
328+
range: new Range(editor.selection.start.line, 0, editor.selection.end.line + 1, 0),
319329
};
320330
await this.client.chat.resolveEdit({ location, action: "accept" });
331+
await applyQuickFixes(editor.document.uri, location.range);
321332
},
322333
"chat.edit.discard": async () => {
323334
const editor = window.activeTextEditor;
@@ -429,3 +440,22 @@ export class Commands {
429440
},
430441
};
431442
}
443+
444+
async function applyQuickFixes(uri: Uri, range: Range): Promise<void> {
445+
const codeActions = await commands.executeCommand<CodeAction[]>("vscode.executeCodeActionProvider", uri, range);
446+
const quickFixActions = codeActions.filter(action => action.kind && action.kind.contains(CodeActionKind.QuickFix) && action.title.toLowerCase().includes('import'));
447+
quickFixActions.forEach( async (action) => {
448+
try {
449+
getLogger().info(`Applying CodeActions for ${action.title}.`)
450+
if (action.edit) {
451+
await workspace.applyEdit(action.edit);
452+
}
453+
if (action.command) {
454+
await commands.executeCommand(action.command.command, action.command.arguments);
455+
}
456+
} catch (error) {
457+
getLogger().error(`Exception when apply CodeActions for ${action.title}`);
458+
// ignore the error
459+
}
460+
});
461+
}

clients/vscode/src/extension.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ let client: Client | undefined = undefined;
2121

2222
export async function activate(context: ExtensionContext) {
2323
logger.info("Activating Tabby extension...");
24+
2425
const clientOptions: LanguageClientOptions = {
2526
documentSelector: [
2627
{ scheme: "file" },
@@ -57,7 +58,7 @@ export async function activate(context: ExtensionContext) {
5758
client.registerConfigManager(config);
5859
client.registerInlineCompletionProvider(inlineCompletionProvider);
5960
client.registerGitProvider(gitProvider);
60-
client.registerCodeActionProvider(new CodeActionProvider(contextVariables));
61+
client.registerCodeActionProvider(new CodeActionProvider(contextVariables), CodeActionProvider.providedCodeActionKinds);
6162

6263
// Register config callback for past ServerConfig
6364
client.agent.addListener("didChangeStatus", async (status: Status) => {

clients/vscode/src/lsp/Client.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CodeActionProvider, ExtensionContext, languages } from "vscode";
1+
import { CodeActionKind, CodeActionProvider, ExtensionContext, languages } from "vscode";
22
import { BaseLanguageClient } from "vscode-languageclient";
33
import { AgentFeature } from "./AgentFeature";
44
import { ChatFeature } from "./ChatFeature";
@@ -74,7 +74,8 @@ export class Client {
7474
const feature = new GitProviderFeature(this.languageClient, provider);
7575
this.languageClient.registerFeature(feature);
7676
}
77-
registerCodeActionProvider(provider: CodeActionProvider) {
78-
this.context.subscriptions.push(languages.registerCodeActionsProvider("*", provider));
77+
registerCodeActionProvider(provider: CodeActionProvider, kind: CodeActionKind[]) {
78+
this.context.subscriptions.push(
79+
languages.registerCodeActionsProvider("*", provider, {providedCodeActionKinds: kind}));
7980
}
8081
}

0 commit comments

Comments
 (0)