Gopls v0.18.0 リリース

設定の変更

  • hoverKind オプションの実験的な Structured 値はサポートされなくなりました。

  • gc_details コードレンズは削除されました。(以前はデフォルトで無効になっていました。)この機能は、コードアクションが様々なクライアントでコードレンズよりも良くサポートされているため、toggleCompilerOptDetails コードアクション(後述)を介して利用できるようになりました。

    VS Code の特別な「Go: Toggle GC details」コマンドは引き続き機能します。

  • 実験的な semanticTokenTypes および semanticTokenModifiers オプションにより、textDocument/semanticTokens 応答における特定の種類のトークンまたはトークン修飾子の選択的な無効化が可能になります。

    これらのオプションは、現在非推奨となっている noSemanticString および noSemanticTokenNumber オプションに代わるものです。ユーザーは代わりに "semanticTokenTypes": {"string": false, "number": false} を設定することで同じ結果を得ることができます。現在、gopls は noSemanticTokenStringnoSemanticToken を引き続き尊重しますが、将来のリリースではサポートを停止します。

  • 新しい workspaceFiles オプションは、ワークスペースの論理的なビルドを定義するファイルに一致するグロブパターンを設定することを可能にします。このオプションは、カスタムの golang.org/x/tools/go/packages ドライバーを使用する環境でのみ必要です。

新機能

「コンパイラの最適化詳細を表示/非表示」コードアクション

このコードアクションは、VS Code の「ソースアクション」メニューからアクセスでき、Go コンパイラの最適化詳細を診断として報告するディレクトリごとのフラグを切り替えます。例えば、どの変数がヒープにエスケープするか、どの配列アクセスが境界チェックを必要とするかを示します。

TODO: 各項目への完全なマニュアルへのリンクを追加。

新しい modernize アナライザー

Gopls は、Go のよりモダンな機能を使用することでコードを簡素化または明確化できる場合を報告し、変更を適用するためのクイックフィックスを提供します。

例えば、if/else ステートメントを使用した条件付き代入は、Go 1.18 で追加された min または max ビルトイン関数の呼び出しに置き換えられる場合があります。

このコマンドを使用して、近代化の修正を一括適用します。

$ go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -test ./...

新しい unusedfunc アナライザー

Gopls は未使用の関数とメソッドを報告するようになり、安全に削除できるデッドコードに関するほぼリアルタイムのフィードバックを提供します。分析は各パッケージに対してローカルであるため、エクスポートされていない関数とメソッドのみが候補となります。(未使用のエクスポートされた関数も報告する可能性のあるより正確な分析には、golang.org/x/tools/cmd/deadcode コマンドを使用してください。)

新しい hostport アナライザー

IPv6 の使用が増えるにつれて、ホスト名にコロンが含まれる可能性があるため、fmt.Sprintf("%s:%d") を使用して「ホスト:ポート」文字列を形成することはもはや適切ではありません。Gopls は、この方法で(またはポートに %s を使用して)構築された文字列が net.Dial または関連する関数に渡される場所を報告し、代わりに net.JoinHostPort を使用する修正を提供します。

その他のアナライザーの変更

  • unusedvariable のクイックフィックスがデフォルトでオンになりました。
  • unusedparams アナライザーは、生成されたファイルに対しては結果を報告しなくなりました。

新しい gofix アナライザー

Gopls は、関数呼び出しまたは定数の使用がインライン化されるべきである場合を報告するようになりました。これらの診断と関連するコードアクションは、関数と定数の定義にある「//go:fix inline」ディレクティブによってトリガーされます。(go:fix プロポーザルを参照してください。)

例えば、関数 Square(int) int を持つパッケージ intmath を考えてみましょう。後でより一般的な Pow(int, int) int が導入され、Square は2番目の引数として2を持つ Pow を呼び出すことを優先して非推奨になります。intmath の作成者はこのように記述できます。

//go:fix inline
func Square(x int) int { return Pow(x, 2) }

gopls があなたのコードで intmath.Square の呼び出しを見つけると、それをインライン化することを提案し、それを行うためのコードアクションを提供します。

同じ機能が定数に対しても機能します。このような定数定義がある場合

//go:fix inline
const Ptr = Pointer

gopls はあなたのコードで PtrPointer に置き換えることを提案します。

このコマンドを使用して、そのような修正を一括適用します。

$ go run golang.org/x/tools/gopls/internal/analysis/gofix/cmd/gofix@latest -test -fix ./...

「実装」がジェネリクスをサポート

ついに、「実装へ移動」機能がジェネリック型と関数を完全にサポートするようになりました(#59224)。

例えば、以下のインターフェースメソッド Stack.Push でこの機能を呼び出すと、具象メソッド C[T].Push が報告され、その逆も同様です。

package p

type Stack[T any] interface {
    Push(T) error
    Pop() (T, bool)
}

type C[T any] struct{}

func (C[T]) Push(t T) error { ... }
func (C[T]) Pop() (T, bool) { ... }

var _ Stack[int] = C[int]{}

選択範囲内の同じ式のすべての出現箇所を抽出

関数内に同じ式の複数のインスタンスがある場合、このコードアクションを使用してそれを変数に抽出できます。式のすべての出現箇所は新しい変数への参照に置き換えられます。

「定義」の改善

定義クエリが追加の場所をサポートするようになりました

  • return ステートメントで呼び出された場合、関数の結果変数の場所を報告します。
  • break、goto、または continue ステートメントで呼び出された場合、それぞれラベルの場所、関連するブロックステートメントの閉じ括弧、または関連するループの開始を報告します。

「ホバー」の改善

return ステートメントで呼び出された場合、ホバーは関数の結果変数の型を報告します。

フォーマット文字列の UX 改善

「ドキュメントハイライト」

カーソルが printf のような関数内にある場合、gopls はフォーマット動詞と引数の関係を視覚的な手がかりとして強調表示し、オペランドがフォーマット文字列でどのように使用されているかを区別します。

fmt.Printf("Hello %s, you scored %d", name, score)

カーソルが %s または name のいずれかにある場合、gopls は %s を書き込み操作として、name を読み取り操作として強調表示します。

「セマンティックハイライト」

DocumentHighlight の改善と同様に、gopls はフォーマット動詞をトークンタイプ「string」の「format」修飾子として報告し、フォーマット文字列の他の部分と区別しやすくします。

fmt.Printf("Hello %s, you scored %d", name, score)

%s%d は、トークンタイプ「string」と修飾子「format」を持ちます。


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