Open14

go/analysisのPlaygroundで動かしたい

tenntenntenntenn

型チェックはデフォルトでは.aファイルを読みに行くので、ファイルシステムがまともに用意されていないWasmでは厳しい。しかし、types.Importerインタフェースを実装すればどうにかなる。

types.Importerインタフェースの実装は、go/importerパッケージにあり、デフォルトの挙動はgcとかgccgoとかになってる。しかし、sourceを指定すると、ソースコードから型チェックをやってくれる。
https://cs.opensource.google/go/go/+/refs/tags/go1.18.2:src/go/importer/importer.go;l=65

tenntenntenntenn

ファイルの読み込みをfs.FSとかからに置き換えることができれば、embed.FSを使ったり、txtarfsを使ったりできる。

srcimporterはbuild.Defaultを使っていて、こいつが実はフィールドでファイルシステムへのアクセスを抽象化しているので、入れ替えることは可能。パッケージ変数のフィールドを入れ替えるのは忍びないけど。

https://pkg.go.dev/go/build#Context

tenntenntenntenn

fmt.Println関数の引数をちょっと変えて、_gopath/src/fmt以下に起き、embedしてみて、そのembed.FSからファイルを読み込むようにしてみる。GOROOTを入れ替えて置く必要がある。

https://github.com/gostaticanalysis/exp/tree/typecheck-embed

うまく読み込めた。

$ go run main.go
IsDir _gopath/src/fmt
ReadDir _gopath/src/fmt
OpenFile _gopath/src/fmt/fmt.go
OpenFile _gopath/src/fmt/fmt.go
func fmt.Println(s string)

最後に出てるのがfmt.Printlnの情報で本物のシグネチャとちょっと違うのが分かる。つまりうまく読み込めている。