jora
Version:
JavaScript object query engine
38 lines (33 loc) • 1.13 kB
JavaScript
export function compile(node, ctx) {
const args = node.arguments.map(arg => ctx.unescapeName('$' + arg.name, arg));
const duplicateNameNode = node.arguments.find((node, index) =>
index > 0 && args.lastIndexOf('$' + node.name, index - 1) !== -1
);
if (duplicateNameNode) {
ctx.error('Duplicate parameter name "$' + duplicateNameNode.name + '" is not allowed', duplicateNameNode);
}
// use function(){} since Arg1 refers to arguments[1],
// but Function doesn't create 2nd argument implicitly to prevent function arity changes
ctx.put('function(');
ctx.put(String(args) || '$');
ctx.put('){return ');
ctx.createScope(
() => {
ctx.scope.arg1 = args[1] || 'arguments[1]';
ctx.scope.$ref = args[0] || '$';
for (const name of args) {
ctx.scope.add(name);
}
ctx.node(node.body);
},
(sp) => sp + ','
);
ctx.put('}');
}
export function walk(node, ctx) {
ctx.node(node.body);
}
export function stringify(node, ctx) {
ctx.put('=>');
ctx.node(node.body);
}