如何扁平化JavaScript AST中的链式赋值表达式序列
问题原因
你现有实现的问题在于仅生成了当前层级AssignmentExpression对应的赋值语句,没有收集嵌套在right属性中的其他AssignmentExpression的左值,因此最终只能输出一条赋值语句。
解决思路
- 遍历嵌套的AssignmentExpression结构,把所有层级的左节点全部收集到数组中
- 提取出最右侧非AssignmentExpression类型的最终右值
- 遍历收集到的所有左节点,每个都和最终右值生成独立的赋值表达式
- 返回所有生成的独立赋值表达式数组,替换原有的单个嵌套赋值节点
修改后代码
function normalize_AssignmentExpression(node, scope) { const [left, leftExps] = normalizeProperty(node.type, 'left', node.left.type, node.left, scope) let [right, rightExps] = normalizeProperty(node.type, 'right', node.right.type, node.right, scope) const exps = [ ...leftExps, ...rightExps ] // 收集所有嵌套赋值的左节点,同时查找最终右值 const allLefts = [left] let furthestRight = right while (furthestRight.type === 'AssignmentExpression') { allLefts.push(furthestRight.left) furthestRight = furthestRight.right } if (left.type === 'ArrayPattern') { // 原有数组解构逻辑保留 const assignments = [] left.elements.forEach(el => { assignments.push( createAssignmentExpression( el, createMemberExpression(right, el), node.operator ) ) }) return [ assignments, exps ] } else { // 为每个左值生成独立赋值语句 const assignments = allLefts.map(leftItem => { return createAssignmentExpression(leftItem, furthestRight, node.operator) }) return [ assignments, exps ] } }
经过上述修改后,原有的嵌套赋值AST会被拆为多个独立的赋值表达式节点,序列化后即可得到你需要的每行一条赋值语句的输出格式。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

