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 在 编程语言 中排名
193,615 每月下载量
用于 392 个 crate (10 个直接使用)
18KB
452 行
Rust语言的访问者生成器。
swc中有三种访问者变体。它们是 Fold
,VisitMut
,Visit
。
比较
Fold
与 VisitMut
Fold
和 VisitMut
执行几乎相同的功能,但 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节点的访问者。
VisitMutAstPath
和 FoldAstPath
可以用来将路径转换为AST节点。
依赖关系
~49KB