@glimmer/compiler
Version:
81 lines (69 loc) • 12.7 kB
JavaScript
import { generateSyntaxError } from '@glimmer/syntax';
import { Err, Ok, Result } from '../../../../shared/result';
import * as mir from '../../../2-encoding/mir';
import { VISIT_EXPRS } from '../../visitors/expressions';
function assertIfUnlessInlineKeyword(type) {
return originalNode => {
var _a;
let inverted = type === 'unless';
let node = originalNode.type === 'AppendContent' ? originalNode.value : originalNode;
let named = node.type === 'Call' ? node.args.named : null;
let positional = node.type === 'Call' ? node.args.positional : null;
if (named && !named.isEmpty()) {
return Err(generateSyntaxError(`(${type}) cannot receive named parameters, received ${named.entries.map(e => e.name.chars).join(', ')}`, originalNode.loc));
}
let condition = positional === null || positional === void 0 ? void 0 : positional.nth(0);
if (!positional || !condition) {
return Err(generateSyntaxError(`When used inline, (${type}) requires at least two parameters 1. the condition that determines the state of the (${type}), and 2. the value to return if the condition is ${inverted ? 'false' : 'true'}. Did not receive any parameters`, originalNode.loc));
}
let truthy = positional.nth(1);
let falsy = positional.nth(2);
if (truthy === null) {
return Err(generateSyntaxError(`When used inline, (${type}) requires at least two parameters 1. the condition that determines the state of the (${type}), and 2. the value to return if the condition is ${inverted ? 'false' : 'true'}. Received only one parameter, the condition`, originalNode.loc));
}
if (positional.size > 3) {
return Err(generateSyntaxError(`When used inline, (${type}) can receive a maximum of three positional parameters 1. the condition that determines the state of the (${type}), 2. the value to return if the condition is ${inverted ? 'false' : 'true'}, and 3. the value to return if the condition is ${inverted ? 'true' : 'false'}. Received ${(_a = positional === null || positional === void 0 ? void 0 : positional.size) !== null && _a !== void 0 ? _a : 0} parameters`, originalNode.loc));
}
return Ok({
condition,
truthy,
falsy
});
};
}
function translateIfUnlessInlineKeyword(type) {
let inverted = type === 'unless';
return ({
node,
state
}, {
condition,
truthy,
falsy
}) => {
let conditionResult = VISIT_EXPRS.visit(condition, state);
let truthyResult = VISIT_EXPRS.visit(truthy, state);
let falsyResult = falsy ? VISIT_EXPRS.visit(falsy, state) : Ok(null);
return Result.all(conditionResult, truthyResult, falsyResult).mapOk(([condition, truthy, falsy]) => {
if (inverted) {
condition = new mir.Not({
value: condition,
loc: node.loc
});
}
return new mir.IfInline({
loc: node.loc,
condition,
truthy,
falsy
});
});
};
}
export function ifUnlessInlineKeyword(type) {
return {
assert: assertIfUnlessInlineKeyword(type),
translate: translateIfUnlessInlineKeyword(type)
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2tleXdvcmRzL3V0aWxzL2lmLXVubGVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxTQUFnQixtQkFBaEIsUUFBMkMsaUJBQTNDO0FBRUEsU0FBUyxHQUFULEVBQWMsRUFBZCxFQUFrQixNQUFsQixRQUFnQywyQkFBaEM7QUFDQSxPQUFPLEtBQUssR0FBWixNQUFxQix5QkFBckI7QUFFQSxTQUFTLFdBQVQsUUFBNEIsNEJBQTVCOztBQUdBLFNBQVMsMkJBQVQsQ0FBcUMsSUFBckMsRUFBaUQ7QUFDL0MsU0FDRSxZQURLLElBTUY7OztBQUNILFFBQUksUUFBUSxHQUFHLElBQUksS0FBSyxRQUF4QjtBQUVBLFFBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFiLEtBQXNCLGVBQXRCLEdBQXdDLFlBQVksQ0FBQyxLQUFyRCxHQUE2RCxZQUF4RTtBQUNBLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFMLEtBQWMsTUFBZCxHQUF1QixJQUFJLENBQUMsSUFBTCxDQUFVLEtBQWpDLEdBQXlDLElBQXJEO0FBQ0EsUUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUwsS0FBYyxNQUFkLEdBQXVCLElBQUksQ0FBQyxJQUFMLENBQVUsVUFBakMsR0FBOEMsSUFBL0Q7O0FBRUEsUUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTixFQUFkLEVBQStCO0FBQzdCLGFBQU8sR0FBRyxDQUNSLG1CQUFtQixDQUNqQixJQUFJLElBQUksK0NBQStDLEtBQUssQ0FBQyxPQUFOLENBQ3BELEdBRG9ELENBQy9DLENBQUQsSUFBTyxDQUFDLENBQUMsSUFBRixDQUFPLEtBRGtDLEVBRXBELElBRm9ELENBRS9DLElBRitDLENBRTFDLEVBSEksRUFJakIsWUFBWSxDQUFDLEdBSkksQ0FEWCxDQUFWO0FBUUQ7O0FBRUQs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QjtBQUl0QixRQUFBO0FBSnNCLE9BQWpCLENBQVA7QUFNRCxLQVpJLENBQVA7QUFjRCxHQWpDRDtBQWtDRDs7QUFFRCxPQUFNLFNBQVUscUJBQVYsQ0FDSixJQURJLEVBQ1E7QUFVWixTQUFPO0FBQ0wsSUFBQSxNQUFNLEVBQUUsMkJBQTJCLENBQUMsSUFBRCxDQUQ5QjtBQUVMLElBQUEsU0FBUyxFQUFFLDhCQUE4QixDQUFDLElBQUQ7QUFGcEMsR0FBUDtBQUlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVNUdjIsIGdlbmVyYXRlU3ludGF4RXJyb3IgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuXG5pbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvcmVzdWx0JztcbmltcG9ydCAqIGFzIG1pciBmcm9tICcuLi8uLi8uLi8yLWVuY29kaW5nL21pcic7XG5pbXBvcnQgeyBOb3JtYWxpemF0aW9uU3RhdGUgfSBmcm9tICcuLi8uLi9jb250ZXh0JztcbmltcG9ydCB7IFZJU0lUX0VYUFJTIH0gZnJvbSAnLi4vLi4vdmlzaXRvcnMvZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgS2V5d29yZERlbGVnYXRlIH0gZnJvbSAnLi4vaW1wbCc7XG5cbmZ1bmN0aW9uIGFzc2VydElmVW5sZXNzSW5saW5lS2V5d29yZCh0eXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBvcmlnaW5hbE5vZGU6IEFTVHYyLkFwcGVuZENvbnRlbnQgfCBBU1R2Mi5FeHByZXNzaW9uTm9kZVxuICApOiBSZXN1bHQ8e1xuICAgIGNvbmRpdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgdHJ1dGh5OiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICBmYWxzeTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfCBudWxsO1xuICB9PiA9PiB7XG4gICAgbGV0IGludmVydGVkID0gdHlwZSA9PT0gJ3VubGVzcyc7XG5cbiAgICBsZXQgbm9kZSA9IG9yaWdpbmFsTm9kZS50eXBlID09PSAnQXBwZW5kQ29udGVudCcgPyBvcmlnaW5hbE5vZGUudmFsdWUgOiBvcmlnaW5hbE5vZGU7XG4gICAgbGV0IG5hbWVkID0gbm9kZS50eXBlID09PSAnQ2FsbCcgPyBub2RlLmFyZ3MubmFtZWQgOiBudWxsO1xuICAgIGxldCBwb3NpdGlvbmFsID0gbm9kZS50eXBlID09PSAnQ2FsbCcgPyBub2RlLmFyZ3MucG9zaXRpb25hbCA6IG51bGw7XG5cbiAgICBpZiAobmFtZWQgJiYgIW5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICBgKCR7dHlwZX0pIGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7bmFtZWQuZW50cmllc1xuICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5uYW1lLmNoYXJzKVxuICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICBvcmlnaW5hbE5vZGUubG9jXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGNvbmRpdGlvbiA9IHBvc2l0aW9uYWw/Lm50aCgwKTtcblxuICAgIGlmICghcG9zaXRpb25hbCB8fCAhY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gRXJyKFxuICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgIGBXaGVuIHVzZWQgaW5saW5lLCAoJHt0eXBlfSkgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIHBhcmFtZXRlcnMgMS4gdGhlIGNvbmRpdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIHN0YXRlIG9mIHRoZSAoJHt0eXBlfSksIGFuZCAyLiB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBjb25kaXRpb24gaXMgJHtcbiAgICAgICAgICAgIGludmVydGVkID8gJ2ZhbHNlJyA6ICd0cnVlJ1xuICAgICAgICAgIH0uIERpZCBub3QgcmVjZWl2ZSBhbnkgcGFyYW1ldGVyc2AsXG4gICAgICAgICAgb3JpZ2luYWxOb2RlLmxvY1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB0cnV0aHkgPSBwb3NpdGlvbmFsLm50aCgxKTtcbiAgICBsZXQgZmFsc3kgPSBwb3NpdGlvbmFsLm50aCgyKTtcblxuICAgIGlmICh0cnV0aHkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBFcnIoXG4gICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgYFdoZW4gdXNlZCBpbmxpbmUsICgke3R5cGV9KSByZXF1aXJlcyBhdCBsZWFzdCB0d28gcGFyYW1ldGVycyAxLiB0aGUgY29uZGl0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3RhdGUgb2YgdGhlICgke3R5cGV9KSwgYW5kIDIuIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGNvbmRpdGlvbiBpcyAke1xuICAgICAgICAgICAgaW52ZXJ0ZWQgPyAnZmFsc2UnIDogJ3RydWUnXG4gICAgICAgICAgfS4gUmVjZWl2ZWQgb25seSBvbmUgcGFyYW1ldGVyLCB0aGUgY29uZGl0aW9uYCxcbiAgICAgICAgICBvcmlnaW5hbE5vZGUubG9jXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uYWwuc2l6ZSA+IDMpIHtcbiAgICAgIHJldHVybiBFcnIoXG4gICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgYFdoZW4gdXNlZCBpbmxpbmUsICgke3R5cGV9KSBjYW4gcmVjZWl2ZSBhIG1heGltdW0gb2YgdGhyZWUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIDEuIHRoZSBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBzdGF0ZSBvZiB0aGUgKCR7dHlwZX0pLCAyLiB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBjb25kaXRpb24gaXMgJHtcbiAgICAgICAgICAgIGludmVydGVkID8gJ2ZhbHNlJyA6ICd0cnVlJ1xuICAgICAgICAgIH0sIGFuZCAzLiB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBjb25kaXRpb24gaXMgJHtcbiAgICAgICAgICAgIGludmVydGVkID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICAgICAgICAgIH0uIFJlY2VpdmVkICR7cG9zaXRpb25hbD8uc2l6ZSA/PyAwfSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICBvcmlnaW5hbE5vZGUubG9jXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9rKHsgY29uZGl0aW9uLCB0cnV0aHksIGZhbHN5IH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVJZlVubGVzc0lubGluZUtleXdvcmQodHlwZTogc3RyaW5nKSB7XG4gIGxldCBpbnZlcnRlZCA9IHR5cGUgPT09ICd1bmxlc3MnO1xuXG4gIHJldHVybiAoXG4gICAge1xuICAgICAgbm9kZSxcbiAgICAgIHN0YXRlLFxuICAgIH06IHsgbm9kZTogQVNUdjIuQXBwZW5kQ29udGVudCB8IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAge1xuICAgICAgY29uZGl0aW9uLFxuICAgICAgdHJ1dGh5LFxuICAgICAgZmFsc3ksXG4gICAgfToge1xuICAgICAgY29uZGl0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICAgIHRydXRoeTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgICBmYWxzeTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfCBudWxsO1xuICAgIH1cbiAgKTogUmVzdWx0PG1pci5JZklubGluZT4gPT4ge1xuICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChjb25kaXRpb24sIHN0YXRlKTtcbiAgICBsZXQgdHJ1dGh5UmVzdWx0ID0gVklTSVRfRVhQUlMudmlzaXQodHJ1dGh5LCBzdGF0ZSk7XG4gICAgbGV0IGZhbHN5UmVzdWx0ID0gZmFsc3kgPyBWSVNJVF9FWFBSUy52aXNpdChmYWxzeSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICByZXR1cm4gUmVzdWx0LmFsbChjb25kaXRpb25SZXN1bHQsIHRydXRoeVJlc3VsdCwgZmFsc3lSZXN1bHQpLm1hcE9rKFxuICAgICAgKFtjb25kaXRpb24sIHRydXRoeSwgZmFsc3ldKSA9PiB7XG4gICAgICAgIGlmIChpbnZlcnRlZCkge1xuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBtaXIuTm90KHsgdmFsdWU6IGNvbmRpdGlvbiwgbG9jOiBub2RlLmxvYyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgbWlyLklmSW5saW5lKHtcbiAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICB0cnV0aHksXG4gICAgICAgICAgZmFsc3ksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZlVubGVzc0lubGluZUtleXdvcmQoXG4gIHR5cGU6IHN0cmluZ1xuKTogS2V5d29yZERlbGVnYXRlPFxuICBBU1R2Mi5DYWxsRXhwcmVzc2lvbiB8IEFTVHYyLkFwcGVuZENvbnRlbnQsXG4gIHtcbiAgICBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlO1xuICAgIHRydXRoeTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgZmFsc3k6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDtcbiAgfSxcbiAgbWlyLklmSW5saW5lXG4+IHtcbiAgcmV0dXJuIHtcbiAgICBhc3NlcnQ6IGFzc2VydElmVW5sZXNzSW5saW5lS2V5d29yZCh0eXBlKSxcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZUlmVW5sZXNzSW5saW5lS2V5d29yZCh0eXBlKSxcbiAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=