Rustの関連コードに集中するためのFlowistry IDEプラグイン
(github.com/willcrichton)- FlowistryはRust向けIDEプラグインで、現在注目したいコードに関連する部分だけを表示する機能を提供する。
- このプラグインはRustコード内の情報フローを解析し、現在見ている変数や式と直接的に接続されているコードのみを視覚的に強調表示する。
- VSCodeプラグインとして簡単にインストールでき、選択した変数に影響を与える、または影響を受けるコードだけを明るく表示する。
- 「Focus mode」、**「Mark設定」**などの各種機能を通じて、大規模関数や複雑なコードの理解度を高められる。
- 内部可変性の処理不足、解析範囲の制限などの制約はあるものの、現在も発展中で、Rust Analyzerとは別ツールである。
Flowistryの概要と重要性
FlowistryはRust開発者向けのIDEプラグインで、コード内で現在注目したい部分と関連するコードのみを浮かび上がらせて示すツールである。大規模関数や複雑なコードフローの中で必要な部分を素早く明確に把握できるため、他の静的解析ツールとは異なる実用的価値を提供する。中核技術は情報フロー解析で、これはプログラム内であるコードが別のコードへ影響を及ぼし得る経路を特定するデータフロー解析方式である。Flowistryはこの情報フロー解析を、Rust言語の特性である所有権/ライフタイムシステムとRust MIR(ミドルレベル中間表現)をベースに提供する。
主な機能と動作
- Rustコード内で特定の変数または式をクリックすると、対象箇所に影響を与える、または影響を受けるコードを除外またはぼかし処理する。
- 直感的に関連コードのみを強調することで、不要なコード読みに費やす時間を減らし、コードの主要な流れを素早く把握できる。
- 大規模な関数や、Rustコンパイラの実関数のような複雑なコード内で、特定の引数がどのような役割を果たすかを一目で確認できる。
- 解析の基盤となるアルゴリズムは、**PLDI 2022で公開された『Modular Information Flow through Ownership』**論文に基づいている。
インストールと対応環境
IDEプラグインのインストール
- FlowistryはVSCodeプラグインとして、Visual Studio MarketplaceまたはOpen VSX Registryからインストールできる。
- Rustワークスペースを開くと、自動でインストールと初期化が行われる。
- NixOSは未対応で、ARM(M1 Macなど)ではソースから直接ビルドする必要がある。
Rustcプラグイン
- 情報フロー解析機能そのものを別crateとして公開しており、詳細なドキュメントとAPIも併せて提供されている。
使い方と機能の詳細
初期起動
- VSCodeでプラグインを起動すると、コードベース全体の型チェックが先に実行される。
- この結果は
target/flowistryフォルダにキャッシュされる。
Focusモードに入る
- プラグインの「Toggle focus mode」コマンド(Ctrl+R Ctrl+Aなど)を使ってフォーカスモードに入る。
- カーソルを関数内に置くと、その関数内で自動的に情報フロー解析が実行される。
- プラグインが解析を完了すると、関連するコードのみがハイライトされる(解析には最大で約15秒かかることがある)。
Mark設定
- 特定のフォーカス領域を固定しつつ別のコードを確認する際、"Mark"の概念を使って現在の領域を保持できる。
- 「Set mark」(Ctrl+R Ctrl+S)、"Unset mark"(Ctrl+R Ctrl+D) で固定/解除できる。
フォーカス領域を選択
- 「Select focused region」コマンドを使うと、ハイライトされたコードブロック全体を一度に選択して、コピー、コメントアウトなどの編集が可能になる。
制約事項と注意点
- 内部可変性(Interior Mutability)の完全なサポートはない
- 例: Arc、Mutexなどの構造体では、参照間のライフタイム差によって完全な追跡ができない。
- フォーカス領域が予想より広がることがある
- 呼び出された関数の内部まで実際に解析できないため。
- 選択不能なコードが存在する
- MIRレベルでソースコードとのマッピングに限界があるため、すべてのコードが選択可能なわけではない。
- 関数のネスト、クロージャ、asyncなどは同時に解析できない
- 常に現在カーソルが属する最小関数単位のみが解析される。
FAQなど
- rustupインストールが失敗した場合: rustupを手動でコマンド経由でインストールした後、VSCodeで継続して進める必要がある。
- Rust Analyzerと統合されない理由: Rust AnalyzerはMIR解析とborrow checkerをサポートしていないため、別プラグインとして提供されている。
- コードハイライト関連の問題: 制約事項のドキュメントを参照し、追加の問い合わせはGitHub Issues、Discord、Twitterで可能。
ライセンスとオープンソース情報
- MITライセンスで公開されている。
- 主なプログラミング言語はRust、TypeScriptで、Python、HTML、JavaScriptなどがある。
- 2025年9月時点で2.6k stars、61 forksを有し、活発に開発・保守が続けられている。
結論
FlowistryはRust開発環境において、複雑なコードの文脈把握と集中力向上に実際に大きな利点をもたらすオープンソースツールである。特に情報フロー解析をリアルタイムでIDEに統合し、視覚的に提示するという点で、従来の静的解析ツールやRust Analyzerと異なる体験を提供する。Rust言語の学習、リファクタリング、コードレビューなど、さまざまな状況で高い実用性と効率性が期待できる。
1件のコメント
Hacker Newsのコメント
実際の論文はこちら。Rustで静的にチェックされる back-reference について長い間考えている。C/C++ ユーザーが Rust に不満を持つ大きな理由のひとつは、A が B を参照するときに B から A へ戻るポインタを持たせにくい点で、そのためたいていは危険な回避策が使われがちだ。
Rust では
Rc、RefCell、Weak、borrow()、borrow_mut()、upgrade()、downgrade()などを使えば安全に実装できるが、コードが冗長になり、ランタイムオーバーヘッドが生じ、二重 borrow でパニックが起きることもある。それでも表現力は十分ある。現在進めている作業についてはノートにまとめてある。静的チェックが難しい部分は、borrowed なスコープが重なっていないかを確認することだが、ライフタイムのスコープが重ならなければ衝突はない。関数呼び出しやジェネリック関数呼び出しではスコープチェックがさらに厄介になる。Flowistry のアプローチは役に立つかもしれない。
Flowistry が interior mutability(
RefCellなどの内部可変性)を完全には扱っていない点が気になる。実運用では、1) sound であること、2) コンパイル時に低コストでチェックできること、3) ツリーの親ノード参照のように、多くの人が必要とする back pointer を使えること、4) 問題発生時に有用な診断メッセージを提供すること、のような条件を満たす制約を見つけるのが重要だ。
他の言語に、関数本体内のもう少し大きい、あるいは非公式な依存関係をチェックする機能があるのか気になる。
たとえば引数や変数
fooをハイライトしたとき、foo自体の使用だけでなく、fooから作られたすべての変数の使用までまとめて見られるのか知りたい。Rust の borrow の使用はこの種の追跡を完璧に実現するが、このような可視化は他言語のコードでもとても有用だと思う。
Flowistry は、servo の flexbox レイアウトコードのような、保守が難しい現代的なコードベースのファイルで非常に必要とされるだろう。ちなみにこの関数は 400 行を超える、かなり厄介なコードのひとつだ。
(自分が間違っているかもしれないが)一般にはこういうものを "flow analysis" と呼び、TypeScript はこれをバックグラウンドで実行して型を絞り込んでいる。
ただし可視化機能はない。
この種の機能は一般に "program slicing" と呼ばれる。
人間が読みやすいよう最適化したスタイルでコーディングしていないとき、それを補ってくれる非常に有用なツールだと思う。
ベースコードが常に読みやすく書かれているわけではないので、こうしたツールは大いに役立つと感じている。
著者は Rust East Coast で、プラグインとルーチン研究について深く扱った発表動画を披露している。
本当にすばらしい機能だと思う。Rust がこの種の機能に向いているのは、所有権システムのおかげで副作用が制限されているからだ。
Python などにこれを付けても、ランタイムではいつでもコールスタックをさかのぼってメモリ操作ができるので、100% 信頼することはできない。
それでも大半の場合は正しいので、この機能が追加されることを願っている。
TypeScript や JavaScript に、これに似たツールがあるのか気になる。
良さそうだが、わざわざ "IDE" と呼ばず、単に VSCode プラグインと言ったほうがよかった気がする。
おそらく "Visual Studio Code" が Microsoft の商標だからだろう。プラグインは VSCodium、Cursor など、オープンソースベースの IDE 全般で動作する。
ドキュメントにも IDE プラグインと明記されている。
コードの重要な部分に焦点を当てるというアイデアが本当に良い。
JS/TS にもこれに似たものがあるのか気になる。
rust-analyzer の
documentHighlightLSP メソッドへの貢献はどうだったのか気になる。GIF で見せている機能とかなり似た動きをしている。
プラグインとして作るには、あまりに特化した機能のように思える。
関連する LSP 仕様へのリンク
README で説明されていて、詳しくはこちらで読める。
MIR(Mid-level Intermediate Representation)が必要になる。
こういう機能をずっと夢見ていて、関数の外側(この関数を誰が呼んでいるか)からデータが流れ込む経路まで見せてくれたらと思っていた。
コンパイラのデータを再利用して、こうしたことを助けられないだろうかと思う。