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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for Satoru Kitaguchi

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 改造は簡単に始められます。 公式に拡張がサポートされる未来にも期待しましょう。