Flowistry es una herramienta que analiza el flujo de información de los programas de óxido. Flowistry entiende si es posible que una pieza de código afecte a otro. Flowistry se integra en el IDE para proporcionar un "modo de enfoque" que lo ayuda a concentrarse en el código relacionado con su tarea actual.
Por ejemplo, este GIF muestra el modo de enfoque al leer una función que sindican dos conjuntos:

Cuando el usuario hace clic en una variable o expresión dada, Flowistry se desvanece todo el código que no influye en ese código, y no está influenciado por ese código. Por ejemplo, orig_len no está influenciado por el for-loop, mientras que set.len() es.
El flujo puede ser útil cuando está leyendo una función con mucho código. Por ejemplo, este GIF muestra una función real en el compilador de óxido. Si desea comprender el papel de un argumento específico para la función, entonces Flowistry puede filtrar la mayor parte del código como irrelevante:

El algoritmo de que el flujo de poderes se publicó en el documento "Flujo de información modular a través de la propiedad" en PLDI 2022.
Tabla de contenido
Flowistry está disponible como un complemento VSCode. Puede instalar Flowistry desde Visual Studio Marketplace o el Registro Open VSX. En VScode:
Nota sobre el soporte de la plataforma: Flowistry aún no admite NIXOS. Flowistry no puede proporcionar binarios previos a la construcción para objetivos ARM como M1 Macs, por lo que el flujo debe instalarse desde cero en estos objetivos (esto se hace por usted, pero tomará unos minutos más de lo habitual).
Alternativamente, puede instalarlo desde la fuente:
# 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
Si está interesado en el análisis subyacente, puede usar la caja flowistry publicada en cajas.io: https://crates.io/crates/flowistry
La documentación se publica aquí: https://willcrichton.net/flowistry/flowistry/
Nota: Docs.RS no admite la documentación para las cajas que usan
#![feature(rustc_private)]por lo que tenemos que alojarla nosotros mismos.
Tenga en cuenta que el último flujo tiene una versión de óxido máxima de Rust 1.73 . No se garantiza que Flowistry funcione con características implementadas después de 1.73.
Una vez que haya instalado un flujo, abra un espacio de trabajo de óxido en VScode. Debería ver este icono en la barra de herramientas inferior:

El flujo se inicia mediante la verificación de su tipo de código. Esto puede tomar unos minutos si tiene muchas dependencias.
Nota: Los resultados de verificación de tipo de flujo se almacenan en caché en el directorio
target/flowistry. Si elimina esta carpeta, Flowistry tendrá que recomputar tipos. También para una gran base de código, este directorio puede ocupar una buena cantidad de espacio en disco.
Una vez que el flujo se ha iniciado, el icono de carga desaparecerá. Luego puede ingresar el modo de enfoque ejecutando el comando "Modo de enfoque de alternación". Por defecto, el acceso directo del teclado es Ctrl+R Ctrl+A (⌘+R ⌘+A en Mac), o puede usar el menú contextual de flujo:

En el modo de enfoque, Flowistry calculará automáticamente el flujo de información dentro de una función determinada una vez que coloque su cursor allí. Una vez que el flujo ha terminado el análisis, la barra de estado se verá así:

Nota: El flujo puede ser un poco lento para funciones más grandes. Puede tomar hasta 15 segundos para terminar el análisis.
Flowistry infiere lo que desea centrarse en función de su cursor. Entonces, si hace clic en una variable, debe ver la región de enfoque de esa variable. Flowistry destacará el código enfocado en Gray y luego se desvanecerá el código fuera de la región de enfoque. Por ejemplo, debido a que el cursor del usuario está en view_projection , esa variable se resalta en Gray y se muestra su región de enfoque.

