Flowistry adalah alat yang menganalisis aliran informasi program karat. Flowistry memahami apakah mungkin satu bagian kode untuk mempengaruhi yang lain. Flowistry terintegrasi ke dalam IDE untuk memberikan "mode fokus" yang membantu Anda fokus pada kode yang terkait dengan tugas Anda saat ini.
Misalnya, GIF ini menunjukkan mode fokus saat membaca fungsi yang serikat dua set bersama -sama:

Ketika pengguna mengklik variabel atau ekspresi yang diberikan, Flowistry memudar semua kode yang tidak mempengaruhi kode itu, dan tidak dipengaruhi oleh kode itu. Misalnya, orig_len tidak dipengaruhi oleh for-loop, sedangkan set.len() adalah.
Flowistry dapat membantu saat Anda membaca fungsi dengan banyak kode. Misalnya, GIF ini menunjukkan fungsi nyata pada kompiler karat. Jika Anda ingin memahami peran argumen spesifik ke fungsi, maka Flowistry dapat menyaring sebagian besar kode sebagai tidak relevan:

Algoritma yang Powers Flowistry diterbitkan dalam makalah "Aliran Informasi Modular Melalui Kepemilikan" di PLDI 2022.
Daftar isi
Flowistry tersedia sebagai plugin vScode. Anda dapat menginstal Flowistry dari Visual Studio Marketplace atau Open VSX Registry. Di vscode:
Catatan tentang Dukungan Platform: Flowistry belum mendukung Nixos. Flowistry tidak dapat menyediakan binari pra-built untuk target lengan seperti Mac M1, sehingga Flowistry harus dipasang dari awal pada target ini (ini dilakukan untuk Anda, tetapi akan memakan waktu beberapa menit lagi dari biasanya).
Atau, Anda dapat menginstalnya dari sumber:
# 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
Jika Anda tertarik dengan analisis yang mendasarinya, Anda dapat menggunakan peti flowistry yang diterbitkan ke crates.io: https://crates.io/crates/flowistry
Dokumentasi ini diterbitkan di sini: https://willcrichton.net/flowistry/flowistry/
Catatan: Docs.rs tidak mendukung dokumentasi untuk peti yang menggunakan
#![feature(rustc_private)]Jadi kami harus meng -hostnya sendiri.
Perhatikan bahwa Flowistry terbaru memiliki versi karat yang didukung maksimum dari Rust 1.73 . Flowistry tidak dijamin bekerja dengan fitur yang diimplementasikan setelah 1,73.
Setelah Anda menginstal Flowistry, buka ruang kerja karat di vscode. Anda harus melihat ikon ini di bilah alat bawah:

Flowistry dimulai dengan memeriksa jenis basis kode Anda. Ini mungkin memakan waktu beberapa menit jika Anda memiliki banyak ketergantungan.
CATATAN: Hasil pengecekan tipe flowistry di-cache di direktori
target/flowistry. Jika Anda menghapus folder ini, Flowistry harus mengkomputasi jenis. Juga untuk basis kode besar direktori ini dapat memakan cukup banyak ruang disk.
Setelah Flowistry boot, ikon pemuatan akan hilang. Kemudian Anda dapat memasukkan mode fokus dengan menjalankan perintah "Toggle Focus Mode". Secara default, pintasan keyboard adalah Ctrl+R Ctrl+A (⌘+R ⌘+A pada Mac), atau Anda dapat menggunakan menu konteks Flowistry:

Dalam mode fokus, Flowistry akan secara otomatis menghitung aliran informasi dalam fungsi yang diberikan setelah Anda meletakkan kursor Anda di sana. Setelah Flowistry selesai analisis, bilah status akan terlihat seperti ini:

Catatan: Flowistry bisa sedikit lambat untuk fungsi yang lebih besar. Butuh waktu hingga 15 detik untuk menyelesaikan analisis.
Flowistry menyimpulkan apa yang ingin Anda fokuskan berdasarkan kursor Anda. Jadi, jika Anda mengklik variabel, Anda akan melihat wilayah fokus dari variabel itu. Flowistry akan menyoroti kode yang terfokus dalam warna abu -abu, dan kemudian memudar kode di luar wilayah fokus. Misalnya, karena kursor pengguna ada di view_projection , variabel itu disorot dalam warna abu -abu, dan wilayah fokusnya ditampilkan.

