パルカワ2

最近はFlutterをやっています

Flutter/Dartでcustom lint ruleを作りたい

推奨されないコードを機械的に発見出来る部分は人間がコードレビューなどで指摘するのではなくLinterで気づきたい。 なので、プロジェクトごとにLinterのCustom Ruleを作りたいのだが、DartのLinterはCustom Ruleに対応していない。

github.com

このイシューに書かれてある通り、linterコマンドを自分で作る方法とanalyzer_pluginを利用する方法がある。

linterコマンドを自分で作る

この方法は実装が簡単というメリットがあり、IDE上ではエラーや警告が表示されないというデメリットがある。

linter/linter.dart at master · dart-lang/linter · GitHub

linter.dart の中で自分で作ったRuleを登録してあげて実行する。まあこういう感じで出来る

Future main(List<String> args) async {
  final enableRules = [
    MyCustomRule(),
  ];
  for (final rule in enableRules) {
    Analyzer.facade.register(rule);
  }
  await cli.run([
    '--packages=.packages',
    '--rules=${enableRules.map((r) => r.name).join(",")}',
    'lib',
    'test',
  ]);
}

analyzer_pluginを利用する方法

この方法はIDE上でもエラーや警告が表示されるというメリットがあり、実装やデバッグがめんどくさいというデメリットがある。

analyzer_plugin | Dart Packageを利用する。

めんどくさい実装をメンテし続けるのはつらいので、dart_code_metricsというライブラリをforkして自前のルールを追加するのはどうかと思ってやってみた。

試しに追加したのは、 DateTime.utc() とかを使うとエラーにするRule

github.com

これでDateTime.utc(2020) とかするとIDE上でエラーになる。ただまあ、forkなのであんまりやりたくないなと思っている。