首页 > 其他分享 >ast还原代码

ast还原代码

时间:2023-08-22 16:22:16浏览次数:25  
标签:body ifNodes ast 代码 else let 还原 test path

1. while ===号 

while (1) {
    _$LT = _$65[4][_$VT++];
    if (_$LT < 4) {
        if (_$LT === 1) {
            _$VT += 1;
        } else if (_$LT === 4) {
            _$1S(_$Ql);
        } else if (_$LT === 0) {
            _$GA = String["prototype"]["indexOf"]["call"](_$Ql, "a=candidate:") === 0;
        } else if (_$LT === 2) {
            "return";
        } else {
            _$VT += -4;
        }
    } else {
        if (_$LT === 5) {
            _$1S(_$Ql);
        } else {
            if (!_$GA) _$VT += 1;
        }
    }
}

//////////////////////////////////////////////
while (1) {
  _$LT = _$65[4][_$VT++];
  switch (_$LT) {
    case 0:
      _$GA = String["prototype"]["indexOf"]["call"](_$Ql, "a=candidate:") === 0;
      break;
    case 1:
      _$VT += 1;
      break;
    case 2:
      "return";
      break;
    case 3:
      if (!_$GA) _$VT += 1;
      break;
    case 4:
      _$1S(_$Ql);
      break;
    case 5:
      _$1S(_$Ql);
      break;
  }
}
/////////////////////////////////////////////////////////////
let _path = ""

function collectSwitchCase(WhilePath, name) {  // if处理
    let ifNodes = [];
    WhilePath.traverse({
        "IfStatement"(path) {//遍历所有的ifStatement;
            // console.log(path.get("consequent").toString());
            // console.log("1111111111111111111111111111111")
            let {test, consequent, alternate} = path.node; //获取子节点
            let {left, operator, right} = test; // 必定是BinaryExpression
            if (!types.isIdentifier(left, {name: name}) || operator != '===' || !types.isNumericLiteral(right)) {//条件过滤
                _path = path;
                return;
            }
            ifNodes[right.value] = consequent.body;   //保存整个body,记得生成switchCase节点的时候加上break节点。
            if (!types.isIfStatement(alternate)) {
                if (_path.node.test.right.value < ifNodes.length) {
                    ifNodes[_path.node.test.right.value -1] = alternate.body;  //最后一个else,其实就是上一个else-if 的 test.right的值
                }
                else {
                    ifNodes[ifNodes.length] = alternate.body;  //最后一个else,其实就是上一个else-if 的 test.right的值
                }
            }
        },
    })
    return ifNodes;
}

const visitor1 = {  // if处理
    "WhileStatement"(path) {
        let {test, body} = path.node;
        if (!types.isNumericLiteral(test, {value: 1}) || body.body.length != 2) {
            return;
        }
        let blockBody = body.body;
        if (!types.isExpressionStatement(blockBody[0])) {//条件过滤
            return;
        }
        let name = blockBody[1].test.left.name;   //变量名
        let ifNodes = collectSwitchCase(path, name);   //收集case
        if (ifNodes.length == 0) return;   //无case,直接返回。
        let len = ifNodes.length;
        for (let i = 0; i < len; i++) {
            ifNodes[i].push(types.BreakStatement());
            ifNodes[i] = types.SwitchCase(test = types.valueToNode(i), consequent = ifNodes[i]);  //生成SwitchCase节点
        }
        let switchNode = types.SwitchStatement(blockBody[1].test.left, ifNodes);   //生成SwitchCase节点
        path.node.body.body[1] = switchNode;
    },
}


traverse(ast, visitor1);

  

标签:body,ifNodes,ast,代码,else,let,还原,test,path
From: https://www.cnblogs.com/yoyo1216/p/17648847.html

相关文章

  • 代码简洁之道:对象转换神器MapStruct
    在我们日常开发的程序中,为了各层之间解耦,一般会定义不同的对象用来在不同层之间传递数据,比如xxxDTO、xxxVO、xxxQO,当在不同层之间传输数据时,不可避免地经常需要将这些对象进行相互转换。今天给大家介绍一个对象转换工具MapStruct,代码简洁安全、性能高,强烈推荐。MapStruct简介MapSt......
  • 有奖活动 | 以代码之名,写出对Ta的爱
     七夕情人节到了,为了Ta,你打算用什么方式表达爱?是包包、鲜花、美酒、巧克力,还是一封充满爱意的短信? 在HarmonyOS,有一群精致又机智的开发者们,他们#以代码之名,表达爱#比起鲜花美酒巧克力,这种浪漫无人能及,不仅独特、高级、而且码力值MAX,创意MAX!意外的惊喜,谁又不喜欢~......
  • elasticsearch
    最典型的是两个应用场景:全文检索 和 复杂查询。正排索引,也叫正向索引(ForwardIndex),是通过文档ID去查找关键词(文档内容)。倒排索引,也叫反向索引(InvertedIndex),是通过关键词查找文档ID。must:其查询子句必须全部被满足,逻辑相当于and,并且会计算分数。filter:与must作用一......
  • 【转载】Macbook M1/M2如何调试c++代码?使用lldb即可
    转载自:https://www.zybuluo.com/qidiandasheng/note/349994#:~:text=GDB%3A,C%2B%2B或者Python插件。MacbookM1/M2无法安装gdb,但是可以使用lldb进行代码调试。使用方法和介绍如下:......
  • CAN通讯-使用Python收发CAN数据保姆级教程(包含完整代码)
    CAN通讯-使用Python收发CAN数据配置环境1.环境配置1.1安装CAN通讯需要的包1.2安装kvaser_drivers以及KvaserCanKing2.使用Python收发数据2.1接发数据代码如下:2.1.1接收数据代码2.1.2发送数据代码2.2验证发送数据2.2.1使用KvaserCanKing接收数据2.2.2......
  • [代码随想录]Day24-回溯算法part04
    题目:93.复原IP地址思路:函数参数:参数就一个stirng,path先收集ip地址的四个部分,最后存入res中时拼接成一个string,因此path和res都是[]string类型终止条件:当path有了ip的四个部分就终止;当然只有完全的把字符串遍历了才会存入res单层逻辑:先取1-3位,判断是不是0-255内的数并且没......
  • java实现大文件上传代码
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • 时髦的“低代码配置式软件”——组态软件
    随着物联网、大数据等技术高速发展,我们逐步向数字化、可视化的人工智能(AI)时代的方向不断迈进。智能时代是工业4.0时代,我国工业领域正努力从“制造”迈向“智造”的新跨越。什么是组态软件?组态软件,又称组态监控软件。它们处在自动控制系统监控层一级的软件平台和开发环境,使用灵活......
  • JVS低代码中表单引擎与逻辑引擎是如何联合调用外部API的?
    在企业项目中,常常出现需要给外部系统提供一个api,让外部系统触发调用,本系统直接数据入库,那么我们来看看jvs的表单引擎与逻辑引擎联合实现这个功能,先看实现效果:配置步骤:一、配置列表页如下图所示:①选中需要增加列表页的目录,在目录操作的主界面上②点击创建列表页设计,系统进入列表页......
  • eclipse 合并错分支代码还原,合并到本分支但未push到库上
    由于本地分支较多,稍不留神就合并错误,发现合并错误,但未提交push到git库上,此时想要还原。如图  那么需要还原,之前处理方式,删除本地代码,重新从版本库下载。 gitreset0e7d080 --hard......