34 个版本

0.6.2 2024年8月12日
0.6.1 2024年7月24日
0.5.14 2024年4月29日
0.5.10 2024年3月5日
0.1.0 2020年7月23日

321编程语言 中排名

Download history 49202/week @ 2024-05-05 52985/week @ 2024-05-12 59450/week @ 2024-05-19 49143/week @ 2024-05-26 50044/week @ 2024-06-02 52273/week @ 2024-06-09 46843/week @ 2024-06-16 49141/week @ 2024-06-23 43063/week @ 2024-06-30 43639/week @ 2024-07-07 41979/week @ 2024-07-14 44855/week @ 2024-07-21 43377/week @ 2024-07-28 43815/week @ 2024-08-04 49894/week @ 2024-08-11 54185/week @ 2024-08-18

193,615 每月下载量
用于 392 个 crate (10 个直接使用)

Apache-2.0

18KB
452

Rust语言的访问者生成器。

swc中有三种访问者变体。它们是 FoldVisitMutVisit

比较

FoldVisitMut

FoldVisitMut 执行几乎相同的功能,但 Fold 更容易使用,速度较慢,对于非常深的 ast 容易发生栈溢出。由于 Fold 对于几乎所有情况都足够快,因此最好从 Fold 开始。

非常深的 ast 指的是像成千上万的 a + a + a + a ... 这样的代码。

Fold

警告:Fold 速度慢,如果你有经验,建议使用 VisitMut。

Fold 会拥有值,这意味着你必须返回新值。返回新值意味着返回值的拥有权。但当你使用此类访问者时,不必关心拥有权或内存管理。 rustc 会自动处理它们,并且所有分配都会在离开作用域时释放。

您可以通过如下方式调用您的 Fold 实现:node.fold_with(&mut visitor),其中 visitor 是您的访问者。请注意,因为它会获取值的所有权,所以您需要在例如 fn fold_module 的实现中调用 node.fold_children_with(self),如果覆盖了默认行为。您还需要存储从 fold_children_with 返回的值,例如 let node = node.fold_children_with(self)。执行顺序可以使用此方法控制。如果有一些逻辑应该首先应用于父节点,您可以在这种逻辑之后调用 fold_children_with

VisitMut

VisitMut 使用对 AST 节点的可变引用(例如 &mut Expr)。您可以使用 swc_common::util::take::Take 从可变引用中获取所有权的值。

您通常会使用如下代码:

*e = return_value.take();

where &mut Expr = &mut visitor, return_value,其中 take() 是在 MapWithMut 上定义的扩展方法。它与 Fold 几乎相同,所以这里省略了内存管理。

您可以通过以下方式调用您的 VisitMut 实现:node.visit_mut_with(&mut visitor),其中 visitor 是您的访问者。再次提醒,在访问者实现中,如果您想修改子节点,需要调用 node.visit_mut_children_with(self)。在这种情况下,不需要存储返回值。

Visit

Visit 使用对 AST 节点的不可变引用。它可以用来检查 AST 节点是否包含嵌套的特定节点。这有助于检查 AST 节点是否包含 this。这在很多情况下都很实用——在箭头表达式中,this 是特殊的,如果使用了 this 表达式,我们需要生成不同的代码。

您可以使用您的 Visit 实现,例如 node.visit_with(&Invalid{ span: DUMMY_SP, }, &mut visitor。我认为API设计有误,但它确实可以工作,并且已经有大量代码使用了 Visit

Cargo 功能

您应该添加

[features]
path = []

如果您想允许使用路径感知的访问者。

路径感知访问者

路径感知访问者是一种可以用来访问从入口点开始路径的AST节点的访问者。

VisitMutAstPathFoldAstPath 可以用来将路径转换为AST节点。

依赖关系

~49KB