在Rust开发的SWC插件中如何识别JS函数表达式getMyFileMetaInfo
检测SWC插件中
getMyFileMetaInfo函数调用的实现方案 要在SWC插件的visit_mut_callee方法中检测getMyFileMetaInfo函数的调用,你可以通过模式匹配拆解Callee::Expr包裹的Box<Expr>,并检查内部的标识符名称。以下是具体实现:
完整代码示例
use swc_plugin::*; struct GetMyFileMetaInfoDetector; impl VisitMut for GetMyFileMetaInfoDetector { fn visit_mut_callee(&mut self, callee: &mut Callee) { // 先递归处理子节点(保持原有遍历逻辑) callee.visit_mut_children_with(self); // 匹配调用目标是表达式的情况 if let Callee::Expr(expr) = callee { // 解引用Box<Expr>,拿到内部Expr的可变引用 if let Expr::Ident(ident) = &mut **expr { // 检查标识符是否为目标函数名 if ident.sym == "getMyFileMetaInfo" { // 这里添加检测到后的逻辑,比如打印日志、修改代码等 println!("找到getMyFileMetaInfo()调用"); // 示例:将函数名替换为其他值 // ident.sym = "replaced_GetMyFileMetaInfo".into(); } } } } }
关键逻辑解释
匹配
Callee::Expr:
当调用的目标是一个表达式(比如直接的函数标识符)时,callee会被匹配为Callee::Expr(expr),这里的expr是&mut Box<Expr>类型(可变引用的装箱表达式)。解引用
Box<Expr>:
因为expr是Box<Expr>的可变引用,需要通过两层解引用**expr拿到内部的Expr实例,再用&mut获取可变引用,才能匹配并修改Expr::Ident类型的节点。检查标识符名称:
Expr::Ident中的sym字段是Symbol类型,直接和字符串字面量比较即可(Rust会自动完成类型转换),以此判断是否是目标函数getMyFileMetaInfo。
扩展说明
如果需要检测带命名空间的调用(比如utils.getMyFileMetaInfo()),可以在匹配Expr::Ident的分支外,增加Expr::Member的匹配逻辑:
// 补充匹配成员访问的情况 if let Expr::Member(member) = &mut **expr { // 匹配成员访问的对象是标识符,且属性名是目标函数名 if let Expr::Ident(obj_ident) = &mut *member.obj { if member.prop.is_ident() && member.prop.as_ident().unwrap().sym == "getMyFileMetaInfo" { println!("找到命名空间形式的getMyFileMetaInfo调用:{}", obj_ident.sym); } } }
内容的提问来源于stack exchange,提问作者Shujath
相关产品推荐
相关产品推荐

