🦀

vscodeでAtCoderをRustでやっててproconioの型推論が効かないときは

2023/07/24に公開

株式会社ラクーンホールディングスで働いている川崎です。最近Rustの勉強がてらAtCoderをやっています。

AtCoder用の開発環境でproconioを使ったコードを書いたときに、proconioのマクロを利用している部分の補完がエラーになってかなり困ったので解決策を共有します。

要約

  • Visual Studio Code(以下vscode)でproconioのマクロの型推論が効かない
    • 拡張機能rust-analyzerの内部で利用されている実行ファイル(rust-analyzer本体)がatcoderで使えるRust v1.42.0 に対応してないのが原因
    • 参照:こちらの記事
  • 古いバージョンの実行ファイルを自力でDLして、拡張機能がそのファイルを参照するようにすれば型推論が機能するようになる
    • 詳しいやり方は#解決策に書いてます

なにが起こってるの?

  • vscodeで拡張機能rust-analyzerの最新版を利用している
  • vscodeで開いているプロジェクトではRust v1.42.0を利用している
  • vscodeで開いているプロジェクトではproconio = { version = "=0.3.6", features = ["derive"] }を利用している

上述した条件を満たした状態でproconioのマクロを利用すると画像のような状態になる。
proconioのマクロ部分がエラーと判定されたり、型推論が効いていない画像

変数hは本来h: Vec<i64>と型推論されるべきなのだがh: {unknown}となり型推論が効かない。これだとRustの良さが減ってしまう😢。
また、#[fastout]の部分でもエラーが発生してしまっている。

原因

rust-analyzer が 1.47.0 未満との差分を吸収する処理を消したため
https://github.com/rust-lang/rust-analyzer/pull/10457/files

引用元
Yajamon氏の調査に感謝します。🙏

AtCoderで使えるRust v1.42.0はこのコミットによって現在のrust-analyzerサポート対象から外れてしまったようです。

解決策

AtCoder用のプロジェクトの中でだけ古いバージョンのrust-analyzerをvscodeに使ってもらうようにすれば解決する。

1. 古いバージョンのrust-analyzerをダウンロードする

cd AtCoder用のプロジェクトディレクトリ
curl -L https://github.com/rust-lang/rust-analyzer/releases/download/2021-10-04/rust-analyzer-x86_64-unknown-linux-gnu.gz | gunzip -c - > ./rust-analyzer
# 実行権限を付けておく
chmod +x ./rust-analyzer
# 実行ファイルはコミットしてほしくないので、.gitignoreに追加
echo "\nrust-analyzer" >> .gitignore

2. ダウンロードしたrust-analyzerを拡張機能に使ってもらうように設定

AtCoder用プロジェクトの.vscode/settings.jsonを開いて以下を追記します。
無ければ作ってください。

{
  // 他の設定がある場合はここに書く
  "rust-analyzer.server.path":"${workspaceFolder}/rust-analyzer",
}

その後にvscodeでCtrl + Rを押してプロジェクトを再読み込みするか、プロジェクトを閉じて、開き直せばproconioを使っている部分の型推論が有効になり、エラーが消えてるはずです!

感想

Rust v1.42.0のリリースからすでに3年以上経過しています(リリース日は2020-03-12)。
Node.jsもそうですがAtCoderで使える言語のバージョンはちょっと古いので、たまに「あ、これ使えないのか~」みたいな場面に遭遇することがあります。

冒頭にも書きましたが、AtCoderは2023年言語アップデートを企画しているそうで、これが適用されるとおそらく使えるRustのバージョンが1.70.0になるはずです。待ち遠しいですね!
AtCoder運営さん、いつもありがとうございます!

Discussion