ast还原代码

发布时间 2023-08-22 16:21:19作者: 守护式等待
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);