如何在VSCode扩展中以编程方式执行CodeAction并触发resolve步骤?
能否在VSCode扩展中以编程方式执行其他扩展的CodeAction?具体来说,需要在执行前运行CodeActionProvider的resolveCodeAction方法——这是VSCode执行快速修复前的必要步骤。
我找到的大部分示例代码如下:
const diagnostics = vscode.languages.getDiagnostics(document.uri); for (const diagnostic of diagnostics) { const { range } = diagnostic; // 获取当前诊断对应的快速修复 const codeActions = await vscode.commands.executeCommand<vscode.CodeAction[]>( 'vscode.executeCodeActionProvider', document.uri, range, vscode.CodeActionKind.QuickFix.value ); if (codeActions && codeActions.length > 0) { // 应用第一个快速修复 await vscode.commands.executeCommand( codeActions[0].command.command, ...codeActions[0].command.arguments ); } }
但测试发现,vscode.executeCodeActionProvider仅执行CodeActionProvider接口的provideCodeAction步骤,并未触发需要解析动作的resolveCodeAction步骤。
我具体想执行的是内置typescript-language-features扩展的_typescript.applyFixAllCodeAction,有没有推荐的方式来执行CodeAction,完全模拟VSCode内部的处理逻辑?
注:此问题并非重复提问,我是作为VSCode扩展开发者询问编程实现方式,而非普通用户的操作方法。
1. 手动触发resolve步骤
vscode.executeCodeActionProvider仅返回初始的CodeAction,若需要触发resolveCodeAction,可以调用vscode.resolveCodeAction命令手动完成解析,示例代码如下:
const diagnostics = vscode.languages.getDiagnostics(document.uri); for (const diagnostic of diagnostics) { const { range } = diagnostic; // 获取初始CodeAction列表 const codeActions = await vscode.commands.executeCommand<vscode.CodeAction[]>( 'vscode.executeCodeActionProvider', document.uri, range, vscode.CodeActionKind.QuickFix.value ); if (codeActions && codeActions.length > 0) { // 对需要解析的CodeAction执行resolve const resolvedAction = await vscode.commands.executeCommand<vscode.CodeAction>( 'vscode.resolveCodeAction', codeActions[0], document.uri, range, diagnostic ); // 执行解析后的动作 if (resolvedAction?.command) { await vscode.commands.executeCommand( resolvedAction.command.command, ...resolvedAction.command.arguments ); } } }
2. 直接调用目标扩展的特定命令
如果你明确知道目标动作的命令ID(比如_typescript.applyFixAllCodeAction),可以跳过通用CodeAction流程,直接调用该命令:
// 执行TypeScript的"修复所有"动作 await vscode.commands.executeCommand('_typescript.applyFixAllCodeAction', { uri: document.uri.toString(), fixId: 'fixAll' // 可根据需要指定具体修复类型 });
注意:这类内部命令的参数格式可能随VSCode或扩展版本变化,建议查看目标扩展的源码确认参数要求。
3. 贴近VSCode内部的完整处理逻辑
VSCode内部会自动判断CodeAction是否需要解析,你可以模拟这个逻辑:
- 检查CodeAction是否包含
command字段,或是否标记了isPreferred,若无则说明需要解析 - 调用
vscode.resolveCodeAction完成解析 - 若解析后的动作包含编辑(
edit字段),则直接应用编辑;若包含命令,则执行命令
内容的提问来源于stack exchange,提问作者James McNamara

