diagnostic信息不显示,首要确认语言服务器(lsp)是否真正运行并成功连接:检查output窗口对应语言通道日志、documentselector是否匹配文件后缀与语言模式、diagnostic对象字段(如range、severity)是否符合vscode.diagnostic规范,且触发时机(didchange/didsave)与客户端同步配置一致。

VSCode插件里 diagnostic 信息不显示?先确认 language server 是否真在跑
Diagnostic 不是写完就自动冒出来的,它依赖 language server 进程持续运行并主动推送。如果你改了 server 代码但 Problems 面板还是空的,大概率是 server 没起来,或者 client 没连上。
常见错误现象:修改了 server/src/server.ts 中的诊断逻辑,重启 VSCode 后仍无波浪线;output 窗口里找不到对应语言通道(如 mylang)的日志。
- 检查
client/src/extension.ts中documentSelector是否匹配当前文件后缀和语言模式(比如language: 'vue'但文件实际是.js) - 确保 server 进程启动成功:在
output窗口切换到你的语言通道,应能看到类似Starting language server...或Connection established - 不要用
console.log调试 server——它默认不输出到任何可见位置;改用connection.console.log(),内容会出现在对应 output 通道
Diagnostic 对象字段写错会导致跳转失效或静默丢弃
VSCode 只认特定结构的 vscode.Diagnostic 对象,字段名、类型、嵌套层级错一个,诊断就可能被忽略,或显示但无法点击跳转。
关键字段必须准确:
-
range必须是vscode.Range实例,不能是普通对象;行号从 0 开始,列号同理 -
severity只能是vscode.DiagnosticSeverity.Error/Warning/Information/Hint,不能传数字或字符串 -
source推荐设为固定字符串(如'my-linter'),避免动态拼接导致 channel 混乱 - 如果想支持快速修复(Quick Fix),必须额外调用
connection.sendDiagnostics()前设置diagnostic.code和diagnostic.relatedInformation(可选)
示例正确写法:
const diagnostic = new vscode.Diagnostic( new vscode.Range(0, 5, 0, 10), 'Variable name must be camelCase', vscode.DiagnosticSeverity.Warning ); diagnostic.source = 'my-linter'; diagnostic.code = 'naming/camelcase';
Diagnostic 报告延迟或只在保存时触发?检查触发时机配置
默认情况下,很多 language server 只在文件保存(onSave)时做一次全量诊断。输入过程中不报错,不是 bug,是配置使然。
要实现“边输边检”,得在 server 初始化时显式声明:
- 注册
textDocument/didChange处理器,而不是只监听textDocument/didSave - 注意性能:
didChange触发极频繁,建议加防抖(debounce),例如延迟 300ms 再执行诊断逻辑 - 客户端也要配好:在
client/src/extension.ts的clientOptions.synchronize中确保fileEvents包含**/*.mylang,否则变更事件根本不会发给 server
另外,settings.json 中若存在 "mylang.validateOnSave": true,而没配 validateOnType,那必然只在保存时生效。
诊断信息出现在 output 但 Problems 面板不显示?重点查 documentSelector 和语言模式
这是最隐蔽也最常被忽略的问题:server 日志里明明打印了 diagnostic,Problems 面板却空空如也。根本原因通常是 VSCode 根本没把当前文件“分配”给你的 language server。
验证步骤:
- 打开目标文件,看右下角状态栏语言模式是否是你注册的(比如显示
MyLang而不是Plain Text);如果不是,点它手动改成对应语言 - 确认
package.json中contributes.languages正确声明了该语言 ID 和文件关联(filenames,extensions,firstLine) - 检查
client/src/extension.ts中documentSelector的language字段是否与contributes.languages.id完全一致(大小写敏感) - 如果用了多根工作区,确保该文件所在文件夹有独立的
.vscode/settings.json,且未通过"files.associations"错误覆盖语言模式
一旦 documentSelector 不匹配,VSCode 就不会把该文件的变更事件转发给你的 server,自然也不会接收 diagnostic —— 所有日志都白打。











