VSCode goでref countが出ないのがダルすぎるので暫定解決
概要
いろいろあって出ないので出るようにした。
というかさあ、カウント見れた方が楽じゃん。 at glance の力をみくびらない。
方針
元々この機能自体はVSCode go extensionに存在してたんだけど、go modに対応する前に開発が終わってしまって、、という顛末らしい。
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、、 という依存がある。へえ、、、なんで、、?
まあいいんだけどさ。目的は叶えられそう。
-> 叶えられた。