x/tools/go/analysis/vet: export cmd/vet and cmd/fix's \\[]\\*Analyzer suites
要約
概要
cmd/vet および cmd/fix が内部的に使用しているアナライザ(静的解析器)のリストを、x/tools/go/analysis/suite/{vet,fix} という新しいパッケージとして公開するproposalです。これにより、開発者が独自のアナライザを go vet の標準セットに容易に追加したカスタム静的解析ツールを構築できるようになります。
ステータス変更
active → likely_accept
2026年5月13日のproposal reviewミーティングにおいて、aclements がこのproposalを likely accept と判定しました。パッケージパスについては当初 x/tools/go/analysis/passes/suite/{fix,vet} という案がadonovanから提案されましたが、passes セグメントを削除して x/tools/go/analysis/suite/{fix,vet} とする方向でレビューグループが合意に達しました。
技術的背景
現状の問題点
go vet が使用するアナライザのリストは cmd/vet/main.go 内でハードコードされており、外部から参照できません。独自のアナライザを追加した multichecker ベースのツールを作りたい開発者は、cmd/vet のアナライザリストをコピー&ペーストする必要があり、リストが更新されるたびに手動で同期しなければなりませんでした。
// 現状: cmd/vet/main.go のアナライザリストを手動でコピーするしかない
func main() {
unitchecker.Main(
appends.Analyzer,
asmdecl.Analyzer,
assign.Analyzer,
// ... 多数のアナライザを手動でコピー ...
)
}
提案された解決策
x/tools/go/analysis/suite/vet および x/tools/go/analysis/suite/fix という新しいパッケージを作成し、それぞれに Suite 変数を公開します。
// x/tools/go/analysis/suite/vet パッケージ
package vet
import "golang.org/x/tools/go/analysis"
// Suite は cmd/vet が実行するアナライザのセットです。
var Suite = []*analysis.Analyzer{ ... }
// x/tools/go/analysis/suite/fix パッケージ
package fix
import "golang.org/x/tools/go/analysis"
// Suite は cmd/fix が実行するアナライザのセットです。
var Suite = []*analysis.Analyzer{ ... }
これによって何ができるようになるか
独自のアナライザを go vet の標準チェック群の上に追加した lint ツールを、簡潔かつ保守性高く構築できます。
コード例
// Before: go vet のアナライザリストを手動でコピーして維持するワークアラウンド
import (
"golang.org/x/tools/go/analysis/multichecker"
"golang.org/x/tools/go/analysis/passes/appends"
"golang.org/x/tools/go/analysis/passes/asmdecl"
// ... 多数のimportを手動で列挙 ...
)
func main() {
multichecker.Main(
appends.Analyzer,
asmdecl.Analyzer,
// ... コピーしたリスト ...
myCustomAnalyzer,
)
}
// After: Suite を使ってシンプルに記述
import (
"golang.org/x/tools/go/analysis/multichecker"
vetSuite "golang.org/x/tools/go/analysis/suite/vet"
"myproject/analysis/mychecks"
)
func main() {
analyzers := append(vetSuite.Suite, mychecks.Analyzer)
multichecker.Main(analyzers...)
}
議論のハイライト
cmd/fixも対象に拡大: 当初はcmd/vetのアナライザのエクスポートのみが提案されていましたが、関連proposal #71859(go fixをアナライザフレームワーク上に再構築する計画)の進展を受け、cmd/fixのアナライザスイートも同様にエクスポートする方向に拡大されました。- パッケージパスの変遷:
golang.org/x/tools/go/analysis/vet→x/tools/go/analysis/passes/suite/{fix,vet}→ 最終的にx/tools/go/analysis/suite/{fix,vet}へと変更されました。passesセグメントはreviewミーティングで削除する方針が決定されました。 - 重複アナライザの扱い: ユーザーが
Suiteにアナライザを追加する際に同一アナライザが重複するリスクが議論されました。analysisflags.Validateは重複をエラーとして扱うため、重複チェックはユーザー側の責任とするか、バリデーションを緩和するかが検討事項として残っています。 - ツールチェーンバージョンとの不一致:
cmd/vetに含まれるアナライザのセットはGoツールチェーンのバージョンに依存しますが、x/toolsのSuiteはx/toolsのバージョンに依存します。cmd/vetがx/toolsをvendoringする際のタイムラグにより、両者が完全に一致することはないとprattmicが指摘しました。実用上の問題は少ないと考えられますが、潜在的な混乱要因として認識されています。 - スパースな依存グラフの維持:
vetスイートとfixスイートを同一パッケージにまとめると不要な依存が生じるため、adonovanの提案により別パッケージとして分離する設計が採用されました。