跳到主要内容

诊断与代码操作

Diagnostic​

一条问题:范围、消息、严重程度。

const diagnostic = new vscode.Diagnostic(
new vscode.Range(0, 0, 0, 5),
'这里写错了',
vscode.DiagnosticSeverity.Error
);
diagnostic.source = 'demo';
diagnostic.code = 'demo.bad-name';

DiagnosticSeverity 有 Error、Warning、Information、Hint。

DiagnosticCollection 按资源保存多条诊断:

const collection = vscode.languages.createDiagnosticCollection('demo');
context.subscriptions.push(collection);
// 替换该文件上的全部诊断;传 undefined 或 delete 可清除
collection.set(document.uri, [diagnostic]);

集合归创建它的扩展所有。扩展停用时要 dispose,否则问题面板里会留下旧结果。更新时对一个 Uri 调用 set 是整份替换。多个文件用 collection.set([[uri, diagnostics], ...])。

DiagnosticRelatedInformation 用来指向相关位置。DiagnosticTag 可标记不必要或已废弃的代码。

CodeAction​

用户点灯泡或按快速修复时,CodeActionProvider.provideCodeActions 返回动作列表。

一个动作通常包含:

  • title:菜单上的字
  • kind:CodeActionKind.QuickFix、Refactor、Source 等
  • edit:一个 WorkspaceEdit,选中后由编辑器应用
  • command:选中后执行的命令。需要 UI 或异步工作时用它
  • diagnostics:这个动作针对哪些诊断
  • isPreferred:作为首选修复

edit 和 command 可以同时有。编辑器先应用编辑,再执行命令。

WorkspaceEdit​

描述一组尚未应用的修改。

方法作用
insert / delete / replace改某个 Uri 上的文本
createFile / deleteFile / renameFile文件操作
set直接放一组 TextEdit

用 workspace.applyEdit(edit) 应用。它不依赖当前焦点编辑器,适合改多个文件。

TextEdit 是范围加新文本。格式化提供器返回的就是 TextEdit[]。

补全项里和编辑相关的字段​

字段作用
insertText接受补全时插入的文本或片段
additionalTextEdits光标以外的附带修改,例如补上一行 import
command接受后再执行的命令

additionalTextEdits 解决「插入名字的同时还要改文件另一处」。command 解决「插入之后还要跑逻辑」。不要用 command 去做本可以用 additionalTextEdits 表达的纯文本修改。

参考​