如何让analyzer_plugin生成LSP而非Dart分析器Legacy协议?
自定义Dart Lint规则使用analyzer_plugin时LSP协议适配问题
我尝试编写自定义lint规则,使用analyzer_plugin包完成项目配置后,主类简化代码如下:
class LintAnalyzerPlugin extends ServerPlugin { @override Future<void> analyzeFile({required AnalysisContext analysisContext, required String path}) async { channel.sendNotification( AnalysisErrorsParams(path, [getAnalysisError(path)]).toNotification(), ); } }
调用channel.sendNotification后,VS Code的问题面板没有显示任何消息。排查后发现,发送的通知采用的是Dart服务器Legacy协议,但Dart Code扩展运行的Dart分析器服务器期望接收LSP(Microsoft Language Server Protocol)。
开启设置"dart.useLegacyAnalyzerProtocol": true后,VS Code问题面板可以正常显示通知,但Dart Code扩展建议使用LSP,因为Legacy协议最终会被移除。
请问是否可以让analyzer_plugin生成LSP?或是我遗漏了某些配置?恳请各位提供建议。
解决方案说明
analyzer_plugin本身不直接生成LSP:这个包基于Dart的Legacy分析协议设计,原生不支持输出LSP格式消息,但Dart分析器服务器会自动将插件的Legacy协议消息转换为LSP格式转发给编辑器,你的问题大概率是配置遗漏导致转换失败。
关键配置检查点
插件注册配置
- 在插件项目的
pubspec.yaml中,必须声明依赖并配置插件入口:name: custom_lint_plugin dependencies: analyzer_plugin: ^0.11.0 plugin: implements: analyzer - 插件入口文件(通常为
lib/plugin.dart)需要导出插件类并提供start函数:export 'src/lint_analyzer_plugin.dart'; void start(PluginCommunicationChannel channel, PluginStarter starter) { starter.start(LintAnalyzerPlugin(channel)); }
- 在插件项目的
项目分析配置
- 在业务项目的
analysis_options.yaml中添加插件引用:analyzer: plugins: - custom_lint_plugin - 运行
dart analyze命令,检查输出日志确认插件已被分析器加载。
- 在业务项目的
错误对象规范
- 确保
getAnalysisError(path)返回的AnalysisError符合要求:- 正确设置
severity(如ErrorSeverity.warning/ErrorSeverity.error) - 提供有效的
location(包含正确文件路径、起止位置) - 非空的
message和code字段
- 正确设置
- 确保
替代方案:使用custom_lint包
如果不想纠结协议适配细节,可以直接用custom_lint包——它基于analyzer_plugin封装,自动处理了LSP适配逻辑,让你只需要专注编写lint规则即可。
内容的提问来源于stack exchange,提问作者Alexis BG
相关产品推荐
相关产品推荐

