You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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格式转发给编辑器,你的问题大概率是配置遗漏导致转换失败。

关键配置检查点

  1. 插件注册配置

    • 在插件项目的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));
      }
      
  2. 项目分析配置

    • 在业务项目的analysis_options.yaml中添加插件引用:
      analyzer:
        plugins:
          - custom_lint_plugin
      
    • 运行dart analyze命令,检查输出日志确认插件已被分析器加载。
  3. 错误对象规范

    • 确保getAnalysisError(path)返回的AnalysisError符合要求:
      • 正确设置severity(如ErrorSeverity.warning/ErrorSeverity.error)
      • 提供有效的location(包含正确文件路径、起止位置)
      • 非空的message和code字段

替代方案:使用custom_lint包

如果不想纠结协议适配细节,可以直接用custom_lint包——它基于analyzer_plugin封装,自动处理了LSP适配逻辑,让你只需要专注编写lint规则即可。

内容的提问来源于stack exchange,提问作者Alexis BG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:20:34