zoukankan      html  css  js  c++  java
  • 还原未修改的常量

    const parser = require("@babel/parser");
    const traverse = require("@babel/traverse").default;
    
    // 将js代码转换成AST
    // const { parse } = require("@babel/parser");
    // 用来遍历AST中的节点
    // const traverse = require("@babel/traverse").default;
    // AST转换成js
    const generator = require("@babel/generator").default;
    // 用来判断节点类型和生成新的节点
    const types = require("@babel/types");
    
    
    const jscode = `
    
    var a = 123;
    const b = -5;
    let c = window;
    function d(){
      var f = c.btoa("hello,AST!");
        return a + b + f ;
    }
    
    `;
    let ast = parser.parse(jscode);
    
    
    const restoreVarDeclarator = {
        
        VariableDeclarator(path)
        {
            let {id,init} = path.node;
            if (!types.isIdentifier(id)) return;
            let initPath = path.get("init");
            if (initPath.isUnaryExpression({operator:"+"}) ||
                initPath.isUnaryExpression({operator:"-"}))
            {// -5或者 +"3" 也可以算作是字面量
                if (!types.isLiteral(init.argument)) return;
            }
            
            //如果初始值非Literal节点或者Identifier节点,不做还原
            //有时候为MemberExpression节点时,也可以还原,视情况而论
            //请大家自行添加,通用插件不做处理。
            else if (!initPath.isLiteral() && 
                       !initPath.isIdentifier())
            {
                return;
            }
            
            const binding = path.scope.getBinding(id.name);
            
            //判断初始值是否被更改
            if (!binding || !binding.constant) return;
            
            //获取所有引用的地方并替换
            let referPaths = binding.referencePaths;
            
            for (let referPath of referPaths)
            {
                referPath.replaceWith(init);
            }
            //替换完毕,直接删除即可。
            path.remove();
        },
    }
    
    traverse(ast, restoreVarDeclarator);
    let { code } = generator(ast);
    
    console.log(code);
  • 相关阅读:
    唐寅 《桃花庵歌》
    asp.net 后台隐藏div
    dataset的用法
    C#中的DateTime类型加减
    discuz! x2.5 文章添加分享按钮
    asp.net学习小网站
    table固定行和表头
    aspx.net开源的画图组件
    Global.asax详解
    int.Parse() int.TryParse
  • 原文地址:https://www.cnblogs.com/angdh/p/15757842.html
Copyright © 2011-2022 走看看