VSCode goでref countが出ないのがダルすぎるので暫定解決


概要

いろいろあって出ないので出るようにした。

というかさあ、カウント見れた方が楽じゃん。 at glance の力をみくびらない。



方針

元々この機能自体はVSCode go extensionに存在してたんだけど、go modに対応する前に開発が終わってしまって、、という顛末らしい。

https://github.com/golang/vscode-go/blob/7df32c8f0b36326c4568af4cea37732c360cf23b/CHANGELOG.md#v0360---7-nov-2022

https://github.com/golang/vscode-go/issues/2509


goplsに対してリクエストが出ていて、それをなんとか待つ、のがいいんだけど、まあかかりそうなんで適当に作ろう。



リポジトリ

これ。


https://github.com/sassembla/zanthoxylum

zan、、何とかって何?

山椒だよ。


releases

https://github.com/sassembla/zanthoxylum/releases/tag/0.5.2


どうせそのうちgoplsに該当機能が入ると思うし、ストアに上げる気はないので、自分でvsixを読み込ませたりしてね!!


VSCode extension 開発

https://dev.classmethod.jp/articles/easy-vs-code-extension-development/

この辺を参考に。

自分の環境ではhello~って打っても候補に出てこなくて泣きそうになったんだけど、VSCodeのキャッシュコードが邪魔をしてこういう事態になることがあるっぽい。

以下を消してVSCode入れ直したら動作した。

rm -fr ~/Library/Preferences/com.microsoft.VSCode.helper.plist 

rm -fr ~/Library/Preferences/com.microsoft.VSCode.plist 

rm -fr ~/Library/Caches/com.microsoft.VSCode

rm -fr ~/Library/Caches/com.microsoft.VSCode.ShipIt/

rm -fr ~/Library/Application\ Support/Code/

rm -fr ~/Library/Saved\ Application\ State/com.microsoft.VSCode.savedState/

rm -fr ~/.vscode/


うーん。

似たような症例が見つからなかったので、

Go VSCodeでExtension helloworld する時 動かない とかで検索してこれがヒットするとちょっと幸せかもしれない。



Onなんちゃら

この辺を見る。

https://code.visualstudio.com/api/references/activation-events



参考になりそうなPR

code lenseの位置になんか出す、というextensionがあったので参考にする。

https://github.com/golang/vscode-go/pull/2109/files 参考になった。



TODO

1. VSCodeの適当なイベントを把握する

2. goファイルを開いたら、そのファイルのASTを取り出し、関数の記述位置に対する情報を得る done

3. VSCodeの標準が持っている Find All References(FAR)の 内容を非同期で呼び出しまくる done.

4. 結果をコード上に反映していく done.


こんな感じにすると幸せになれる気がする。



今ここ

1。

package.jsonの"activationEvents" に "onLanguage:go" とかを足すと、goのファイルを開いた時にextension.tsのactivate関数が呼ばれるようになる。一度だけ。

ここをExtensionのentry pointとして扱って良さそう。このタイミングでref center desc machine(仮)を起動しよう。


で、次にgoのファイルを開くたびにそのファイルのASTを取って、関数の位置を全部 FARに放り込みたいので、on open go fileなイベントを探す。

-> できた。



2。

AST読むまで行ってないけど適当にやった、func A() には対応してる、 func () A() には対応してない。今度。

-> VSCodeからちゃんとしたASTもどきが取れるのがわかったので、対応。

https://github.com/sassembla/zanthoxylum/blob/main/src/extension.ts#L57


変数とか構造体に対しても出せそうだね。気が向いたらやる。



3。

done。find all~自体をLSPの実装として呼び出してると思うので、そこを何とかするといい気はする。

一点心残りというか、FARを呼び出す際、おそらくカーソルのselectionを関数名の位置に動かさないとちゃんとFARが起動しない。

今は「手でカーソルを関数名に持って行ってからref countをクリックするとFARがちゃんと起動する」ようになってる。ちょっと残念。



4。

code lenseを出す仕掛け自体は作れた。で、これを更新したいわけなんだけど。

挟み込むようなことが可能になるのがあって、適当にリロードを行うようにしたら平和になった。


コードが切り替わった時にリセットする、とかをやらないといけないのはあるが、大筋は終わった。

-> できた。


キャッシュのような仕掛けを一切持たないでやってるので、うーん、規模が嵩むと重たいのでは、と思っている。



疑問

Q. FARはコードから呼び出せるのか?

A. この辺読むと良さそう。

https://code.visualstudio.com/api/references/commands


試しに呼ぶコードを書いてみるか。

goを開いてる時にcontext menuに現れるやつなので、適切なパラメータを与えればガンガン呼べると思ってるが。

何ならその内容を実行できればいいのはあるので、見ておくと良さそう。


とおもったら

vscode.executeReferenceProvider - Execute all reference providers.

なんつう、バリバリそれじゃん、ってのが見つかった。これの中身を追いたい。


実行するにあたって一個注意点があって、goのExtensionが起動した後でないと、find all reference自体を呼び出しても何もヒットしないのがわかった。

デバッグコンソールに毎回go extの起動ログが出て鬱陶しかったんでオフってたら、なんとずーっと0件だったので、code pointの指定にミスったのかと思っていろいろやったが、

遅延させたら上手くいったので合点がいった。依存してるわけね。


go Extension <- VSCode find all reference、、 という依存がある。へえ、、、なんで、、?

まあいいんだけどさ。目的は叶えられそう。


-> 叶えられた。