goplsでworkspace/symbolが使いたい

現状の最新版(gopls/v0.2.2-pre2)では未実装。

daisuzu.hatenablog.com

を書いていたら欲しくなったので第1回 ゴリラ合宿で実装したのがコチラ。

github.com

symbolの探索はServersessionViews()から Snapshotを取ってきて、
KnownPackages()CompiledGoFiles()Parse()して*ast.Fileを引っ張り出して、
あとは地道にWorkspaceSymbolParamsにマッチするものを探していくようにした。

ただ、WorkspaceSymbolParamsの仕様*1がよくわかっておらず、実装の仕方も上記のやり方で良かったのか全然わかっていない。
また、最初は素直にスライスを作るように実装してみたところ、Vimから:tselectなどを実行すると

  • タグが重複したり、
  • 実行するたびに順番が変わったり、

するので、
重複を排除した上で、Vimで指定した文字列に近く、現在のパッケージに近いものを優先するようにしてみた。

とりあえず自分用としては使えそうなので色々と試してみることにする。

*1:特にQuery