Поток - это инструмент, который анализирует информационный поток программ ржавчины. Поток понимает, возможно ли, чтобы один кусок кода повлиял на другой. Flowistry интегрируется в IDE, чтобы обеспечить «режим фокусировки», который помогает вам сосредоточиться на коде, связанном с вашей текущей задачей.
Например, этот GIF показывает режим фокусировки при чтении функции, которая объединяет два набора:

Когда пользователь нажимает данную переменную или выражение, поток исчезает весь код, который не влияет на этот код и не зависит от этого кода. Например, на orig_len не влияет FOR-петля, в то время как set.len() IS.
Поток может быть полезным, когда вы читаете функцию с большим количеством кода. Например, этот GIF показывает реальную функцию в компиляторе ржавчины. Если вы хотите понять роль конкретного аргумента в отношении функции, то поток может отфильтровать большую часть кода как неуместно:

Алгоритм, который поддерживает поток, был опубликован в статье «Модульная информационная поток через право собственности» в PLDI 2022.
Оглавление
Поток доступен как плагин VSCODE. Вы можете установить Flowistry на рынке Visual Studio или в открытом реестре VSX. В VSCODE:
Примечание о поддержке платформы: Flowistry еще не поддерживает Nixos. Поток не может предоставить предварительно построенные двоичные файлы для целей ARM, таких как MAC, MAC, поэтому поток должен быть установлен с нуля на этих целях (это сделано для вас, но займет еще несколько минут, чем обычно).
В качестве альтернативы, вы можете установить его из источника:
# 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
Если вы заинтересованы в базовом анализе, вы можете использовать ящик flowistry опубликованный в crates.io: https://crates.io/crates/flowistry
Документация опубликована здесь: https://willcrichton.net/flowistry/flowistry/
Примечание. Docs.rs не поддерживает документацию для ящиков, которые используют
#![feature(rustc_private)], поэтому мы должны разместить ее сами.
Обратите внимание, что новейший поток имеет максимальную поддерживаемую версию ржавчины Rust 1.73 . Поток не гарантированно будет работать с функциями, реализованными после 1.73.
После того, как вы установили Flowistry, откройте рабочее пространство ржавчины в VSCODE. Вы должны увидеть этот значок на нижней панели инструментов:

Поток запускается путем проверки типов вашей кодовой базы. Это может занять несколько минут, если у вас много зависимостей.
ПРИМЕЧАНИЕ. Результаты проверки типа потока кэшируются в каталоге
target/flowistry. Если вы удалите эту папку, поток должен будет перекомплектовать типы. Также для большой кодовой базы этот каталог может занять достаточное количество дискового пространства.
Как только поток загрузится, значок загрузки исчезнет. Затем вы можете ввести режим фокусировки, выполнив команду «режим переключения фокусировки». По умолчанию сочетание клавиатуры CTRL+R CTRL+A (⌘+R ⌘+A на Mac), или вы можете использовать контекстное меню потока:

В режиме фокусировки Flowistry автоматически вычисляет информационный поток в данной функции, как только вы поместите туда курсор. Как только Flowistry завершит анализ, строка состояния будет выглядеть следующим образом:

Примечание. Поток может быть немного медленным для более крупных функций. Это может занять до 15 секунд, чтобы закончить анализ.
Поток делает то, на чем вы хотите сосредоточиться на основе курсора. Поэтому, если вы нажмете на переменную, вы должны увидеть область фокусировки этой переменной. Flowistry выделит целенаправленный код в Grey, а затем исчезнет код за пределами области фокусировки. Например, поскольку курсор пользователя находится на view_projection , эта переменная выделена серым, и ее область фокусировки показана.

