自定义Flutter Lint插件实现自己的Dart语法规则(静态语法分析检测)

本文介绍了如何创建一个自定义的Flutter Lint插件,该插件要求新dart类若包含"ViewModel",必须添加"HDW"前缀。通过分析器插件(analyzer plugin)实现,利用Dart Static analysis的AST分析功能,自定义代码检查规则,以符合团队内部的语法约定。示例详细展示了从创建插件到调试的全过程。

摘要:

本文实现了一个自定义的语法检查插件,功能是:当新写一个dart类,如果类名中包含ViewModel,那么必须添加前缀HDW。在vscode中效果如下:

1

在网上搜索自定义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提供的工具包,其中dartanalyzer是提供语法分析和检查的”

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值