local stage = {} -- Mutates an array of nodes and non-tables, unwrapping Paren nodes. -- If list_start is given, tail Paren is not unwrapped if it's unpacking and past list_start index. local function handle_nodes(nodes, list_start) local num_nodes = #nodes for index = 1, num_nodes do local node = nodes[index] if type(node) == "table" then local tag = node.tag if tag == "Table" or tag == "Return" then handle_nodes(node, 1) elseif tag == "Call" then handle_nodes(node, 2) elseif tag == "Invoke" then handle_nodes(node, 3) elseif tag == "Forin" then handle_nodes(node[2], 1) handle_nodes(node[3]) elseif tag == "Local" then if node[2] then handle_nodes(node[2]) end elseif tag == "Set" then handle_nodes(node[1]) handle_nodes(node[2], 1) else handle_nodes(node) if tag == "Paren" and (not list_start or index < list_start or index ~= num_nodes) then local inner_node = node[1] if inner_node.tag ~= "Call" and inner_node.tag ~= "Invoke" and inner_node.tag ~= "Dots" then nodes[index] = inner_node end end end end end end -- Mutates AST, unwrapping Paren nodes. -- Paren nodes are preserved only when they matter: -- at the ends of expression lists with potentially multi-value inner expressions. function stage.run(chstate) handle_nodes(chstate.ast) end return stage