lively.ast
Version:
Parsing JS code into ASTs and tools to query and transform these trees.
45 lines (36 loc) • 1.19 kB
JavaScript
import Visitor from "../generated/estree-visitor.js";
import {funcCall, member} from "./nodes.js";
class ObjectSpreadTransformer extends Visitor {
accept(node, state, path) {
if (node.type === "ObjectExpression") {
node = this.transformSpreadProperty(node);
}
return super.accept(node, state, path);
}
transformSpreadProperty(node) {
var currentGroup = [],
propGroups = [currentGroup];
node.properties.forEach(prop => {
if (prop.type !== "SpreadProperty") currentGroup.push(prop)
else {
propGroups.push(prop)
currentGroup = [];
propGroups.push(currentGroup);
}
});
if (propGroups.length === 1) return node;
if (!currentGroup.length) propGroups.pop();
return funcCall(
member("Object", "assign"),
...propGroups.map(group => {
return group.type === "SpreadProperty" ? group.argument : {
properties: group,
type: 'ObjectExpression'
}
}))
}
}
export default function objectSpreadTransform(parsed) {
// "var x = {y, ...z}" => "var x = Object.assign({ y }, z);"
return new ObjectSpreadTransformer().accept(parsed, {}, []);
};