@ibyar/expressions
Version:
Aurora expression, an template expression and evaluation, An 100% spec compliant ES2022 JavaScript toolchain,
97 lines • 4.72 kB
JavaScript
import { __esDecorate, __runInitializers } from "tslib";
import { InfixExpressionNode } from '../abstract.js';
import { Deserializer } from '../deserialize/deserialize.js';
let AssignmentExpression = (() => {
let _classDecorators = [Deserializer('AssignmentExpression')];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = InfixExpressionNode;
var AssignmentExpression = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
AssignmentExpression = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static fromJSON(node, deserializer) {
return new AssignmentExpression(node.operator, deserializer(node.left), deserializer(node.right), node.range, node.loc);
}
static visit(node, visitNode) {
visitNode(node.left);
visitNode(node.right);
}
static Evaluations = {
'=': (evalNode) => { return evalNode.left = evalNode.right; },
'*=': (evalNode) => { return evalNode.left *= evalNode.right; },
'**=': (evalNode) => { return evalNode.left **= evalNode.right; },
'/=': (evalNode) => { return evalNode.left /= evalNode.right; },
'%=': (evalNode) => { return evalNode.left %= evalNode.right; },
'+=': (evalNode) => { return evalNode.left += evalNode.right; },
'-=': (evalNode) => { return evalNode.left -= evalNode.right; },
'<<=': (evalNode) => { return evalNode.left <<= evalNode.right; },
'>>=': (evalNode) => { return evalNode.left >>= evalNode.right; },
'>>>=': (evalNode) => { return evalNode.left >>>= evalNode.right; },
'&=': (evalNode) => { return evalNode.left &= evalNode.right; },
'^=': (evalNode) => { return evalNode.left ^= evalNode.right; },
'|=': (evalNode) => { return evalNode.left |= evalNode.right; },
'%%=': (evalNode) => { return evalNode.left %= ((evalNode.left % evalNode.right) + evalNode.right) % evalNode.right; },
'>?=': (evalNode) => { return evalNode.left = evalNode.left > evalNode.right ? evalNode.left : evalNode.right; },
'<?=': (evalNode) => { return evalNode.left = evalNode.left > evalNode.right ? evalNode.right : evalNode.left; },
};
static LogicalEvaluations = {
'&&=': (exp, context) => {
let value = exp.left.get(context);
if (value) {
value = exp.right.get(context);
exp.set(context, value);
}
return value;
},
'||=': (exp, context) => {
let value = exp.left.get(context);
if (!value) {
value = exp.right.get(context);
exp.set(context, value);
}
return value;
},
'??=': (exp, context) => {
let value = exp.left.get(context);
if (value === undefined || value === null) {
value = exp.right.get(context);
exp.set(context, value);
}
return value;
},
};
constructor(operator, left, right, range, loc) {
super(operator, left, right, range, loc);
}
set(stack, value) {
return this.left.set(stack, value);
}
get(stack) {
switch (this.operator) {
case '&&=':
case '||=':
case '??=':
return AssignmentExpression.LogicalEvaluations[this.operator](this, stack);
}
const evalNode = {
left: this.left.get(stack),
right: this.right.get(stack)
};
const value = AssignmentExpression.Evaluations[this.operator](evalNode);
this.set(stack, value);
return value;
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return AssignmentExpression = _classThis;
})();
export { AssignmentExpression };
//# sourceMappingURL=assignment.js.map