Terkadang Anda ingin menjaga wilayah fokus di tempatnya, dan klik kode lain untuk memeriksanya tanpa mengubah fokus. Untuk tujuan ini, Flowistry memiliki konsep "tanda". Setelah Anda memilih kode untuk fokus, Anda dapat menjalankan perintah "Set Mark" (Ctrl+R Ctrl+S / ⌘+R ⌘+S). Kemudian tanda diatur pada posisi kursor Anda saat ini, dan fokus akan tetap di sana sampai Anda menjalankan perintah "tanda unset" (ctrl+r ctrl+d / ⌘+r ⌘+d).
Jika Anda ingin memodifikasi semua kode di wilayah fokus, misalnya untuk mengomentari atau menyalinnya, maka Anda dapat menjalankan perintah "Pilih Wilayah Fokus" (Ctrl+R Ctrl+T / ⌘+R ⌘+T). Ini akan menambahkan seluruh wilayah fokus ke dalam pilihan editor Anda.
Flowistry adalah proyek penelitian aktif ke dalam aplikasi analisis aliran informasi untuk karat. Ini terus berkembang saat kami bereksperimen dengan teknik analisis dan paradigma interaksi. Jadi itu tidak terlalu dipoles atau seefisien alat seperti Rust Analyzer, tetapi kami harap Anda masih dapat menemukannya berguna! Namun demikian, ada sejumlah batasan penting yang harus Anda pahami saat menggunakan Flowistry untuk menghindari terkejut.
Jika Anda memiliki pertanyaan atau masalah, silakan ajukan masalah github, bergabunglah dengan perselisihan kami, atau DM @Wcrichton di Twitter.
Ketika kode Anda memiliki referensi, Flowistry perlu memahami apa titik referensi itu. Flowistry menggunakan informasi seumur hidup Rust untuk menentukan informasi poin-ke. Namun, struktur data yang menggunakan mutabilitas interior seperti Arc<Mutex<T>> secara eksplisit tidak berbagi masa hidup antara pointer ke data yang sama. Misalnya, dalam cuplikan ini:
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ; Flowistry dapat menentukan bahwa *x.lock().unwrap() = 1 adalah mutasi ke x , tetapi tidak dapat menentukan bahwa itu adalah mutasi untuk y . Jadi jika Anda fokus pada y , penugasan untuk 1 akan pudar, meskipun itu relevan dengan nilai y .
Kami sedang meneliti metode untuk mengatasi batasan ini, tetapi untuk sekarang hanya menyadari bahwa ini adalah kasus utama di mana flowistri diketahui memberikan jawaban yang salah.
Analisis Flowistry mencoba memasukkan semua kode yang dapat memiliki pengaruh pada titik fokus. Analisis ini membuat sejumlah asumsi untuk alasan praktis dan fundamental. Misalnya, dalam cuplikan ini:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; Jika Anda fokus pada v pada baris 3, itu akan mencakup v.get_mut(0) sebagai operasi yang dapat dimodifikasi v Alasannya adalah bahwa Flowistry tidak benar -benar menganalisis tubuh fungsi yang dipanggil, tetapi lebih mendekati berdasarkan tanda tangan tipe mereka. Karena get_mut mengambil &mut self sebagai input, ia mengasumsikan bahwa vektor dapat dimodifikasi.
Secara umum, Anda harus menggunakan mode fokus sebagai alat pemangkasan. Jika kode pudar, maka Anda tidak perlu membacanya (minus batasan yang disebutkan di atas!). Jika tidak pudar, maka itu mungkin relevan dengan tugas Anda.
Flowistry bekerja dengan menganalisis grafik miR untuk fungsi yang diberikan menggunakan API kompiler karat. Kemudian ekstensi IDE mengangkat hasil analisis dari level miR kembali ke level sumber. Namun, banyak informasi tentang program ini hilang dalam perjalanan dari kode sumber ke MIR.
Misalnya, jika sumbernya berisi ekspresi foo.whomp.bar().baz() , ada kemungkinan bahwa variabel sementara hanya dihasilkan untuk ekspresi foo.whomp.bar() . Jadi jika pengguna memilih foo , Flowistry mungkin tidak dapat menentukan bahwa ini sesuai dengan tempat miR yang mewakili foo .
Inilah sebabnya mengapa ekstensi IDE menyoroti kode yang terfokus dalam warna abu -abu, sehingga Anda dapat memahami apa sebenarnya pilihan kursor Anda.
Flowistry menganalisis satu fungsi dalam satu waktu. Jika suatu fungsi berisi fungsi lain, misalnya definisi fn , atau penutupan, atau secara implisit melalui async, maka Flowistry hanya akan menunjukkan kepada Anda daerah fokus dalam badan fungsi terkecil yang berisi kursor Anda. Ini biasanya didefinisikan dengan baik untuk definisi dan penutupan fungsi, tetapi mungkin membingungkan untuk async karena itu tergantung pada bagaimana RustC memutuskan untuk mengukir fungsi async Anda.
Jika Rustup gagal, terutama dengan kesalahan seperti "tidak dapat mengganti nama file yang diunduh", ini mungkin karena Flowistry menjalankan Rustup secara bersamaan dengan alat lain (seperti Rust-Analyzer). Sampai Rustup#988 diselesaikan, sayangnya tidak ada cara otomatis di sekitar ini.
Untuk menyelesaikan masalah, buka baris perintah dan jalankan:
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
Kemudian kembali ke VScode dan klik "Lanjutkan" untuk membiarkan Flowistry terus menginstal.
Rust Analyzer tidak mendukung MIR dan Pemeriksa Pinjaman, yang merupakan bagian penting dari analisis Flowistry. Fakta itu tidak mungkin berubah untuk waktu yang lama, jadi Flowistry adalah alat mandiri.
Lihat batasan untuk masalah yang diketahui. Jika itu tidak menjelaskan apa yang Anda lihat, silakan posting di masalah highlight yang tidak terduga atau tanyakan pada perselisihan.