Dartで自作したLintのルールをVSCodeで適用してリアルタイムにエラーを表示する

by

@wapa5pow

10Xアドベントカレンダー13日目を担当するSWEの石田(@wapa5pow)です。
好きな商品はフレスタさんで5色いなりです。これ自体は他のお店でも売っているという報告をうけたのですがいなりをたべながら公園で同僚とランチをしたのがいい思い出です。

規約にそっていないソースコードを書くとLintによってエラーを出して規約に沿わせる事ができます。
10Xでも様々なLintルールを使っており中には自作したLintルールを適用しています。

例えば以下のようなルールがサーバサイドDartにおいて使われています。

  • CLIのコマンド名はアンダースコアではなくハイフンでつなぐ
  • Optional Positional Parameterは使わない
  • FirestoreのcontainedIn句を使う時は動的な変数で指定できない
  • etc...

などなどDartの標準にはないルールですがプロジェクト上で守りたいものがあります。

同僚がFlutterKaigi 2022で「Dartにおける静的解析」を話していた通り10Xではコマンドライン上の実行で前述のようなルール違反を検知できますが、VSCode上でリアルタイムに違反を検知させることができていません。

面白そうだなと思ったので、上記で紹介されていたcustom_lintを使ってリアルタイムにVSCode上でLint違反を検知する検証をしてみます。その上でどういうコードをかけばStailerのサーバに適用しやすく簡単にルールを追加しやすいか考えてみます。

ソースコード

実際に書いたソースコードは以下です。

/assets/2022-12-13--dart-custom-lint-example/example.png

ソースコードをcloneしてきてVSCodeで表示しdart pub getを行ったあとは上記のように自作したLintのエラーが表示されます。

Lintの記載方法にはElement Treeを使う方法とASTを使う方法があります(参考)。

今回どちらの方法も試せるように以下のように記載しています。

  • Element Tree方式: custom_lintを参考にしてproviderはfinalで宣言しないといけないというルールを設定している。
  • AST方式: Optional Positional Parameterをプロジェクト内で使えないようにするルールを設定している。

Lintごとにファイルもわけて追加も容易になっています。

デバッガーを使う

ブレークポイントを設定して以下を実行すればデバッガも起動できます。

/assets/2022-12-13--dart-custom-lint-example/debug.png

コマンドラインで実行する

VSCode上だけでなくCLIで実行できないとCIで利用できないですが、custom_lintにはちゃんとコマンドでも実行できるようになっています。

$ dart run custom_lint
Building package executable... (7.6s)
Built custom_lint:custom_lint.
  lib/main.dart:7:19 • Providers should always be declared as final • riverpod_final_provider
  lib/main.dart:24:7 • Avoid passing optional positional parameters • avoid_passing_optional_positional_parameters
  lib/main.dart:29:5 • Avoid passing optional positional parameters • avoid_passing_optional_positional_parameters

まとめ

面倒なanalyzer_pluginを書かなくてもcustom_lintで楽にLintがかけるのでその例を示しました。
思ったより簡単にできたので順次Stailerのサーバに適用していきたいと思っています。

10XではStailerを開発する仲間を募集中です。いきなり選考というかはカジュアル面談もやっておりますのでぜひぜひお話しましょう。

参考