44个版本

0.5.42 2024年7月29日
0.5.41 2023年11月7日
0.5.40 2023年10月6日
0.5.36 2023年6月14日
0.4.0 2021年11月28日

#596 in 文本处理

Download history 4/week @ 2024-06-03 187/week @ 2024-07-29 20/week @ 2024-08-05 23/week @ 2024-08-12

230 每月下载量

MIT 许可证

135KB
3K SLoC

Flowistry:强大的Rust IDE工具

tests crates.io

Flowistry是VSCode扩展,可以帮助您理解Rust程序。Flowistry使用数据流分析指针分析来分析Rust程序,比类型可以提供的分析更深入(例如,您可以在rust-analyzer中找到)。

Flowistry是alpha软件(见限制)。 我正在寻找早期用户来试用并提供反馈!如果您有任何问题或问题,请提交一个GitHub问题加入我们的Discord,或在Twitter上私信@wcrichton

目前,Flowistry的功能包括

1. 向后切片:查找影响值的代码

Flowistry可以计算一个向后静态切片,以确定影响感兴趣值的每一块代码。例如,假设您正在调试对x的断言失败。然后您可以计算x的向后切片,以快速排除不影响其值的代码行,如下所示

demo1

绿色标记表示所选值,灰色文本表示不影响该值的代码。请注意,“影响”有点微妙——例如,在程序

if x > 0 {
  *y += 1;
}

尽管x没有直接用来更改y,但我们仍然会说x影响了y,因为对y的修改基于x的值进行条件判断。



2. 前向切片:查找受值影响的代码

前向静态切片可以确定所有受关注的值影响的代码片段。例如,假设你有一个计时计算的程序,你想要注释掉所有与计时相关的代码。你可以计算计时器的前向切片

demo2

计时器不影响计算的结果值,因此 run_expensive_calculation 不是 start 的前向切片的一部分。在这个例子中,Flowistry 将用户的选定文本设置为切片。然后用户可以使用其他 IDE 功能,如批量注释(在 macOS 的 VSCode 中为 ⌘-/)在该选择上。

请注意,这个例子展示了切片是如何 传递的start 影响 elapsed,而 elapsed 影响 println,因此 start 影响 println



3. 函数影响

函数的影响要么是它修改的输入,要么是它返回的值。函数影响面板有助于识别修改参数或可能返回值的代码行。选择一个影响后,将显示该影响的反向切片。

demo mp4

与之前一样,给定切片之外的行将以灰色显示。但针对此功能,给定切片中 独特 的行将以橙色突出显示。这样你就可以快速关注只与感兴趣的影响相关的代码。



安装

您可以从 Visual Studio MarketplaceOpen VSX 注册表 安装 Flowistry。在 VSCode 中

  • 通过点击左侧边距的此按钮进入扩展面板:Screen Shot 2021-09-20 at 9 30 43 AM
  • 搜索 "Flowistry" 并点击 "安装"。
  • 打开一个 Rust 的工作空间,等待工具完成安装。

或者,您可以从源安装它

# 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 有五个命令

  • Flowistry: 反向高亮:给定一个选定的变量,此命令突出显示变量的反向切片。
  • Flowistry: 反向选择:与上述命令相同,但此命令将切片放入您的选择中,而不是突出显示它。
  • Flowistry: 前向高亮Flowistry: 前向选择:与上述命令相同,但对于前向切片而不是反向切片。
  • Flowistry: 影响:如果您的光标位于特定函数中,此命令将打开该函数的影响面板。

您可以通过上下文菜单调用这些命令,右键单击并打开 "Flowistry" 子菜单。或者您可以通过打开命令面板(Mac 为 ⇧⌘P)并输入命令名称。

限制

Flowistry 是早期软件。它不可避免地会在 UI 和分析中存在错误。UI 可能不直观。分析,即使正确,也可能不直观。

Flowistry 不支持 Rust 的所有功能。具体来说

  • 原始指针:Flowistry 使用生存期来确定引用可以指向什么。然而,原始指针可以指向任何东西,并且不会被编译器跟踪。因此,Flowistry 无法检测通过原始指针的信息流。但是,它可以通过在原始指针 周围 的类型包装中检测信息流!
  • 某些形式的内部可变性:作为上述内容的推论,Flowistry 不跟踪包裹在像 Rc<T> 这样的类型中的数据别名。例如,在程序中
    let x = Rc::new(RefCell::new(1));
    let y = x.clone();
    *x.borrow_mut() = 2;
    
    Flowistry能够检测到x已被修改(因为borrow_mut使用生命周期将RefMutRefCell关联起来),但不能检测到y的修改(因为没有静态信息表明y别名x)。

常见问题解答

安装rustup失败

如果rustup安装失败,特别是出现“无法重命名下载的文件”等错误,这可能是由于Flowistry在另一个工具(如rust-analyzer)的同时运行rustup所致。在rustup#988问题解决之前,很遗憾没有自动解决的办法。

要解决这个问题,请转到命令行并运行

rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview

注意:如果nightly-2023-08-25不再正确,请务必检查rust-toolchain.toml中“channel”的值。

然后回到VSCode并点击“继续”,让Flowistry继续安装。

依赖项

~3.5–5.5MB
~101K SLoC