silphius/app/astride/evaluate.js

48 lines
1.6 KiB
JavaScript
Raw Normal View History

2024-06-16 08:01:01 -05:00
const evaluators = Object.fromEntries(
Object.entries(
import.meta.glob(
['./evaluators/*.js', '!./evaluators/*.test.js'],
{eager: true, import: 'default'},
)
)
.map(([path, evaluator]) => ([
path.replace(/\.\/evaluators\/(.*)\.js/, '$1'),
evaluator,
])),
);
export default function evaluate(node, {scope} = {}) {
2024-06-22 10:47:17 -05:00
switch (node.type) {
2024-06-16 08:01:01 -05:00
case 'ArrayExpression':
2024-06-22 10:47:17 -05:00
return evaluators.array(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'AssignmentExpression':
2024-06-22 10:47:17 -05:00
return evaluators.assignment(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'AwaitExpression':
2024-06-22 10:47:17 -05:00
return evaluators.await(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'BinaryExpression':
2024-06-22 10:47:17 -05:00
return evaluators.binary(node, {evaluate, scope});
case 'Literal':
return evaluators.literal(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'CallExpression':
2024-06-22 10:47:17 -05:00
return evaluators.call(node, {evaluate, scope});
case 'ChainExpression':
return evaluate(node.expression, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'ConditionalExpression':
2024-06-22 10:47:17 -05:00
return evaluators.conditional(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'Identifier':
2024-06-22 10:47:17 -05:00
return evaluators.identifier(node, {evaluate, scope});
case 'LogicalExpression':
return evaluators.binary(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'MemberExpression':
2024-06-22 10:47:17 -05:00
return evaluators.member(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'ObjectExpression':
2024-06-22 10:47:17 -05:00
return evaluators.object(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'UnaryExpression':
2024-06-22 10:47:17 -05:00
return evaluators.unary(node, {evaluate, scope});
2024-06-16 08:01:01 -05:00
case 'UpdateExpression':
2024-06-22 10:47:17 -05:00
return evaluators.update(node, {evaluate, scope});
default:
throw new EvalError(`astride: Can't evaluate node of type ${node.type}`)
2024-06-16 08:01:01 -05:00
}
}