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);