O fluxo é uma ferramenta que analisa o fluxo de informações dos programas de ferrugem. O fluxo entende se é possível que um código de código afete outro. O FloTistry se integra ao IDE para fornecer um "modo de foco" que ajuda a se concentrar no código relacionado à sua tarefa atual.
Por exemplo, este GIF mostra o modo de foco ao ler uma função que uniões de dois conjuntos juntos:

Quando o usuário clica em uma determinada variável ou expressão, o fluxo desaparece todo o código que não influencia esse código e não é influenciado por esse código. Por exemplo, orig_len não é influenciado pelo loop for, enquanto set.len() é.
O fluxo pode ser útil quando você está lendo uma função com muito código. Por exemplo, esse GIF mostra uma função real no compilador de ferrugem. Se você deseja entender o papel de um argumento específico para a função, o fluxo pode filtrar a maior parte do código como irrelevante:

O algoritmo de que o fluxo de poderes foi publicado no artigo "Fluxo de informações modulares através da propriedade" no PLDI 2022.
Índice
O fluxo está disponível como um plug -in do VSCODE. Você pode instalar o Flowistry no Marketplace do Visual Studio ou o Registro Open VSX. Em vscode:
Nota no suporte da plataforma: o fluxo ainda não suporta nixos. O fluxo não pode fornecer binários pré-construídos para alvos de braço como M1 Macs, de modo que o fluxo deve ser instalado do zero nesses alvos (isso é feito para você, mas levará mais alguns minutos do que o habitual).
Como alternativa, você pode instalá -lo da fonte:
# 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
Se você estiver interessado na análise subjacente, pode usar o flowistry Crate publicado em Crates.io: https://crates.io/crates/flowististry
A documentação é publicada aqui: https://willcrichton.net/flowistry/flowistry/
NOTA: DOCS.RS não suporta documentação para caixas que usam
#![feature(rustc_private)], então temos que hospedá -lo.
Observe que o fluxo mais recente tem uma versão máxima suportada da ferrugem do Rust 1.73 . O fluxo não é garantido para trabalhar com os recursos implementados após 1,73.
Depois de instalar o fluxo, abra um espaço de trabalho de ferrugem no VSCode. Você deve ver este ícone na barra de ferramentas inferior:

O fluxo é iniciado com o tipo de verificação da sua base de código. Isso pode levar alguns minutos se você tiver muitas dependências.
Nota: Os resultados da verificação do tipo de fluxo são armazenados em cache no diretório
target/flowistry. Se você excluir esta pasta, o fluxo deverá recomputar tipos. Também para uma base de código grande, este diretório pode ocupar uma quantidade razoável de espaço em disco.
Depois que o fluxo for inicializado, o ícone de carregamento desaparecerá. Em seguida, você pode inserir o modo de foco executando o comando "Toggle Focus Mode". Por padrão, o atalho do teclado é ctrl+r ctrl+a (⌘+r ⌘+a no mac), ou você pode usar o menu de contexto de fluxo:

No modo de foco, o FloTistry calculará automaticamente o fluxo de informações dentro de uma determinada função depois de colocar seu cursor lá. Depois que o fluxo terminar a análise, a barra de status ficará assim:

Nota: O fluxo pode ser um pouco lento para funções maiores. Pode levar até 15 segundos para terminar a análise.
O fluxo infere o que você deseja se concentrar com base no seu cursor. Portanto, se você clicar em uma variável, verá a região de foco dessa variável. O fluxo destacará o código focado em cinza e, em seguida, desaparecerá o código fora da região de foco. Por exemplo, como o cursor do usuário está no view_projection , essa variável é destacada em cinza e sua região de foco é mostrada.

