3 pontos por GN⁺ 2025-10-20 | 1 comentários | Compartilhar no WhatsApp
  • Flowistry é um plugin de IDE para a linguagem Rust que mostra apenas as partes relacionadas ao código em que se deseja focar
  • O plugin analisa o fluxo de informações no código Rust e destaca visualmente apenas o código diretamente conectado à variável ou expressão que está sendo observada
  • Pode ser instalado facilmente como plugin do VSCode, e destaca com clareza apenas o código que influencia ou é influenciado pela variável selecionada
  • Por meio de recursos como "Focus mode", "configuração de mark" e outros, melhora o entendimento de funções de grande porte ou código complexo
  • Apesar das limitações, como suporte incompleto a interior mutability e escopo de análise limitado, ainda está em desenvolvimento, e é uma ferramenta separada do Rust Analyzer

Visão geral e importância do Flowistry

Flowistry é um plugin de IDE para desenvolvedores Rust, uma ferramenta que destaca apenas o código relacionado à parte em que se deseja focar dentro do próprio código. Em funções de grande porte ou fluxos de código complexos, ele ajuda a identificar rapidamente as partes necessárias, trazendo valor prático distinto de outras ferramentas de análise estática. A tecnologia central é a análise de fluxo de informações, que é uma análise de fluxo de dados que identifica caminhos pelos quais um trecho de código pode afetar outro no programa. O Flowistry oferece esse tipo de análise com base nas características do Rust, no sistema de ownership/vida útil e no MIR (Mid-level Intermediate Representation) do Rust.

Recursos principais e funcionamento

  • Ao clicar em uma variável ou expressão específica no código Rust, o plugin escurece o código que não influencia ou não é influenciado por essa parte
  • De forma intuitiva, ele destaca apenas o código relacionado, reduzindo a leitura de trechos desnecessários e permitindo identificar rapidamente o fluxo principal do código
  • Em funções de grande porte ou em código complexo, como em uma função real do compilador Rust, é possível ver rapidamente o papel de um argumento específico
  • O algoritmo subjacente da análise é baseado no artigo do PLDI 2022 "Modular Information Flow through Ownership"

Instalação e suporte de ambiente

Instalação do plugin de IDE

  • O Flowistry pode ser instalado como plugin do VSCode pelo Visual Studio Marketplace ou pelo Open VSX Registry
  • Após abrir um workspace Rust, a instalação e inicialização ocorrem automaticamente
  • NixOS não é suportado e, em plataformas ARM (como M1 Mac etc.), é necessário compilar a partir do código-fonte

Plugin do Rustc

  • A própria funcionalidade de análise de fluxo de informações é disponibilizada como um crate separado, com documentação e API detalhadas próprias

Método de uso e detalhes de recursos

Execução inicial

  • Ao iniciar o plugin no VSCode, a checagem de tipos de toda a base de código é executada antes
  • Esse resultado é armazenado em cache na pasta target/flowistry

Entrando no Focus Mode

  • Use o comando "Toggle focus mode" do plugin (Ctrl+R Ctrl+A, etc.) para entrar no modo de foco
  • Ao posicionar o cursor dentro de uma função, a análise de fluxo de informações é executada automaticamente naquela função
  • Quando o plugin termina a análise, apenas o código relacionado fica destacado (a análise pode levar até cerca de 15 segundos)

Configuração de Mark

  • Ao manter uma área de foco fixa e revisar outro código, você pode usar o conceito de "Mark" para manter a área atual
  • É possível fixar e desfazer com "Set mark" (Ctrl+R Ctrl+S), "Unset mark" (Ctrl+R Ctrl+D), entre outros

Selecionar área em foco

  • Ao usar o comando "Select focused region", é possível selecionar todo o bloco de código destacado de uma vez para fazer alterações como copiar e comentar

Limitações e cuidados

  • Não dá suporte completo a interior mutability
    • Ex.: em estruturas como Arc, Mutex etc., pode não ser possível rastrear tudo por diferenças de lifetime entre referências
  • A área de foco pode ficar mais ampla que o esperado
    • Porque a análise não entra no interior de funções chamadas
  • Há código que não pode ser selecionado
    • Nem todo código pode ser selecionado devido ao limite de mapeamento entre MIR e código-fonte
  • Funções aninhadas, closures e async não podem ser analisadas juntas
    • A análise é feita sempre apenas na menor unidade de função em que o cursor está inserido

FAQ e outros

  • Falha na instalação do rustup: instale o rustup manualmente por comando e continue pelo VSCode
  • Motivo de não integração com Rust Analyzer: Rust Analyzer é um plugin separado, pois não dá suporte a análise MIR nem ao borrow checker
  • Problemas de destaque de código: consulte a documentação de limitações; para dúvidas adicionais, use issue no Github, Discord ou Twitter

Licença e informação open source

  • Disponibilizado sob licença MIT
  • As principais linguagens de programação são Rust e TypeScript, além de Python, HTML e JavaScript
  • Até setembro de 2025, possui 2.6k stars e 61 forks, estando em desenvolvimento e manutenção ativa

Conclusão

