实现目的:将重复赋值的标识符进行替换,删减
处理前:
let a=3;
let b=a;
let c=b;
let d=c;
处理后:
let a = 3;
let d = a;
demo.js
let a=3;
let b=a;
let c=b;
let d=c;
function hi() {
var _0x4a763f = _0x33ba;
console[_0x4a763f(0x121)](_0x4a763f(0x11f));
}
dec_main.js
const fs = require("fs");
const parse = require("@babel/parser");
const traverse = require('@babel/traverse').default;
const t = require('@babel/types');
const generator = require('@babel/generator').default;
const jscode = fs.readFileSync(
'./demo.js', {
encoding: 'utf-8'
}
);
let ast = parse.parse(jscode);
function ReIdent(path) {
let node = path.node;
if(!t.isIdentifier(node.id)||!t.isIdentifier(node.init))return;
let leftName = node.id.name;
let rightName = node.init.name;
let scope = path.scope;
let binding = scope.getBinding(leftName);
if (!binding || binding.constantViolations.length > 0) {
return;
}
let paths = binding.referencePaths;
let paths_sums=0;
paths.map(function (refer_path) {
refer_path.node.name=rightName;
paths_sums+=1;
});
if (paths_sums==paths.length&&paths_sums!=0){
path.remove();
}
}
traverse(ast, {VariableDeclarator: {exit: [ReIdent]},});
let {code} = generator(ast,opts = {jsescOption:{"minimal":true}})
fs.writeFile('./demoNew.js', code, (err) => {
});
demoNew.js
let a = 3;
let d = a;
function hi() {
console[_0x33ba(0x121)](_0x33ba(0x11f));
}