メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#35487likely_accept

x/tools/go/analysis/vet: export cmd/vet and cmd/fix's \\[]\\*Analyzer suites

ステータス変更: active likely_accept

要約

AIによる要約であり、誤りを含む場合があります。

概要

cmd/vet および cmd/fix が内部的に使用しているアナライザ(静的解析器)のリストを、x/tools/go/analysis/suite/{vet,fix} という新しいパッケージとして公開するproposalです。これにより、開発者が独自のアナライザを go vet の標準セットに容易に追加したカスタム静的解析ツールを構築できるようになります。

ステータス変更

activelikely_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/vetx/tools/go/analysis/passes/suite/{fix,vet} → 最終的に x/tools/go/analysis/suite/{fix,vet} へと変更されました。passes セグメントはreviewミーティングで削除する方針が決定されました。
  • 重複アナライザの扱い: ユーザーが Suite にアナライザを追加する際に同一アナライザが重複するリスクが議論されました。analysisflags.Validate は重複をエラーとして扱うため、重複チェックはユーザー側の責任とするか、バリデーションを緩和するかが検討事項として残っています。
  • ツールチェーンバージョンとの不一致: cmd/vet に含まれるアナライザのセットはGoツールチェーンのバージョンに依存しますが、x/toolsSuite はx/toolsのバージョンに依存します。cmd/vet がx/toolsをvendoringする際のタイムラグにより、両者が完全に一致することはないと prattmic が指摘しました。実用上の問題は少ないと考えられますが、潜在的な混乱要因として認識されています。
  • スパースな依存グラフの維持: vet スイートと fix スイートを同一パッケージにまとめると不要な依存が生じるため、adonovanの提案により別パッケージとして分離する設計が採用されました。

関連リンク