Иногда вы хотите сохранить область фокусировки там, где он находится, и нажимать на другой код, чтобы осмотреть его без изменения фокуса. Для этой цели Flowistry имеет концепцию «отметки». После того, как вы выбрали код, чтобы сосредоточиться, вы можете запустить команду «Установить марку» (Ctrl+R Ctrl+S / ⌘+R ⌘+S). Затем в текущей позиции вашего курсора установлен отметка, и фокус останется там до тех пор, пока вы не запустите команду «Unset Mark» (Ctrl+R Ctrl+D / ⌘+R ⌘+D).
Если вы хотите изменить весь код в области фокусировки, например, чтобы прокомментировать его или скопировать его, вы можете запустить команду «Выбрать сфокусированную область» (Ctrl+R Ctrl+T / ⌘+R ⌘+T). Это добавит весь регион фокусировки в выбор вашего редактора.
Поток является активным исследовательским проектом в области применения анализа потока информации для ржавчины. Он постоянно развивается, когда мы экспериментируем с методами анализа и парадигмами взаимодействия. Так что это не так отполированно или эффективно, как инструменты, такие как Rust Analyzer, но мы надеемся, что вы все еще сможете найти это полезным! Тем не менее, есть ряд важных ограничений, которые вы должны понимать при использовании потока, чтобы избежать удивления.
Если у вас есть вопросы или проблемы, подайте проблему GitHub, присоединяйтесь к нашему Discord или DM @wcrichton в Твиттере.
Когда в вашем коде есть ссылки, Flowistry должен понять, что это ориентировано. Flowistry использует информацию Rust's Lifetime для определения информации о баллах. Тем не менее, структуры данных, которые используют внутреннюю изменчивость, такие как 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 , назначение на 1 будет исчезло, даже если оно имеет отношение к значению y
Мы исследуем методы для преодоления этого ограничения, но сейчас просто знаем, что это основной случай, когда известно, что поток дает неправильный ответ.
Анализ Flowistry пытается включить весь код, который может оказать влияние на фокус. Этот анализ делает ряд допущений как по практическим, так и по фундаментальным причинам. Например, в этом фрагменте:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; Если вы сосредоточитесь на v в строке 3, он будет включать v.get_mut(0) в качестве операции, которая могла бы изменить v . Причина в том, что поток на самом деле не анализирует тела, называемые функциями, а скорее приближается на основе их типовых подписей. Поскольку get_mut принимает &mut self в качестве ввода, он предполагает, что вектор может быть изменен.
В целом, вы должны использовать режим фокусировки в качестве инструмента обрезки. Если код исчезает, то вам не нужно читать его (за исключением ограничения, упомянутого выше!). Если это не исчезло, то это может иметь отношение к вашей задаче.
Работает Flowistry, анализируя график miR для данной функции, используя API компилятора Rust. Затем расширение IDE поднимает анализ результатов уровня miR назад до уровня источника. Тем не менее, большая часть информации о программе теряется в пути от исходного кода до MIR.
Например, если источник содержит выражение foo.whomp.bar().baz() , возможно, что временная переменная генерируется только для выражения foo.whomp.bar() . Таким образом, если пользователь выбирает foo , Flowistry может не определить, что это соответствует месту miR, которое представляет foo .
Вот почему расширение IDE подчеркивает целенаправленный код в сером, чтобы вы могли понять, на что на самом деле отображается выбор вашего курсора.
Поток анализирует одну функцию за раз. Если функция содержит другие функции, например, определения fn или закрытие, или неявно через Async, то поток покажет вам только области фокусировки в наименьшем корпусе функции, содержащем ваш курсор. Обычно это хорошо определено для определений функций и закрытия, но может сбивать с толку Async, поскольку это зависит от того, как Rustc решает вырезать вашу асинхронную функцию.
Если Rustup выходит из строя, особенно с такой ошибкой, как «не может переименовать загруженный файл», это, вероятно, потому, что Flowistry работает одновременно с другим инструментом (например, Rust-Analyzer). Пока Rustup#988 не будет решена, к сожалению, нет автоматического пути.
Чтобы решить проблему, перейдите в командную строку и запустите:
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
Затем вернитесь к VSCODE и нажмите «Продолжить», чтобы позволить потоку продолжать установить.
Анализатор Rust не поддерживает MIR и проверку займов, которые являются важными частями анализа Flowistry. Этот факт вряд ли изменится в течение длительного времени, поэтому поток является автономным инструментом.
См. Ограничения для известных проблем. Если это не объясняет, что вы видите, пожалуйста, опубликуйте это в непредвиденной проблеме основных моментов или спросите о Discord.