go/importer: documentation of lookup parameter of ForCompiler can be clarified
要約
概要
go/importer パッケージの ForCompiler 関数のドキュメントを修正し、誤って関数全体に適用されていた非推奨(Deprecated)表記を解除するproposalです。ForCompiler 関数そのものは非推奨ではなく、lookup パラメータに nil を渡す動作のみが非推奨であることをドキュメントで明確にします。
ステータス変更
(なし) → accepted
このproposalは、cmd/api チェッカーのバグにより ForCompiler が誤って非推奨とマークされていたことが発覚したため立案されました。api/next ファイルを変更する修正CL(go.dev/cl/773040)にはプロポーザルレビュー委員会の承認が必要なため、手続き上proposalとして提出されました。aclements(@aclements)が「コンセンサスに変化なし」として承認を宣言しています。
技術的背景
現状の問題点
Go 1.16時代のCL(go.dev/cl/184079)において、go/importer.ForCompiler 関数のドキュメントコメントに「Deprecated:」という文字列が追加されました。しかしこの記述はドキュメントの段落の先頭ではなく、段落の途中に配置されていました。
Go の公式な非推奨コメント仕様(go.dev/wiki/Deprecated)では、非推奨マークは段落の先頭に「Deprecated:」で始まる必要があります。そのため、pkgsite(pkg.go.dev)はこの記述を非推奨とみなさず表示していましたが、cmd/api チェッカーは独自の検出ロジックを持っており、段落の途中にある「Deprecated:」もフラグとして扱うバグがあったため、ForCompiler を誤って非推奨APIとして認識していました(#79145)。
// 現在のドキュメント(問題のある状態)
// ForCompiler returns an Importer for importing from installed packages
// for the compilers "gc" and "gccgo"...
//
// Deprecated: If lookup is nil, for backwards-compatibility, the importer
// will attempt to resolve imports in the $GOPATH workspace.
この「Deprecated:」は ForCompiler 関数全体ではなく、lookup に nil を渡す振る舞いのみが非推奨であることを示す意図でしたが、記述位置の問題から混乱を招いていました。
提案された解決策
CL(go.dev/cl/773040)により、ForCompiler のドキュメントを書き直し、以下を明確にします。
ForCompiler関数そのものは非推奨ではないlookupパラメータにnilを渡す動作($GOPATHワークスペースでのインポート解決)が非推奨である- 段落の先頭に「Deprecated:」を置かないことで、関数全体への誤った非推奨フラグを防ぐ
これによって何ができるようになるか
この修正により、以下の点が改善されます。
ForCompilerを使用する開発者がIDEやドキュメントサイトで誤った「非推奨」警告を受け取らなくなるlookupパラメータの役割と、nilを渡すことが非推奨である理由がドキュメント上で明確になるcmd/apiチェッカーが誤ってForCompilerを非推奨APIとして検出しなくなる
コード例
// Before: ドキュメントが不明瞭で、関数全体が非推奨に見えていた
// ForCompiler returns an Importer for importing from installed packages...
//
// Deprecated: If lookup is nil, for backwards-compatibility, the importer
// will attempt to resolve imports in the $GOPATH workspace.
func ForCompiler(fset *token.FileSet, compiler string, lookup func(path string) (io.ReadCloser, error)) types.Importer
// After: lookupがnilの振る舞いのみが非推奨であることが明確になる
// ForCompiler returns an Importer for importing from installed packages...
//
// If lookup is non-nil, it is called for each import. ...
//
// Passing nil as lookup is deprecated: it attempts to resolve imports
// in the $GOPATH workspace, which is not module-aware.
func ForCompiler(fset *token.FileSet, compiler string, lookup func(path string) (io.ReadCloser, error)) types.Importer
議論のハイライト
cmd/apiチェッカーと pkgsite の間で非推奨検出の挙動が異なっていた。pkgsite の実装が仕様通りで正しく、cmd/apiの実装がバグを持っていることが @dmitshur によって指摘された(#79145 として別途修正)- このproposalは本質的には手続き上の理由で立案されており、
api/nextファイルを変更する実装CLを通すためにプロポーザルレビュー委員会の承認が必要だった - @aclements は「コンセンサスに変化なし(No change in consensus)」と述べており、実質的に承認内容に議論の余地はなかった
- Go 1.16でCL 184079が誤った形で
Deprecated:を導入したことが問題の根本原因と特定されている cmd/apiの非推奨検出ロジックのバグ修正(CL 774881)と、ドキュメント修正(CL 773040)は別々のCLで対応された