诊断与代码操作
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 表达的纯文本修改。