Flowistryは、錆プログラムの情報フローを分析するツールです。 Flowistryは、あるコードが別のコードに影響を与える可能性があるかどうかを理解しています。 FlowistryはIDEに統合され、現在のタスクに関連するコードに集中するのに役立つ「フォーカスモード」を提供します。
たとえば、このGIFは、ユニオンが2つのセットを組み合わせる関数を読み取るときにフォーカスモードを示しています。

ユーザーが特定の変数または式をクリックすると、Flowistryはそのコードに影響を与えないすべてのコードをフェードアウトし、そのコードの影響を受けません。たとえば、 orig_len for-loopの影響を受けませんが、 set.len()はです。
多くのコードを使用して関数を読んでいる場合、フローストリストは役立ちます。たとえば、このGIFはRustコンパイラの実際の関数を示しています。関数に対する特定の引数の役割を理解したい場合、Flowistryはほとんどのコードを無関係であるとフィルタリングできます。

Flowistryを電力するアルゴリズムは、PLDI 2022の論文「所有権によるモジュラー情報フロー」に掲載されました。
目次
FlowistryはVSCODEプラグインとして利用できます。 Visual Studio MarketplaceまたはOpen VSXレジストリからFlowistryをインストールできます。 vscode:
プラットフォームサポートに関する注意: FlowistryはまだNixosをサポートしていません。 Flowistryは、M1 MacなどのARMターゲットに事前に構築されたバイナリを提供することはできないため、これらのターゲットにフローストリストをゼロからインストールする必要があります(これはあなたのために行われますが、通常よりも数分かかります)。
または、ソースからインストールすることもできます。
# Install flowistry binaries
git clone https://github.com/willcrichton/flowistry
cd flowistry
cargo install --path crates/flowistry_ide
# Install vscode extension
cd ide
npm install
npm run build
ln -s $(pwd) ~/.vscode/extensions/flowistry
根本的な分析に興味がある場合は、crates.io:https://crates.io/crates/flowistryに公開されているflowistryクレートを使用できます。
ドキュメントはhttps://willcrichton.net/flowistry/flowistry/で公開されています。
注:docs.rsは
#![feature(rustc_private)]を使用する木枠のドキュメントをサポートしていないため、ホストする必要があります。
最新の流量には、 Rust 1.73の最大サポートされたRustバージョンがあることに注意してください。 Flowistryは、1.73以降に実装された機能を使用して動作することは保証されていません。
Flowistryをインストールしたら、VSCodeでRust Workspaceを開きます。このアイコンは、下部のツールバーに表示されます。

Flowistryは、CodeBaseをチェックする型から起動します。多くの依存関係がある場合、これには数分かかる場合があります。
注:flowistryタイプチェックの結果は
target/flowistryディレクトリにキャッシュされています。このフォルダーを削除する場合、Flowistryはタイプを再計算する必要があります。また、大規模なコードベースの場合、このディレクトリはかなりの量のディスクスペースを占有する場合があります。
Flowistryが起動すると、読み込みアイコンが消えます。次に、「トグルフォーカスモード」コマンドを実行して、フォーカスモードを入力できます。デフォルトでは、キーボードショートカットはCtrl+r Ctrl+A(MACの⌘+r⌘+A)です。または、フローストリティコンテキストメニューを使用できます。

フォーカスモードでは、Flowistryは、カーソルをそこに配置すると、特定の関数内の情報フローを自動的に計算します。 Flowistryが分析が終了すると、ステータスバーは次のようになります。

注:より大きな関数では、フローストリティは少し遅くなる可能性があります。分析を終了するには最大15秒かかる場合があります。
Flowistryは、カーソルに基づいて焦点を合わせたいものを推進します。したがって、変数をクリックすると、その変数のフォーカス領域が表示されます。 Flowistryは、グレーのフォーカスコードを強調表示し、フォーカス領域の外でコードをフェードアウトします。たとえば、ユーザーのカーソルはview_projectionにあるため、その変数は灰色で強調表示され、そのフォーカス領域が表示されます。

