jora
Version:
JavaScript object query engine
85 lines (71 loc) • 1.83 kB
JavaScript
;
const build = require('../build.cjs');
const noBracketKeyType = new Set([
'Literal',
'Identifier',
'Reference',
'Current'
]);
function suggest(node, ctx) {
if (node.value === null) {
switch (node.key.type) {
case 'Literal':
case 'Identifier':
ctx.range(node.range, 'path');
ctx.range(node.range, 'var');
break;
case 'Current':
case 'Reference':
ctx.range(node.range, 'var');
break;
}
}
}
function compile(node, ctx) {
let value = node.value;
switch (node.key.type) {
case 'Current':
ctx.put('...null');
return;
case 'Literal':
ctx.node(node.key);
value = value || build.GetProperty(null, build.Identifier(String(node.key.value)));
break;
case 'Identifier':
ctx.node(node.key);
value = value || build.GetProperty(null, node.key);
break;
case 'Reference':
ctx.node(node.key.name);
value = value || node.key;
break;
default:
ctx.put('[');
ctx.node(node.key);
ctx.put(']');
}
ctx.put(':');
ctx.node(value);
}
function walk(node, ctx) {
ctx.node(node.key);
ctx.nodeOrNothing(node.value);
}
function stringify(node, ctx) {
if (noBracketKeyType.has(node.key.type)) {
ctx.node(node.key);
if (node.value === null) {
return;
}
} else {
ctx.put('[');
ctx.node(node.key);
ctx.put(']');
}
ctx.put(':');
ctx.node(node.value);
}
exports.compile = compile;
exports.stringify = stringify;
exports.suggest = suggest;
exports.walk = walk;