You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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();
                }
            }
        }
    }
}

关键逻辑解释

  1. 匹配Callee::Expr:
    当调用的目标是一个表达式(比如直接的函数标识符)时,callee会被匹配为Callee::Expr(expr),这里的expr是&mut Box<Expr>类型(可变引用的装箱表达式)。

  2. 解引用Box<Expr>:
    因为expr是Box<Expr>的可变引用,需要通过两层解引用**expr拿到内部的Expr实例,再用&mut获取可变引用,才能匹配并修改Expr::Ident类型的节点。

  3. 检查标识符名称:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:46:04