Às vezes, você deseja manter a região de foco onde está e clique em outro código para inspecioná -lo sem alterar o foco. Para esse fim, o fluxo tem um conceito de "marca". Depois de selecionar o código para se concentrar, você pode executar o comando "set mark" (ctrl+r ctrl+s / ⌘+r ⌘+s). Em seguida, uma marca é definida na posição atual do seu cursor, e o foco permanecerá lá até você executar o comando "Unset Mark" (Ctrl+R Ctrl+D / ⌘+R ⌘+D).
Se você deseja modificar todo o código na região de foco, por exemplo, para comentar ou copiá -lo, poderá executar o comando "Selecionar região focada" (ctrl+r ctrl+t / ⌘+r ⌘+t). Isso adicionará toda a região de foco à seleção do seu editor.
O fluxo é um projeto de pesquisa ativo nas aplicações de análise de fluxo de informações para ferrugem. Está em evolução continuamente à medida que experimentamos técnicas de análise e paradigmas de interação. Portanto, não é tão polido ou eficiente quanto ferramentas como o Rust Analyzer, mas esperamos que você ainda possa achar útil! No entanto, existem várias limitações importantes que você deve entender ao usar o fluxo para evitar ser surpreendido.
Se você tiver dúvidas ou problemas, arquive um problema do Github, junte -se à nossa discórdia ou DM @Wcrichton no Twitter.
Quando seu código tem referências, o fluxo precisa entender o que isso de referência para. O FloTistry usa as informações vitalícias da RUR para determinar os pontos-para informações. No entanto, estruturas de dados que usam mutabilidade interior, como Arc<Mutex<T>> explicitamente, não compartilham vidas entre as dicas e os mesmos dados. Por exemplo, neste snippet:
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ; O fluxo pode determinar que *x.lock().unwrap() = 1 é uma mutação para x , mas não pode determinar que é uma mutação para y . Portanto, se você se concentrar em y , a atribuição para 1 seria desbotada, mesmo que seja relevante para o valor de y .
Estamos pesquisando métodos para superar essa limitação, mas, por enquanto, esteja ciente de que este é o principal caso em que o fluxo é conhecido por fornecer uma resposta incorreta.
A análise do fluxo tenta incluir todo o código que pode influenciar um ponto focal. Esta análise faz uma série de suposições por razões práticas e fundamentais. Por exemplo, neste snippet:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; Se você se concentrar no v On Line 3, ele incluirá v.get_mut(0) como uma operação que poderia ter modificado v . O motivo é que o fluxo não analisa os corpos das funções chamadas, mas se aproxima com base em suas assinaturas de tipo. Porque get_mut toma &mut self como entrada, ele pressupõe que o vetor possa ser modificado.
Em geral, você deve usar o modo de foco como uma ferramenta de poda. Se o código for desbotado, você não precisará lê -lo (menos a limitação mencionada acima!). Se não for desbotado, pode ser relevante para sua tarefa.
O fluxo funciona analisando o gráfico MIR para uma determinada função usando a API do compilador de ferrugem. Em seguida, a extensão IDE eleva os resultados da análise do nível MIR de volta ao nível da fonte. No entanto, muitas informações sobre o programa são perdidas na jornada do código -fonte para o MIR.
Por exemplo, se a fonte contiver uma expressão foo.whomp.bar().baz() , é possível que uma variável temporária seja gerada apenas para a expressão foo.whomp.bar() . Portanto, se o usuário selecionar foo , o fluxo pode não ser capaz de determinar que isso corresponde ao Mir Place que representa foo .
É por isso que a extensão da IDE destaca o código focado em cinza, para que você possa entender para a qual a seleção do seu cursor realmente mapeia.
O fluxo analisa uma única função por vez. Se uma função contiver outras funções, por exemplo, definições fn , ou fechamentos, ou implicitamente via assíncrono, o fluxo só mostrará as regiões de foco no corpo da menor função que contém seu cursor. Isso geralmente é bem definido para definições e fechamentos de funções, mas pode ser confuso para assíncrono, pois isso depende de como o RustC decide esculpir sua função assíncrona.
Se o Rustup falhar, especialmente com um erro como "não poderia renomear o arquivo baixado", isso provavelmente ocorre porque o fluxo está executando o Rustup simultaneamente com outra ferramenta (como o analisador de ferrugem). Até que o Rustup#988 seja resolvido, infelizmente não há uma maneira automatizada de contornar isso.
Para resolver o problema, vá para a linha de comando e execute:
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
Em seguida, volte ao VSCode e clique em "Continuar" para deixar o Flowistry continuar instalando.
O Rust Analyzer não suporta Mir e o verificador de empréstimos, que são partes essenciais da análise do fluxo. É improvável que esse fato mude por um longo tempo, então o fluxo é uma ferramenta independente.
Veja limitações para questões conhecidas. Se isso não explicar o que você está vendo, publique -o no inesperado problema de destaques ou pergunte no Discord.