摘要:
本文实现了一个自定义的语法检查插件,功能是:当新写一个dart类,如果类名中包含ViewModel,那么必须添加前缀HDW。在vscode中效果如下:
在网上搜索自定义Dart语法检查
或自定义Dart lint
最终都会导向 Customizing static analysis 这篇文档。文档中介绍了Dart Static analysis的功能和使用方式。
如在if
语句使用了错误的变量名称,提示如下错误。
void main() {
var count = 0;
if (counts < 10) {
count++;
}
print(count);
}
提示
error • Undefined name 'counts'. • lib/main.dart:3:7 • undefined_identifier
但是文章标题中所谓Customizing(自定义)
指的是自定义修改配置检查规则、设置工程中文件的检查匹配范围、调整某些规则的检查级别(由warning提升到error)等。具体方式是,首先在工程目录下添加analysis_options.yaml文件:
include: package:pedantic/analysis_options.1.8.0.yaml
analyzer:
exclude: #忽略检测的文件配置
- lib/client.dart
- lib/server/*.g.dart
- test/_data/**
strong-mode: #设置某些规则为严格模式
implicit-casts: false
linter:
rules: #开启或禁用某些规则
avoid_shadowing_type_parameters: false
await_only_futures: true
但这种自定义不是我们想要的。我们想要的不仅仅是Dart官网为我们提供的语法检查,我们需要自己能去分析当前代码的AST(抽象语法树),进而写出一些符合自己团队内部语法约定或业务约定的自定义规则。这可行吗?可以的,而且这个功能就是Dart Static analysis提供,并且仍然可以配置在analysis_options.yaml中。但是不知为何官网没有提供相关的文档描述和教程,网上能搜到的文章也很少,并且写这种自定义规则在工程创建和调试上都会遇到很多坑
点,所以我打算用一个自定义规则的完整示例,将整个过程呈现出来。
这个示例的需求是:当新写一个dart类,如果类名中包含ViewModel,那么必须添加前缀HDW。(不要纠结这个规则的实际意义,就当是业务命名的强约束吧😂)
//此处需要报错,并提示用户必须添加HDW前缀
class ViewModel {
}
Analyzer plugin简介
自定义符合自己团队内部语法约定或业务约定的规则,可以通过analyzer plugin实现。
通过analyzer plugin写的这些规则,其使用方法,检查效果,以及在VSCode或AndroidStudio中的表现形式都与Dart Static analysis提供效果完全相同。
在了解analyzer plugin是什么之前,我们先想一下,本文第一节所说的Dart Static analysis是如何工作的?为什么工程中的analysis_options.yaml文件配置会生效,并且它是如何生效的?
直观的答案是”Dart SDK提供的功能“,打开github的dart-lang项目,相关的代码在pkg下的analysis_server、analysis_cli、analysis_plugin等文件夹中。我们安装Flutter后执行Flutter doctor会下载对应版本的Dart SDK,在flutter/bin/cache/dart-sdk/bin目录下我们可以找到dart sdk提供的工具包ÿ