/** @module ember */ /** A Glimmer2 AST transformation that replaces all instances of ```handlebars {{#each-in iterableThing as |key value|}} ``` with ```handlebars {{#each (-each-in iterableThing) as |value key|}} ``` @private @class TransformHasBlockSyntax */ export default function transformEachInIntoEach(env) { let { builders: b } = env.syntax; return { name: 'transform-each-in-into-each', visitor: { BlockStatement(node) { if (node.path.original === 'each-in') { node.params[0] = b.sexpr(b.path('-each-in'), [node.params[0]]); let blockParams = node.program.blockParams; if (!blockParams || blockParams.length === 0) { // who uses {{#each-in}} without block params?! } else if (blockParams.length === 1) { // insert a dummy variable for the first slot // pick a name that won't parse so it won't shadow any real variables blockParams = ['( unused value )', blockParams[0]]; } else { let key = blockParams.shift(); let value = blockParams.shift(); blockParams = [value, key, ...blockParams]; } node.program.blockParams = blockParams; return b.block(b.path('each'), node.params, node.hash, node.program, node.inverse, node.loc); } }, }, }; }