svelte
Version:
Cybernetically enhanced web apps
56 lines (45 loc) • 1.57 kB
JavaScript
/** @import { AssignmentExpression, Expression, UpdateExpression } from 'estree' */
/** @import { Context } from '../types' */
import { object } from '../../../../utils/ast.js';
import * as b from '../../../../utils/builders.js';
import { validate_mutation } from './shared/utils.js';
/**
* @param {UpdateExpression} node
* @param {Context} context
*/
export function UpdateExpression(node, context) {
const argument = node.argument;
if (
argument.type === 'MemberExpression' &&
argument.object.type === 'ThisExpression' &&
argument.property.type === 'PrivateIdentifier' &&
context.state.private_state.has(argument.property.name)
) {
let fn = '$.update';
if (node.prefix) fn += '_pre';
/** @type {Expression[]} */
const args = [argument];
if (node.operator === '--') {
args.push(b.literal(-1));
}
return b.call(fn, ...args);
}
if (argument.type !== 'Identifier' && argument.type !== 'MemberExpression') {
throw new Error('An impossible state was reached');
}
const left = object(argument);
const transformers = left && context.state.transform[left.name];
if (left === argument && transformers?.update) {
// we don't need to worry about ownership_invalid_mutation here, because
// we're not mutating but reassigning
return transformers.update(node);
}
let update = /** @type {Expression} */ (context.next());
if (left && transformers?.mutate) {
update = transformers.mutate(
left,
/** @type {AssignmentExpression | UpdateExpression} */ (update)
);
}
return validate_mutation(node, context, update);
}