From c52e86feaf58df4ecacc5f5f5eb0de0e00e45a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Tue, 16 Apr 2019 16:04:44 +0200 Subject: [PATCH] [FIX] qweb: t-set should reuse variable if possible closes #41 --- src/qweb.ts | 12 ++++++--- tests/__snapshots__/qweb.test.ts.snap | 36 +++++++++++++++++++++++++++ tests/qweb.test.ts | 16 ++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/qweb.ts b/src/qweb.ts index 1c42b79b..dd9e1ea8 100644 --- a/src/qweb.ts +++ b/src/qweb.ts @@ -782,11 +782,15 @@ const setDirective: Directive = { const variable = node.getAttribute("t-set")!; let value = node.getAttribute("t-value")!; if (value) { - const varName = `_${ctx.generateID()}`; const formattedValue = ctx.formatExpression(value); - ctx.addLine(`var ${varName} = ${formattedValue}`); - ctx.definedVariables[varName] = formattedValue; - ctx.variables[variable] = varName; + if (ctx.variables.hasOwnProperty(variable)) { + ctx.addLine(`${ctx.variables[variable]} = ${formattedValue}`); + } else { + const varName = `_${ctx.generateID()}`; + ctx.addLine(`var ${varName} = ${formattedValue}`); + ctx.definedVariables[varName] = formattedValue; + ctx.variables[variable] = varName; + } } else { ctx.variables[variable] = node.childNodes; } diff --git a/tests/__snapshots__/qweb.test.ts.snap b/tests/__snapshots__/qweb.test.ts.snap index 632c1bef..0fb4c34e 100644 --- a/tests/__snapshots__/qweb.test.ts.snap +++ b/tests/__snapshots__/qweb.test.ts.snap @@ -1409,6 +1409,42 @@ exports[`t-set t-set evaluates an expression only once 1`] = ` }" `; +exports[`t-set t-set should reuse variable if possible 1`] = ` +"function anonymous(context,extra +) { + context = Object.create(context); + var h = this.utils.h; + var c1 = [], p1 = {key:1}; + var vn1 = h('div', p1, c1); + var _2 = 1 + var _3 = context['list']; + if (!_3) { throw new Error('QWeb error: Invalid loop expression')} + if (typeof _3 === 'number') { _3 = Array.from(Array(_3).keys())} + var _4 = _3 instanceof Array ? _3 : Object.keys(_3); + var _5 = _3 instanceof Array ? _3 : Object.values(_3); + for (let i = 0; i < _4.length; i++) { + context.elem_first = i === 0; + context.elem_last = i === _4.length - 1; + context.elem_parity = i % 2 === 0 ? 'even' : 'odd'; + context.elem_index = i; + context.elem = _4[i]; + context.elem_value = _5[i]; + var c6 = [], p6 = {key:6}; + var vn6 = h('div', p6, c6); + c1.push(vn6); + var c7 = [], p7 = {key:7}; + var vn7 = h('span', p7, c7); + c6.push(vn7); + c7.push({text: \`v\`}); + if (_2 || _2 === 0) { + c7.push({text: _2}); + } + _2 = context['elem'] + } + return vn1; +}" +`; + exports[`t-set value priority 1`] = ` "function anonymous(context,extra ) { diff --git a/tests/qweb.test.ts b/tests/qweb.test.ts index f15eda14..945eb727 100644 --- a/tests/qweb.test.ts +++ b/tests/qweb.test.ts @@ -284,6 +284,22 @@ describe("t-set", () => { expect(renderToString(qweb, "test")).toBe("
3
"); }); + test("t-set should reuse variable if possible", () => { + qweb.addTemplate( + "test", + `
+ +
+ v + +
+
` + ); + expect(normalize(renderToString(qweb, "test", { list: ["a", "b"] }))).toBe( + "
v1
va
" + ); + }); + test("evaluate value expression, part 2", () => { qweb.addTemplate( "test",