$30 off During Our Annual Pro Sale. View Details »

gopls を改造したら開発生産性が高まった

gopls を改造したら開発生産性が高まった

Satoru Kitaguchi

October 24, 2024
Tweet

More Decks by Satoru Kitaguchi

Other Decks in Programming

Transcript

  1. About Me Satoru Kitaguchi • 株式会社エウレカ ◦ Product Back-end Team

    ▪ Go ▪ Pairs の機能開発‧保守‧運⽤ ◦ 平⽇も休⽇も Vim をいじってます ▪ Vim Conf 2024 参加します!
  2. ★ LSP とは ★ 静的解析の役割 ★ 改造版 gopls 導⼊の背景と導⼊してみて ★

    改造版 gopls の作り⽅ ★ 改造版 gopls の運⽤⽅法 ★ まとめ Agenda
  3. 1. 組み込み戦略 textDocument/diagnostic & textDocument/codeAction • 静的解析のナレッジを使える • 独⾃ Analyzer

    を Plugin ライクに 追加できる • コマンドラインから使いやすい ◦ GoLand に優しい • ほとんどメンテフリー textDocument/completion & snippet support • 本家とConflict が発⽣しやすい • Analyzer を組み込む形にはできない • コマンドラインから使いにくい • GoLand で使うのが厳しそう • メンテ必須 ◦ gopls を拡張する必要があるため
  4. 2. Analyzer の作成 - textDocument/diagnostic textDocument/diagnostic を表⽰する analysis#Analyzer を作成するには analysis#Pass.Reportf

    を使⽤して Diagnostic を報告する 第1引数にコードの位置、第2引数に書式、第3引数以降にはその引数を取ってエラーを報告する analysis#Pass.Report の helper 関数になっている
  5. 2. Analyzer の作成 - textDocument/codeAction textDocument/codeAction を使⽤する analysis#Analyzer を作成するには analysis#Pass.Report

    に analysis#Diagnostic を指定して analysis#SuggestedFix で修正候補を表⽰する リファクタリングやエラー修正など修正内容が明確なユースケースで使⽤する
  6. ORM XORM から MasterMinds/squirrel に安全に移⾏するために ワイルドカードを禁⽌し全カラムを⾃動⼊⼒する静的解析ツールの実⾏例 2. Analyzer の作成 -

    textDocument/codeAction の例 - VSCode cursor を合わせて Quick Fix を表⽰すると 実⾏可能な textDocument/codeAction を選べる
  7. ORM XORM から MasterMinds/squirrel に安全に移⾏するために ワイルドカードを禁⽌し全カラムを⾃動⼊⼒する静的解析ツールの実⾏例 2. Analyzer の作成 -

    textDocument/codeAction の例 - VSCode 実⾏すると全カラムが⾃動⼊⼒された! omit tag がついているカラムは⾃動⼊⼒の対象外になっている
  8. 2. Analyzer の作成 - textDocument/codeAction の例 - Vim 34~36⾏⽬がハイライトされている :LspDocumentDiagnostics

    を実⾏して 診断結果を表⽰する (直接遷移することもできるが、 わかりやすさのためファイル全体の診断を⾏う) ORM XORM から MasterMinds/squirrel に安全に移⾏するために ワイルドカードを禁⽌し全カラムを⾃動⼊⼒する静的解析ツールの実⾏例
  9. 2. Analyzer の作成 - textDocument/codeAction の例 - Vim 診断結果を Location

    List で確認して 診断結果までジャンプする cursor を合わせるとコマンドラインに メッセージが表⽰される ORM XORM から MasterMinds/squirrel に安全に移⾏するために ワイルドカードを禁⽌し全カラムを⾃動⼊⼒する静的解析ツールの実⾏例
  10. 2. Analyzer の作成 - textDocument/codeAction の例 - Vim :LspCodeAction quickfix

    を実⾏すると 全カラムが⾃動⼊⼒された! omit tag がついているカラムは ⾃動⼊⼒の対象外になっている :LspDocumentDiagnostics の実⾏は必須ではなく :LspNextDiagnostics など任意の動作で移動した後 そのまま textDocument/codeAction を実⾏できる また複数の textDocument/codeAction が有効な場合は lsp-quickpick を利⽤して選択することができる (Vim) ORM XORM から MasterMinds/squirrel に安全に移⾏するために ワイルドカードを禁⽌し全カラムを⾃動⼊⼒する静的解析ツールの実⾏例
  11. 2. Analyzer の作成 - textDocument/codeAction の例 - Vim golden 形式で⽐較する

    Controller 単位の endpoint テストを⾃動作成する例 7~9⾏⽬がハイライトされている :LspDocumentDiagnostics を実⾏して 診断結果を表⽰する (直接遷移することもできるが、 わかりやすさのためファイル全体の診断を⾏う)
  12. 2. Analyzer の作成 - textDocument/codeAction の例 - Vim golden 形式で⽐較する

    Controller 単位の endpoint テストを⾃動作成する例 診断結果を Location List で確認して 診断結果までジャンプする cursor を合わせるとコマンドラインに メッセージが表⽰される
  13. 2. Analyzer の作成 - textDocument/codeAction の例 - Vim golden 形式で⽐較する

    Controller 単位の endpoint テストを⾃動作成する例 :LspCodeAction quickfix を実⾏すると テストが⾃動⽣成された! :LspDocumentDiagnostics の実⾏は必須ではなく :LspNextDiagnostics など任意の動作で移動した後 そのまま textDocument/codeAction を実⾏できる また複数の textDocument/codeAction が利⽤できる場合 lsp-quickpick を利⽤して選択できる (Vim)
  14. golden 形式で⽐較する Controller 単位の endpoint テストを⾃動作成する例 2. Analyzer の作成 -

    textDocument/codeAction の例 - VSCode ハイライトされた7~9⾏⽬から実⾏できる
  15. golden 形式で⽐較する Controller 単位の endpoint テストを⾃動作成する例 2. Analyzer の作成 -

    textDocument/codeAction の例 - VSCode cursor を合わせて Quick Fix を表⽰すると 実⾏可能な textDocument/codeAction を選べる
  16. golden 形式で⽐較する Controller 単位の endpoint テストを⾃動作成する例 2. Analyzer の作成 -

    textDocument/codeAction の例 - VSCode 実⾏するとテストの雛形が作成された!
  17. 3. Analyzer の組み込み analysis#Analyzer の追加⼿順 1. golang.org/x/tools/eure/analyzer に Analyzer を実装する

    2. golang.org/x/tools/gopls/internal/settings/eure.go に1を追加する 3. cmd に1を追加する
  18. 3. Analyzer の組み込み analysis#Analyzer の追加⼿順 1. golang.org/x/tools/eure/analyzer に Analyzer を実装する

    2. golang.org/x/tools/gopls/internal/settings/eure.go に1を追加する 3. cmd に1を追加する
  19. 4. Editor / IDE の連携 Vim / VS Code 改造版

    gopls が使われていることを確認するだけ! GoLand gopls を使⽤しないため integration が必要 コマンドライン経由で発⽕させたり、Kotlin で Plugin を書いたり
  20. linter と reviewdog の連携 CI でも gopls 同様の Analyzer のチェックをしたい!

    →まとめて1つの linter として定義し PR で reviewdog に指摘してもらう gopls check でも良いけれど下記の点でmulticheckerを使うことに ★ package 単位で実⾏したい ★ 静的解析ツール追加時に go-tools のみの変更に留めたい
  21. まとめ 独⾃ Analyzer を組み込めるように gopls を改造して 運⽤を始めてから2年以上経った ★ リアルタイムで修正できることで開発⽣産性が向上 ★

    チーム全員で静的解析ツールを追加/メンテできるように gopls 改造は簡単に始められます。 公式に拡張がサポートされる未来にも期待しましょう。