Slide 1

Slide 1 text

自動で //nolint を 挿入する取り組み id:utgwkk / @utgwkk (うたがわきき) 2025/1/18 Gopher's Gathering 1

Slide 2

Slide 2 text

自己紹介 (1) ● うたがわきき (@utgwkk) ○ 京都在住 ○ 実は福岡出身 ● 株式会社はてな ○ Webアプリケーションエンジニア 2

Slide 3

Slide 3 text

自己紹介 (2) ● 好きなパッケージ ○ reflect ○ go/ast 3

Slide 4

Slide 4 text

推しグルメ (1) 元祖 長浜屋 4

Slide 5

Slide 5 text

推しグルメ (1) 元祖 長浜屋 5

Slide 6

Slide 6 text

推しグルメ (2) ビアキチ 6

Slide 7

Slide 7 text

アジェンダ ● golangci-lintの //nolint directiveを自動で 挿入するCLIツール autonolint を作った - 私 が歌川です ● https://github.com/utgwkk/autonolint 7

Slide 8

Slide 8 text

golangci-lintについて ● https://golangci-lint.run/ ● Goのlinterをまとめて実行するrunner ● アンケート: golangci-lintを使っている? 8

Slide 9

Slide 9 text

あらすじ ● ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56 9

Slide 10

Slide 10 text

立ち位置 10 enable-allして disableする disable-allして enableする

Slide 11

Slide 11 text

立ち位置 11 enable-allして disableする disable-allして enableする ゆるやかに enableする

Slide 12

Slide 12 text

モチベーション ● golangci-lintで有効にするlinterをあとから 増やしたい ● 既存のコードが警告されまくる!!! ● たすけて〜〜 12

Slide 13

Slide 13 text

//nolint:xxx ● 指定した行 (ブロック) でだけlinterの警告を 抑制するためのコメント (directive) ● これを自動で入れていけば勝てる 13

Slide 14

Slide 14 text

Q. exclude-rulesじゃダメなの ● 同じファイル内でも新しく書くコードでは linterを有効にしたい ● あとから直すきっかけを作りやすくする ○ コメントがoutdatedなら解決できるはず ○ コロケーション的な思想 14

Slide 15

Slide 15 text

DEMO VSCode開いてください 15

Slide 16

Slide 16 text

実装 (1) ● golangci-lintの実行結果をパース ○ 実はJSON形式で出力できる ■ --out-format=json ○ 入力を加工する機能を丸投げ 16

Slide 17

Slide 17 text

実装 (2) ● //nolint を挿入すべき行を特定 ● 行ごとに書き出しつつ //nolint を挿入 ○ bufio.NewScanner 便利 17

Slide 18

Slide 18 text

実装 (3) ● テストではgolangci-lintを実際に走らせる ● autonolintを適用した後のコードで警告が出 ないことを確かめる ● E2Eテストみたいな感じですね 18

Slide 19

Slide 19 text

今後の課題 ● うまく動かないパターンもあるかも ○ 既に別の //nolint が書いてある行とか ○ 気づいたときに直します 19

Slide 20

Slide 20 text

関連研究 ● https://github.com/mizdra/eslint-intera ctive ○ eslint-disable-next-lineするかどうかなどを インタラクティブに指定できる ○ 丁寧 20

Slide 21

Slide 21 text

まとめ ● golangci-lintの //nolint directiveを自動で 挿入するCLIツール autonolint を作った - 私 が歌川です ● https://github.com/utgwkk/autonolint 21