Gopls v0.17.0 リリース

go install golang.org/x/tools/gopls@v0.17.0-pre.4

新しいサポートポリシー

このリリースより、公式サポート期間を Go サポートポリシーに合わせて狭めます。これにより、古い Go バージョンに対するテストにかかる多大なコストが削減され、その時間をバグ修正や、最新バージョンの Go を使用する大多数の gopls ユーザーにとって有益な機能追加に費やすことができます。

この狭窄は2つの側面で発生します。ビルド互換性は gopls のビルドに使用できる Go ツールチェーンのバージョンを指し、go コマンド互換性は gopls がワークスペース内のパッケージやモジュールに関する情報をリストアップするために使用できる go コマンドのバージョンを指します。

ビルド互換性: 最新の主要 Go バージョン

v0.16.0 リリースノートに記載されているように、最新バージョンの gopls をビルドするには、最新の主要 Go ツールチェーンが必要になります。したがって、このリリース (gopls@v0.17.0) は Go 1.23.0 以降でビルドする必要があります。自動ツールチェーンアップグレードのおかげで、システム Go バージョンが Go 1.21.0 以降で GOTOOLCHAIN=auto が設定されている場合 (デフォルト)、go コマンドはモジュールの依存関係をアップグレードするのと同様に、必要に応じて新しい Go ツールチェーンを自動的にダウンロードします。

Go コマンド互換性: 最新の主要 Go バージョン2つ

gopls@v0.17.x リリースは、最新の Go リリース2つを超えて統合を名目上サポートする gopls の最終バージョンとなります。以前は、最大4バージョンについて「最大限の努力」によるサポートを暗示していましたが、実際には古い Go バージョンにのみ存在するバグを修正するリソースがありませんでした。gopls@v0.17.0 では、この「最大限の努力」によるサポートを3バージョンに狭めました。これは主に、自動ツールチェーンアップグレード (上記参照) の恩恵を受けるには、ユーザーが少なくとも Go 1.21 を必要とするためです。

gopls@v0.18.0 からは、go コマンドの最新の主要バージョン2つのみとの統合を正式にサポートします。これは Go サポートポリシーと一致しています。詳細については、golang/go#69321 (または特にこのコメント) を参照してください。

古い Go バージョンでの gopls の使用を妨げることはありませんが (任意の go/packages ドライバーとの統合を禁止しないのと同様)、古い Go バージョンに対する統合テストは実行せず、古い Go バージョンでのみ存在するバグも修正しません。

設定の変更

  • 以前はデフォルトで無効になっていた fieldalignment アナライザーは削除されました。これは v0.16.0 で表示されるホバーサイズ/オフセット情報と重複しており、その診断は紛らわしかったためです。
  • undeclaredname アナライザーは通常のコードアクションに置き換えられました。
  • gopls のすべてのコードアクションの種類 (識別子) が、より具体的な階層名を使用するように変更されました。例えば、「Inline call」は refactor.inline から refactor.inline.call に変更されました。これにより、クライアントは特定のコードアクションをより正確に要求できるようになります。ユーザーマニュアルには、各コードアクションのドキュメントに識別子が含まれるようになりました。
  • 実験的な allowImplicitNetworkAccess 設定は、gopls@v0.16.0 での非推奨化に続き、削除されました。詳細については golang/go#66861 を参照してください。

新機能

リファクタリング

このリリースには、リファクタリングに関連する多くの新機能が含まれています。さらに、既存のリファクタリング操作における多くのバグを修正しました。これらは主に extractinline に関連しています。

これらの改善は、より堅牢で完全なリファクタリングツールセットを提供するという長期的な目標に向けて私たちを動かします。まだやるべきことは多く、この取り組みは2025年まで続きます。

パラメーター移動のリファクタリング

Gopls は、関数とメソッドのパラメーターを関数シグネチャ内で左右に移動させ、すべての呼び出し元を更新するコードアクションを提供するようになりました。

残念ながら、任意の「シグネチャ変更」リファクタリングに適切なユーザーインターフェースを提供するネイティブの LSP 操作はありません。私たちは VS Code 内でそのようなインターフェースを構築する予定です。短期的には、「func」キーワードで「rename」を呼び出すことで、より複雑なパラメーター変換を表現できるようにしました。このユーザーインターフェースは、クライアント側のダイアログを可能にする LSP コマンドのより良いメカニズムが利用可能になるまでの一時的なつなぎです。

