Skip to content

Commit 35d135e

Browse files
authored
fix(compiler-vapor): prevent duplicate processing of member expressions in expression analysis (#14105)
1 parent 01fdf76 commit 35d135e

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,21 @@ export function render(_ctx) {
5757
}"
5858
`;
5959

60+
exports[`cache multiple access > dynamic property access with parentheses 1`] = `
61+
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
62+
const t0 = _template("<div></div>", true)
63+
64+
export function render(_ctx) {
65+
const n0 = t0()
66+
_renderEffect(() => {
67+
const _foo_bar = _ctx.foo[_ctx.bar]
68+
_setProp(n0, "x", (_foo_bar).x)
69+
_setProp(n0, "bar", (_foo_bar))
70+
})
71+
return n0
72+
}"
73+
`;
74+
6075
exports[`cache multiple access > function calls with arguments 1`] = `
6176
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
6277
const t0 = _template("<div></div>")

packages/compiler-vapor/__tests__/transforms/vBind.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,16 @@ describe('cache multiple access', () => {
801801
expect(code).contains('_setProp(n0, "id", _obj[1][_ctx.baz] + _obj.bar)')
802802
})
803803

804+
test('dynamic property access with parentheses', () => {
805+
const { code } = compileWithVBind(`
806+
<div :x="(foo[bar]).x" :bar="(foo[bar])"></div>
807+
`)
808+
expect(code).matchSnapshot()
809+
expect(code).contains('const _foo_bar = _ctx.foo[_ctx.bar]')
810+
expect(code).contains('_setProp(n0, "x", (_foo_bar).x)')
811+
expect(code).contains('_setProp(n0, "bar", (_foo_bar))')
812+
})
813+
804814
test('variable name substring edge cases', () => {
805815
const { code } = compileWithVBind(
806816
`<div :id="title + titles + title"></div>`,

packages/compiler-vapor/src/generators/expression.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,10 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
327327
continue
328328
}
329329

330+
const seenParents = new Set<Node>()
330331
walkIdentifiers(exp.ast, (currentNode, parent, parentStack) => {
331-
if (parent && isMemberExpression(parent)) {
332+
if (parent && isMemberExpression(parent) && !seenParents.has(parent)) {
333+
seenParents.add(parent)
332334
const memberExp = extractMemberExpression(parent, id => {
333335
registerVariable(id.name, exp, true, {
334336
start: id.start!,

0 commit comments

Comments
 (0)