jora
Version:
JavaScript object query engine
92 lines (80 loc) • 1.96 kB
JavaScript
const GetProperty = function(value, property, range) {
return {
type: 'GetProperty',
value,
property,
range
};
};
const Identifier = function(name, range) {
return {
type: 'Identifier',
name,
range
};
};
const noBracketKeyType = new Set([
'Literal',
'Identifier',
'Reference',
'Current'
]);
export 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;
}
}
}
export 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 || GetProperty(null, Identifier(String(node.key.value)));
break;
case 'Identifier':
ctx.node(node.key);
value = value || 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);
}
export function walk(node, ctx) {
ctx.node(node.key);
ctx.nodeOrNothing(node.value);
}
export 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);
}