A veces desea mantener la región de enfoque donde está y hacer clic en otro código para inspeccionarlo sin cambiar el enfoque. Para este propósito, Flowistry tiene un concepto de "marca". Una vez que haya seleccionado el código en el que se concentre, puede ejecutar el comando "Set Mark" (Ctrl+R Ctrl+S / ⌘+R ⌘+S). Luego, se establece una marca en la posición actual de su cursor, y el enfoque permanecerá allí hasta que ejecute el comando "Marca Unset" (Ctrl+R Ctrl+D / ⌘+R ⌘+D).
Si desea modificar todo el código en la región de enfoque, por ejemplo, para comentarlo o copiarlo, puede ejecutar el comando "Seleccionar región enfocada" (Ctrl+R Ctrl+T / ⌘+R ⌘+T). Esto agregará toda la región de enfoque a la selección de su editor.
Flowistry es un proyecto de investigación activa en las aplicaciones del análisis de flujo de información para el óxido. Está evolucionando continuamente a medida que experimentamos con técnicas de análisis y paradigmas de interacción. Por lo tanto, no es tan pulido o eficiente como las herramientas como Rust Analyzer, ¡pero esperamos que aún pueda encontrarlo útil! Sin embargo, hay una serie de limitaciones importantes que debe comprender al usar Flowistry para evitar ser sorprendido.
Si tiene preguntas o problemas, presente un problema de GitHub, únase a nuestra discordia o dm @wcrichton en Twitter.
Cuando su código tiene referencias, Flowistry necesita comprender qué apunta esa referencia. Flowistry utiliza la información de por vida de Rust para determinar la información de puntos hasta. Sin embargo, las estructuras de datos que usan mutabilidad interior, como Arc<Mutex<T>> explícitamente, no comparten vidas entre los punteros a los mismos datos. Por ejemplo, en este fragmento:
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ; Flowistry puede determinar que *x.lock().unwrap() = 1 es una mutación a x , pero no puede determinar que es una mutación a y . Entonces, si te enfocas en y , la asignación a 1 se desvanecería, aunque sea relevante para el valor de y .
Estamos investigando métodos para superar esta limitación, pero por ahora solo tenga en cuenta que este es el caso principal en el que se sabe que el flujo proporciona una respuesta incorrecta.
El análisis de Flowistry intenta incluir todo el código que podría influir en un punto focal. Este análisis hace una serie de suposiciones por razones prácticas y fundamentales. Por ejemplo, en este fragmento:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; Si se enfoca en v en la línea 3, incluirá v.get_mut(0) como una operación que podría haber modificado v . La razón es que Flowistry en realidad no analiza los cuerpos de las funciones llamadas, sino que se aproxima en función de sus firmas de tipo. Debido a que get_mut toma &mut self como entrada, supone que el vector podría modificarse.
En general, debe usar el modo de enfoque como herramienta de poda. Si el código se desvanece, entonces no tiene que leerlo (¡menos la limitación mencionada anteriormente!). Si no se desvanece, entonces podría ser relevante para su tarea.
Flowistry funciona analizando el gráfico MIR para una función dada utilizando la API del compilador de óxido. Luego, la extensión IDE eleva los resultados del análisis del nivel MIR al nivel de fuente. Sin embargo, mucha información sobre el programa se pierde en el viaje del código fuente a Mir.
Por ejemplo, si la fuente contiene una expresión foo.whomp.bar().baz() , es posible que una variable temporal solo se genere para la expresión foo.whomp.bar() . Entonces, si el usuario selecciona foo , Flowistry puede no determinar que esto corresponde al lugar MIR que representa foo .
Esta es la razón por la cual la extensión IDE resalta el código enfocado en Gray, por lo que puede comprender a qué se asigna la selección de su cursor.
El flujo analiza una sola función a la vez. Si una función contiene otras funciones, por ejemplo, definiciones fn , o cierres, o implícitamente a través de Async, Flowistry solo mostrará que enfoque regiones dentro del cuerpo de la función más pequeña que contiene su cursor. Esto generalmente está bien definido para las definiciones y cierres de funciones, pero puede ser confuso para Async, ya que eso depende de cómo RUSTC decide tallar su función de asíncrono.
Si Rustup falla, especialmente con un error como "No se puede cambiar el nombre del archivo descargado", esto probablemente se deba a que Flowistry está ejecutando Rustup simultáneamente con otra herramienta (como Rust-Analyzer). Hasta que se resuelva Rustup#988, desafortunadamente no hay forma automatizada de esto.
Para resolver el problema, vaya a la línea de comando y ejecute:
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
Luego regrese a VScode y haga clic en "Continuar" para dejar que Flowistry continúe instalando.
Rust Analyzer no es compatible con Mir y el Checker de préstamo, que son partes esenciales del análisis de Flowistry. Es poco probable que ese hecho cambie durante mucho tiempo, por lo que el flujo es una herramienta independiente.
Ver limitaciones para problemas conocidos. Si eso no explica lo que está viendo, publíquelo en el problema inesperado de los aspectos destacados o pregunte en Discord.