O Flowistry é uma ferramenta open source que traz vantagens práticas significativas para melhorar a compreensão de contexto e a concentração em códigos complexos no ambiente de desenvolvimento Rust. Em especial, ao integrar em tempo real a análise de fluxo de informações na IDE com uma apresentação visual, oferece uma experiência distinta das ferramentas de análise estática tradicionais e do Rust Analyzer. Em cenários de aprendizado da linguagem Rust, refatoração e revisão de código, entre outros, pode ter alta utilidade e eficiência.

1 comentários

 
GN⁺ 2025-10-20
Comentário no Hacker News
  • O artigo de fato está aqui, faz tempo que venho pensando em referências reversas verificadas estaticamente em Rust, e um dos grandes motivos de usuários de C/C++ reclamarem de Rust é que, quando A referencia B, é difícil ter de volta em B um ponteiro para A, então a maioria acaba usando soluções alternativas inseguras
    Em Rust, dá para implementar isso com segurança usando Rc, RefCell, Weak, borrow(), borrow_mut(), upgrade(), downgrade() etc., mas o código fica verboso, há overhead em tempo de execução e, em alguns casos, pode ocorrer pânico em double borrow; ainda assim, a expressividade é suficiente, e reuni notas sobre o trabalho em andamento
    A parte difícil da verificação estática é confirmar que os escopos emprestados não se sobrepõem; se os escopos de lifetime não se sobrepõem, não há conflito, mas ao chamar funções ou funções genéricas a checagem de escopo fica mais complicada, e a abordagem do Flowistry pode ajudar
    Me incomoda o fato de o Flowistry não lidar completamente com interior mutability (mudança interna via RefCell e similares)
    Na prática, o ponto central é encontrar restrições que satisfaçam condições como 1) serem sound, 2) poderem ser verificadas em tempo de compilação com baixo custo, 3) permitirem o uso dos back pointers de que a maioria das pessoas precisa, como referência ao nó pai de uma árvore, e 4) fornecerem mensagens de diagnóstico úteis quando houver problemas

  • Tenho curiosidade se existe, em outras linguagens, algum recurso que verifique dependências um pouco maiores ou mais informais dentro do corpo de uma função
    Por exemplo, se ao destacar um parâmetro ou variável foo é possível ver de uma vez não só os usos de foo, mas também os usos de todas as variáveis criadas a partir de foo
    O sistema de borrow de Rust faz perfeitamente esse tipo de rastreamento, mas esse tipo de visualização também pareceria muito útil em código de outras linguagens
    Acho que o Flowistry seria muito necessário em arquivos de codebases modernas difíceis de manter, como o código de layout flexbox do servo; por sinal, essa função é um dos arquivos de código mais complicados, com mais de 400 linhas

    • (Posso estar errado, mas) em geral isso é chamado de "flow analysis", e o TypeScript roda isso em segundo plano para refinar tipos
      Mas não tem visualização

    • Em geral esse tipo de recurso é chamado de "program slicing"

  • Acho que é uma ferramenta muito útil para compensar quando não se programa em um estilo otimizado para leitura humana
    Como o código-base nem sempre é escrito de forma agradável de ler, sinto que ferramentas assim ajudam muito

  • O autor apresentou na Rust East Coast um vídeo de palestra que cobre em profundidade o plugin e a pesquisa sobre rotinas

  • Acho uma função realmente muito legal, e o motivo de Rust combinar tão bem com isso é que, graças ao sistema de ownership, os efeitos colaterais são limitados
    Mesmo que algo assim fosse adicionado ao Python etc., em tempo de execução ainda seria possível subir a call stack e manipular memória a qualquer momento, então não seria 100% confiável
    Ainda assim, na maioria dos casos estaria correto, então espero que esse tipo de recurso seja adicionado

    • (Sou o autor) Foi por isso que escolhi Rust para construir isso, e é também o motivo de ser difícil implementar algo assim em outras linguagens
  • Tenho curiosidade se existe alguma ferramenta parecida para TypeScript ou JavaScript

  • Parece legal, mas talvez não precisasse chamar de 'IDE'; teria sido melhor chamar simplesmente de plugin para VSCode

    • Provavelmente porque "Visual Studio Code" é marca registrada da Microsoft; o plugin funciona em IDEs em geral baseadas em open source, como VSCodium, Cursor etc.

    • A documentação também descreve isso como um plugin de IDE

  • A ideia de focar nas partes importantes do código parece realmente ótima
    Tenho curiosidade se existe algo parecido também para JS/TS

  • Tenho curiosidade sobre como foi contribuir para o método documentHighlight do LSP no rust-analyzer
    Ele funciona de forma bem parecida com o que é mostrado no GIF
    Parece uma funcionalidade específica demais para virar plugin
    Link para a especificação do LSP relacionada

    • Está explicado no README; mais detalhes podem ser vistos aqui

    • É necessário MIR (Mid-level Intermediate Representation)

  • Sempre sonhei com esse tipo de recurso e queria que também mostrasse o caminho por onde os dados chegam de fora da função (quem chama essa função)
    Acho que talvez fosse possível ajudar nisso reutilizando os dados do compilador

    • Pelo que ouvi na apresentação relacionada, parece que já está usando dados do compilador