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 文本处理
230 每月下载量
135KB
3K SLoC
Flowistry:强大的Rust IDE工具
Flowistry是VSCode扩展,可以帮助您理解Rust程序。Flowistry使用数据流分析和指针分析来分析Rust程序,比类型可以提供的分析更深入(例如,您可以在rust-analyzer中找到)。
Flowistry是alpha软件(见限制)。 我正在寻找早期用户来试用并提供反馈!如果您有任何问题或问题,请提交一个GitHub问题,加入我们的Discord,或在Twitter上私信@wcrichton。
目前,Flowistry的功能包括
1. 向后切片:查找影响值的代码
Flowistry可以计算一个向后静态切片,以确定影响感兴趣值的每一块代码。例如,假设您正在调试对x
的断言失败。然后您可以计算x
的向后切片,以快速排除不影响其值的代码行,如下所示
绿色标记表示所选值,灰色文本表示不影响该值的代码。请注意,“影响”有点微妙——例如,在程序
if x > 0 {
*y += 1;
}
尽管x
没有直接用来更改y
,但我们仍然会说x
影响了y
,因为对y
的修改基于x
的值进行条件判断。
2. 前向切片:查找受值影响的代码
前向静态切片可以确定所有受关注的值影响的代码片段。例如,假设你有一个计时计算的程序,你想要注释掉所有与计时相关的代码。你可以计算计时器的前向切片
计时器不影响计算的结果值,因此 run_expensive_calculation
不是 start
的前向切片的一部分。在这个例子中,Flowistry 将用户的选定文本设置为切片。然后用户可以使用其他 IDE 功能,如批量注释(在 macOS 的 VSCode 中为 ⌘-/)在该选择上。
请注意,这个例子展示了切片是如何 传递的:start
影响 elapsed
,而 elapsed
影响 println
,因此 start
影响 println
。
3. 函数影响
函数的影响要么是它修改的输入,要么是它返回的值。函数影响面板有助于识别修改参数或可能返回值的代码行。选择一个影响后,将显示该影响的反向切片。
与之前一样,给定切片之外的行将以灰色显示。但针对此功能,给定切片中 独特 的行将以橙色突出显示。这样你就可以快速关注只与感兴趣的影响相关的代码。
安装
您可以从 Visual Studio Marketplace 或 Open VSX 注册表 安装 Flowistry。在 VSCode 中
- 通过点击左侧边距的此按钮进入扩展面板:
- 搜索 "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>
这样的类型中的数据别名。例如,在程序中
Flowistry能够检测到let x = Rc::new(RefCell::new(1)); let y = x.clone(); *x.borrow_mut() = 2;
x
已被修改(因为borrow_mut
使用生命周期将RefMut
与RefCell
关联起来),但不能检测到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