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

gopls で知る言語サーバー

Avatar for yushin yushin
June 18, 2025
300

gopls で知る言語サーバー

最近「言語サーバーって何?」と興味を持ち、 Go の言語サーバー gopls を通じて仕組みを調べてみました。 本 LT では、 LSP の基本や gopls の動作、そして自作クライアントで直接会話してみた体験を紹介します。

Avatar for yushin

yushin

June 18, 2025
Tweet

Transcript

  1. hover 時のLSP 通信 initialize → didOpen → hover の流れを観察 LSP

    のリクエスト・レスポンスを可視化 7
  2. didOpen リクエスト { "jsonrpc":"2.0", "method":"textDocument/didOpen", "params":{ "textDocument":{ "uri":"file:///Users/yushinmatsuura/playground/gopls/temp.go", "languageId":"go", "version":1,

    "text":"package main\n..." }}} サーバーがファイル内容を受け取り、解析を開始 コードの同期のための処理でdidChange などもある 9
  3. hover レスポンス { "jsonrpc":"2.0", "result":{ "contents":{ "kind":"markdown", "value":"```go\nvar values []int\n```"

    }, "range":{ "start":{"line":7,"character":9},"end":{"line":7,"character":15} } }, "id":2 } 11
  4. セマンティックトークンの深掘り 1. didOpen などでテキストを読み込む 2. textDocument/semanticTokens/full メソッドなどでセマンティック トークンを取得 ast node

    からセマンティックトークンを作成 DLP レスポンスのためにエンコード 3. クライアントがレスポンスを受け取り、反映する 13
  5. 14

  6. 15

  7. 16

  8. エンコード 期待されているレスポンスの型: uinteger[]; { line: 2, startChar: 5, length: 3,

    tokenType: "property", tokenModifiers: ["private", "static"] }, { line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] }, { line: 5, startChar: 2, length: 7, tokenType: "class", tokenModifiers: [] } [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0] 17