Gopls v0.19.0 リリース

設定の変更

  • gopls check サブコマンドは、報告する診断の最小重要度を設定するための -severity フラグを受け入れるようになりました。デフォルトでは、最小重要度は「warning」であるため、gopls check は以前よりも少ない診断を報告する可能性があります。以前の動作を再現するには、-severity=hint を設定してください。

「実装」がシグネチャタイプをサポート(同じパッケージ内)

「実装」クエリは、抽象型と具象型、およびそれらのメソッドセットに基づくメソッド間の対応を報告します。今回、関数型、動的関数呼び出し、および関数定義間の対応も、それらのシグネチャに基づいて報告するようになりました。

使用するには、名前付き関数、名前付きメソッド、または関数リテラルの定義の func トークンに対して実装クエリを呼び出します。Gopls は、この関数を抽象化する関数シグネチャ型のセットと、そのような型の値による動的呼び出しのセットを報告します。

逆に、シグネチャ型の func トークン、または動的関数呼び出しの ( 括弧に対して実装クエリを実行すると、シグネチャが抽象化する、または呼び出しがディスパッチする具象関数のセットが報告されます。

型は関数型とメソッドを持つ名前付き型の両方である可能性があるため(例:http.HandlerFunc)、両方の種類の実装クエリ(メソッドセットと関数シグネチャ)に参加できます。メソッドセットを使用するクエリは型またはメソッド名で呼び出す必要があり、シグネチャを使用するクエリは func または ( トークンで呼び出す必要があります。

現在、ローカル(同パッケージ内)アルゴリズムのみがサポートされています。(グローバルアルゴリズムは https://go.dokyumento.jp/issue/56572 で追跡されています。)

「実装へ移動」がインターフェース間の関係を報告

「実装へ移動」操作は、インターフェース間の関係を報告するようになりました。Gopls は、クエリタイプの具体性を使用して、クエリが「下向き」(インターフェースからそれを実装するタイプへ)か「上向き」(具象タイプからそれに割り当てられる可能性のあるインターフェースへ)かを判断するようになりました。例えば、

  • implementation(io.Reader) は、io.ReadCloser のようなサブインターフェースと、*os.File のような具象実装を含みます。

  • implementation(os.File) は、io.Readerio.ReadCloser のようなインターフェースのみを含みます。

インターフェースから開始する「上向き」クエリを要求するには、例えば io.ReadCloser のスーパーインターフェースを見つけるには、以下で説明する型階層機能を使用してください。(https://github.com/microsoft/language-server-protocol/issues/2037 を参照してください。)

型階層のサポート

Gopls は、型階層ビューアに関連する3つの LSP メソッドを実装しました。textDocument/prepareTypeHierarchytypeHierarchy/supertypestypeHierarchy/subtypes

VS Code で、コンテキストメニューから「Show Type Hierarchy」を選択すると、選択した名前付き型のすべてのスーパータイプまたはサブタイプを表示するツリーウィジェットが表示されます。

編集機能

補完:新しいGoファイルのパッケージ句を自動補完

Gopls は、新しく作成されたGoファイルに適切な package 句を自動的に追加するようになったため、すぐに興味深い部分の記述を開始できます。

これは workspace/didCreateFiles のクライアントサポートを必要とします。

Organize Importsと未インポートの補完を高速化するための新しいGOMODCACHEインデックス

デフォルトでは、goplsはモジュールキャッシュ(GOMODCACHE)内のパッケージの永続的なインデックスを構築および維持するようになりました。Organize Importsと未インポートのパッケージからのシンボルの補完の操作は、桁違いに高速化されます。

以前の動作に戻すには、importsSource オプション(新しいデフォルトは "gopls")を "goimports" に設定します。インポートや補完にモジュールキャッシュを一切使用したくないユーザーは、オプションを「off」に変更できます。

分析機能

ほとんどの staticcheck アナライザがデフォルトで有効

Staticcheck スイートのアナライザの半分強がデフォルトで有効になりました。このサブセットは、精度と効率のために選択されました。

以前は、実験的な staticcheck ブールオプションが true に設定されている場合にのみ、Staticcheck アナライザ(すべて)が実行されていました。この値は引き続き完全なセットを有効にし、false の値は引き続き完全なセットを無効にします。オプションを未指定のままにすると、推奨されるアナライザのサブセットが有効になります。

Staticcheck アナライザは、他のすべてのアナライザと同様に、analyzers 設定を使用して明示的に有効または無効にすることができます。この設定は staticcheck 設定よりも優先されるため、staticcheck の値(true/false/未設定)に関係なく、好みの分析ツールのセットを調整できます。

recursiveiter: 「非効率な再帰イテレータ」

再帰的なデータ型に対してイテレータ (iter.Seq) を返す関数を書く際のよくある落とし穴は、その実装から関数を再帰的に呼び出すことで、ネストされたコルーチンのスタックを招き、非効率的になることです。

新しい recursiveiter アナライザは、そのような間違いを検出します。シンプルで効率的な再帰イテレータを定義するためのヒントを含む詳細については、そのドキュメントを参照してください。

maprange: 「マップのキー/値に対する非効率な範囲」

新しい maprange アナライザは、range ループのオペランドとして maps.Keys または maps.Values への冗長な呼び出しを検出します。マップは当然、直接範囲指定できます。(詳細については、そのドキュメントを参照してください)。

コード変換機能

メソッドレシーバの名前変更

名前変更操作は、メソッドレシーバの宣言に適用される場合、同じ名前付き型に関連付けられている他のすべてのメソッドのレシーバも名前変更しようとします。完全に名前変更できない他のレシーバは、静かにスキップされます。

メソッドレシーバの*使用箇所*の名前変更は、その変数のみに影響し続けます。

type Counter struct { x int }

                 Rename here to affect only this method
                          ↓
func (c *Counter) Inc() { c.x++ }
func (c *Counter) Dec() { c.x++ }
      ↑
  Rename here to affect all methods

「ドットインポートを削除」コードアクション

このコードアクションは、ドットインポートに対して利用可能で、インポートを通常のインポートに置き換え、パッケージの各使用箇所にその名前を付けることを提案します。

構造体フィールドにタグを追加/削除

Gopls は、構造体全体またはその一部のフィールドに対して利用可能な2つの新しいコードアクションを提供し、構造体タグの追加と削除を可能にします。スネークケース命名形式の「json」タグのみを追加するか、選択範囲内のすべてのタグをクリアします。

タグの追加例

type Info struct {
    LinkTarget string        ->      LinkTarget string `json:"link_target"`
    ...
}

ローカル変数のインライン化

新しい refactor.inline.variable コードアクションは、ローカル変数への参照をその変数の初期化式に置き換えます。たとえば、println(s)s に適用された場合、

func f(x int) {
    s := fmt.Sprintf("+%d", x)
    println(s)
}

コードは次のように変換されます。

func f(x int) {
    s := fmt.Sprintf("+%d", x)
    println(fmt.Sprintf("+%d", x))
}

単一の参照のみが置き換えられます。変数すべての使用箇所を「インライン化」して削除する機能は、https://go.dokyumento.jp/issue/70085 で追跡されています。

貢献者の皆様、ありがとうございました!

@acehinnnqru @adonovan @albfan @aarzilli @ashurbekovz @cuonglm @dmitshur @neild @egonelbre @shashank priyadarshi @firelizzard18 @gopherbot @h9jiang @cuishuang @jakebailey @jba @madelinekalil @karamaru alpha @danztran @nsrip dd @pjweinb @findleyr @samthanawalla @seankhliao @tklauser @vikblom @kwjw @xieyuschen


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