宣言を新しいファイルに抽出

Gopls は新たにコードアクション「Extract declarations to new file」(refactor.extract.toNewFile) を提供するようになりました。これは、選択されたコードセクションを同じパッケージ内に新しく作成されたファイルに移動します。作成されるファイル名は、最初に見つかった {関数、型、定数、変数} 名として選択されます。加えて、必要に応じてインポート宣言が追加または削除されます。

ユーザーは、関数名、キーワード funcconstvartype を選択するか、選択せずにキャレットをそれらの上に置くか、または宣言全体または複数の宣言を選択することで、このコードアクションを呼び出すことができます。

何を抽出するかについての曖昧さや予期せぬ事態を避けるため、宣言の部分的な選択の種類によっては、このコードアクションを呼び出すことができません。

定数の抽出

選択が定数式の場合、gopls は「Extract variable」の代わりに「Extract constant」を提供し、ローカル変数ではなく const 宣言を生成するようになりました。

また、定数または変数の抽出は、関数外のトップレベルでも機能するようになりました。

関数呼び出しから不足しているメソッドを生成

メソッドを持たない型に対してメソッドを呼び出そうとすると、コンパイラは「type T has no field or method f」のようなエラーを報告します。Gopls は新たにコードアクション「Declare missing method of T.f」を提供するようになりました。ここで T は具象型、f は未定義のメソッドです。スタブメソッドのシグネチャは呼び出しのコンテキストから推論されます。

関数またはメソッドのテストを生成

選択されたコードチャンクが関数またはメソッド宣言 F の一部である場合、gopls は「Add test for F」コードアクションを提供します。これは、対応する _test.go ファイル内に選択された関数の新しいテストを追加します。生成されたテストは、入力パラメーターと結果を含むそのシグネチャを考慮します。

この機能はサーバー (gopls) によって実装されているため、すべての LSP 準拠エディターと互換性があります。VS Code ユーザーは、引き続きクライアント側の Go: Generate Unit Tests For file/function/package コマンドを使用できます。このコマンドは gotests ツールを実行します。

プル診断の初期サポート

オプション "pullDiagnostics": true で初期化されると、gopls は textDocument.diagnostic クライアント機能のサポートを宣伝します。これにより、エディターは textDocument/publishDiagnostics 通知を待つのではなく、textDocument/diagnostic リクエストを使用して gopls から直接診断を要求できます。この機能は、プル診断の機能セットがプッシュ診断に匹敵するようになるまで、デフォルトでオフになっています。

ホバーの改善

textDocument/hover の応答では、マークダウンのレンダリングが若干調整され、以下の追加情報が含まれるようになりました。

  • 標準ライブラリのシンボルにカーソルを合わせると、そのシンボルが含まれる最初の Go リリースに関する情報が表示されるようになりました。例えば、errors.As にカーソルを合わせると「Added in go1.13」と表示されます。
  • パッケージ宣言内のパッケージ名にカーソルを合わせると、追加のパッケージメタデータが含まれるようになりました。

型のトップレベルコンストラクタのセマンティックトークン修飾子

セマンティックトークン応答には、各シンボルの型のトップレベルコンストラクタに対する追加の修飾子 (interfacestructsignaturepointerarraymapslicechanstringnumberboolinvalid) が含まれるようになりました。エディターはこれを構文の色付けに使用できます。

識別子と値の SignatureHelp

関数シグネチャヘルプは、呼び出されている関数の括弧内だけでなく、関数シグネチャを持つ任意の識別子で利用できるようになりました。

アセンブリ定義へのジャンプ

関数への参照に対する Definition クエリは、関数の Go の func 宣言にジャンプします。関数が C またはアセンブリで実装されている場合、関数には本体がありません。2回目の Definition クエリを実行すると (すでに Go の宣言にいる場合)、アセンブリの実装に移動します。

yield アナライザー

新しい yield アナライザーは、Go 1.23 イテレータで yield 関数を使用する際の誤り、例えばブール値の結果をチェックせずにループを抜けてしまうといったものを検出します。

waitgroup アナライザー

新しい waitgroup アナライザーは、sync.WaitGroupAdd メソッドへの呼び出しが、新しいゴルーチン内で (誤って) 行われ、AddWait と競合する原因となっているものを検出します。(このチェックは staticcheck の SA2000 と同等ですが、デフォルトで有効になっています。)


このドキュメントのソースファイルは、golang.org/x/tools/gopls/doc の下にあります。