提交 c0cb5cd5 编写于 作者: M Matt Bierner

Defer quick fix all ts call

Fixes #42764
上级 ae07ba0b
......@@ -32,6 +32,49 @@ class ApplyCodeActionCommand implements Command {
}
}
class ApplyFixAllCodeAction implements Command {
public static readonly ID = '_typescript.applyFixAllCodeAction';
public readonly id = ApplyFixAllCodeAction.ID;
constructor(
private readonly client: ITypeScriptServiceClient
) { }
public async execute(
file: string,
tsAction: Proto.CodeFixAction,
): Promise<void> {
if (!tsAction.fixId) {
return;
}
const args: Proto.GetCombinedCodeFixRequestArgs = {
scope: {
type: 'file',
args: { file }
},
fixId: tsAction.fixId
};
try {
const combinedCodeFixesResponse = await this.client.execute('getCombinedCodeFix', args);
if (!combinedCodeFixesResponse.body) {
return;
}
const edit = createWorkspaceEditFromFileCodeEdits(this.client, combinedCodeFixesResponse.body.changes);
await vscode.workspace.applyEdit(edit);
if (combinedCodeFixesResponse.command) {
await vscode.commands.executeCommand(ApplyCodeActionCommand.ID, combinedCodeFixesResponse.command);
}
} catch {
// noop
}
}
}
class SupportedCodeActionProvider {
private _supportedCodeActions?: Thenable<Set<number>>;
......@@ -66,6 +109,8 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv
private readonly diagnosticsManager: DiagnosticsManager
) {
commandManager.register(new ApplyCodeActionCommand(client));
commandManager.register(new ApplyFixAllCodeAction(client));
this.supportedCodeActionProvider = new SupportedCodeActionProvider(client);
}
......@@ -112,7 +157,7 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv
if (codeFixesResponse.body) {
const results: vscode.CodeAction[] = [];
for (const tsCodeFix of codeFixesResponse.body) {
results.push(...await this.getAllFixesForTsCodeAction(document, file, diagnostic, tsCodeFix, token));
results.push(...await this.getAllFixesForTsCodeAction(document, file, diagnostic, tsCodeFix));
}
return results;
}
......@@ -123,11 +168,10 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv
document: vscode.TextDocument,
file: string,
diagnostic: vscode.Diagnostic,
tsAction: Proto.CodeFixAction,
token: vscode.CancellationToken
tsAction: Proto.CodeFixAction
): Promise<Iterable<vscode.CodeAction>> {
const singleFix = this.getSingleFixForTsCodeAction(diagnostic, tsAction);
const fixAll = await this.getFixAllForTsCodeAction(document, file, diagnostic, tsAction, token);
const fixAll = await this.getFixAllForTsCodeAction(document, file, diagnostic, tsAction);
return fixAll ? [singleFix, fixAll] : [singleFix];
}
......@@ -153,7 +197,6 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv
file: string,
diagnostic: vscode.Diagnostic,
tsAction: Proto.CodeFixAction,
token: vscode.CancellationToken
): Promise<vscode.CodeAction | undefined> {
if (!tsAction.fixId || !this.client.apiVersion.has270Features()) {
return undefined;
......@@ -164,35 +207,16 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv
return;
}
const args: Proto.GetCombinedCodeFixRequestArgs = {
scope: {
type: 'file',
args: { file }
},
fixId: tsAction.fixId
};
try {
const combinedCodeFixesResponse = await this.client.execute('getCombinedCodeFix', args, token);
if (!combinedCodeFixesResponse.body) {
return undefined;
}
const action = new vscode.CodeAction(
localize('fixAllInFileLabel', '{0} (Fix all in file)', tsAction.description),
vscode.CodeActionKind.QuickFix);
action.diagnostics = [diagnostic];
const codeAction = new vscode.CodeAction(
localize('fixAllInFileLabel', '{0} (Fix all in file)', tsAction.description),
vscode.CodeActionKind.QuickFix);
codeAction.edit = createWorkspaceEditFromFileCodeEdits(this.client, combinedCodeFixesResponse.body.changes);
codeAction.diagnostics = [diagnostic];
if (tsAction.commands) {
codeAction.command = {
command: ApplyCodeActionCommand.ID,
arguments: [tsAction],
title: tsAction.description
};
}
return codeAction;
} catch {
return undefined;
}
action.command = {
command: ApplyFixAllCodeAction.ID,
arguments: [file, tsAction],
title: ''
};
return action;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册