フォーカス領域を維持し、フォーカスをクリックしてフォーカスを変更せずに検査する場合があります。この目的のために、Flowistryには「マーク」の概念があります。焦点を合わせるコードを選択したら、「set mark」コマンド(ctrl+r ctrl+s /⌘+r⌘+s)を実行できます。次に、カーソルの現在の位置にマークが設定され、「Unset Mark」コマンド(Ctrl+R Ctrl+D /⌘+R⌘+D)を実行するまで焦点が留まります。
フォーカス領域のすべてのコードを変更したい場合は、コメントアウトまたはコピーする場合は、「focused領域の選択」コマンド(ctrl+r ctrl+t /⌘+r⌘+t)を実行できます。これにより、フォーカス領域全体が編集者の選択に追加されます。
Flowistryは、錆の情報分析の用途への積極的な研究プロジェクトです。分析技術と相互作用パラダイムを実験するにつれて、継続的に進化しています。したがって、Rust Analyzerのようなツールほど洗練されていないか、効率的ではありませんが、それでも便利であることを願っています。それにもかかわらず、驚きを避けるためにフローストリストを使用するときに理解すべき重要な制限がいくつかあります。
質問や問題がある場合は、GitHubの問題を提出してください。TwitterでDiscordまたはDM @Wcrichtonに参加してください。
コードに参照がある場合、Flowistryはその参照ポイントから何を理解する必要があります。 Flowistryは、Rustの生涯情報を使用して、ポイントツー情報を決定します。ただし、 Arc<Mutex<T>>などのインテリア変動性を使用するデータ構造は、ポインター間の寿命を同じデータに明示的に共有しません。たとえば、このスニペットで:
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ;流れは、 *x.lock().unwrap() = 1 xへの突然変異であると判断できますが、それがyの突然変異であると判断することはできません。したがって、 yに焦点を合わせると、 yの値に関連していても、1への割り当てはフェードアウトされます。
私たちはこの制限を克服するための方法を研究していますが、今のところ、これが誤った答えを提供することが知られている主なケースであることに注意してください。
Flowistryの分析は、焦点に影響を与える可能性のあるすべてのコードを含めようとします。この分析は、実用的および基本的な理由の両方で多くの仮定を行います。たとえば、このスニペットで:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; 3行目でvに焦点を合わせると、v.get_mut(0)がv v.get_mut(0)を変更できます。その理由は、流れが実際に呼び出された関数の体を分析するのではなく、むしろその型シグネチャに基づいて近似するからです。 get_mut &mut self入力として取得するため、ベクトルを変更できると想定しています。
一般に、剪定ツールとしてフォーカスモードを使用する必要があります。コードがフェードアウトされている場合、読む必要はありません(上記の制限を差し引いてください!)。それがフェードアウトされていない場合、それはあなたの仕事に関連するかもしれません。
Flowistryは、Rust CompilerのAPIを使用して特定の関数についてmiRグラフを分析することにより機能します。次に、IDE拡張により、分析の結果がmiRレベルからソースレベルに戻ります。ただし、プログラムに関する多くの情報は、ソースコードからMIRへの旅で失われています。
たとえば、ソースに式foo.whomp.bar().baz()が含まれている場合、式foo.whomp.bar()のみに対して一時変数が生成される可能性があります。したがって、ユーザーがfooを選択した場合、Flowistryがfooを表すmiRの場所に対応することを判断できない場合があります。
これが、IDE拡張機能がグレーのフォーカスコードを強調する理由であるため、カーソルの選択が実際にマップするものを理解できます。
Flowistryは、一度に単一の関数を分析します。関数に他の関数、例えばfn定義、または閉鎖、または非同期を介して暗黙的に含まれている場合、フローストリストは、カーソルを含む最小の関数本体内のフォーカス領域のみを示します。これは通常、関数の定義と閉鎖に対して明確に定義されていますが、それはRustcがあなたの非同期機能を切り開く方法に依存するため、非同期を混乱させる可能性があります。
Rustupが失敗した場合、特に「ダウンロードされたファイルの名前を変更できなかった」などのエラーが発生した場合、これはおそらく、フローストリストが別のツール(Rust-Analyzerなど)と同時にRustupを実行しているためです。 Rustup#988が解決されるまで、残念ながらこれには自動化された方法はありません。
問題を解決するには、コマンドラインに移動して実行します。
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
次に、VSCODEに戻り、[続行]をクリックして、Flowistryをインストールし続けます。
Rust Analyzerは、Flowistryの分析に不可欠な部分であるMiRとBorrow Checkerをサポートしていません。その事実は長い間変わる可能性は低いため、フローストリストはスタンドアロンツールです。
既知の問題については、制限を参照してください。それがあなたが見ているものを説明していない場合は、予期しないハイライトの問題に投稿するか、Discordで尋ねてください。