Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoのLanguage Server Protocol実装、 「gopls」の自動補完の仕組みを学ぶ

Shoki Hata
June 07, 2024
1.4k

GoのLanguage Server Protocol実装、 「gopls」の自動補完の仕組みを学ぶ

Go Conference 2024の資料です

※13枚目に誤解を招く表現がありました。Golandのバックエンドはgoplsではなく独自のものです。

Shoki Hata

June 07, 2024
Tweet

Transcript

  1. 2 2 software engineer at Kanmu, Inc. 畠 翔紀 /

    Shoki Hata GitHub @sho-hata X @sho_hata_ 自己紹介
  2. 16 16 Go Language Server Go Language Client Language Server

    Protocol JSON RPC gopls PHP gopls is Language Server for Golang
  3. 18 18 gopls以前 VSCode vim etc... Go 拡張機能 gopkgs go-outline

    go-simples guru gorename gomodifytags goplay godef gotype-live gocode gogetdoc goimports goreturns gofmt golint impl gometalinter staticcheck golangci-lint revive fillstruct dlv godoctor gotests
  4. 19 19 gopls以後 VSCode vim etc... Go 拡張機能 gopkgs go-outline

    go-simples guru gorename gomodifytags goplay godef gotype-live gocode gogetdoc goimports goreturns gofmt golint impl gometalinter staticcheck golangci-lint revive fillstruct dlv godoctor gotests gopls
  5. 26 26 cache カーソルの位置情報 構文木 カーソルの位置情報 補完結果 エディタ *.go go.mod

    タイミング: 初期化や都度ファイル変更など snapshot completion gopls gopls
  6. 31 31 • サーバー ◦ リクエスト解析、処理振り分け • 補完処理 ◦ キャッシュからパッケージ情報の探索

    ◦ カーソル周辺の構文木解析 ◦ 補完必要かどうか判断 ◦ 補完候補の収集、スコア重みづけ • サーバー ◦ 補完結果をレスポンスとして返却 大まかな流れ
  7. 32 32 • サーバー ◦ リクエスト解析、処理振り分け • 補完処理 ◦ キャッシュからパッケージ情報の探索

    ◦ カーソル周辺の構文木解析 ◦ 補完必要かどうか判断 ◦ 補完候補の収集、スコア重みづけ • サーバー ◦ 補完結果をレスポンスとして返却 大まかな流れ
  8. 34 34 • サーバー ◦ リクエスト解析、処理振り分け • 補完処理 ◦ キャッシュからパッケージ情報の探索

    ◦ カーソル周辺の構文木解析 ◦ 補完必要かどうか判断 ◦ 補完候補の収集、スコア重みづけ • サーバー ◦ 補完結果をレスポンスとして返却 大まかな流れ
  9. 39 39 • ★補完コンテキスト(スコープ)に マッチしているか • プライベートオブジェクト 補完候補のスコア重みづけ スコアUP スコアDown

    • メソッド呼び出し • foo[0]のようなインデックス 修飾子 ソース:gopls/internal/golang/completion/deep_completion.go addCandidateメソッド
  10. 43 参考情報 • gopls Design Documetion ◦ https://github.com/golang/tools/blob/master/gopls/doc/design/design.md • gopls

    Architecture ◦ https://github.com/golang/tools/blob/master/gopls/doc/design/implementation.md • Scaling gopls for the growing Go ecosystem ◦ https://go.dev/blog/gopls-scalability • Language Server Protocol の仕様 及び実装方法 ◦ https://zenn.dev/mtshiba/books/language_server_protocol • gocode やめます(そして Language Server へ) ◦ https://mattn.kaoriya.net/software/lang/go/20181217000056.htm