silphius/app/swcx/evaluate.js

48 lines
1.6 KiB
JavaScript
Raw Normal View History

2024-06-16 08:01:01 -05:00
import {unwrap} from '@/swcx/types.js';
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} = {}) {
const unwrapped = unwrap(node);
switch (unwrapped.type) {
case 'ArrayExpression':
return evaluators.array(unwrapped, {evaluate, scope});
case 'AssignmentExpression':
return evaluators.assignment(unwrapped, {evaluate, scope});
case 'AwaitExpression':
return evaluators.await(unwrapped, {evaluate, scope});
case 'BinaryExpression':
return evaluators.binary(unwrapped, {evaluate, scope});
case 'BooleanLiteral':
case 'NullLiteral':
case 'NumericLiteral':
case 'StringLiteral':
return evaluators.literal(unwrapped, {evaluate, scope});
case 'CallExpression':
return evaluators.call(unwrapped, {evaluate, scope});
case 'ConditionalExpression':
return evaluators.conditional(unwrapped, {evaluate, scope});
case 'Identifier':
return evaluators.identifier(unwrapped, {evaluate, scope});
case 'MemberExpression':
return evaluators.member(unwrapped, {evaluate, scope});
case 'ObjectExpression':
return evaluators.object(unwrapped, {evaluate, scope});
case 'UnaryExpression':
return evaluators.unary(unwrapped, {evaluate, scope});
case 'UpdateExpression':
return evaluators.update(unwrapped, {evaluate, scope});
}
}