}"
`;
+exports[`cache multiple access > dynamic property access with parentheses 1`] = `
+"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("<div></div>", true)
+
+export function render(_ctx) {
+ const n0 = t0()
+ _renderEffect(() => {
+ const _foo_bar = _ctx.foo[_ctx.bar]
+ _setProp(n0, "x", (_foo_bar).x)
+ _setProp(n0, "bar", (_foo_bar))
+ })
+ return n0
+}"
+`;
+
exports[`cache multiple access > function calls with arguments 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>")
expect(code).contains('_setProp(n0, "id", _obj[1][_ctx.baz] + _obj.bar)')
})
+ test('dynamic property access with parentheses', () => {
+ const { code } = compileWithVBind(`
+ <div :x="(foo[bar]).x" :bar="(foo[bar])"></div>
+ `)
+ expect(code).matchSnapshot()
+ expect(code).contains('const _foo_bar = _ctx.foo[_ctx.bar]')
+ expect(code).contains('_setProp(n0, "x", (_foo_bar).x)')
+ expect(code).contains('_setProp(n0, "bar", (_foo_bar))')
+ })
+
test('variable name substring edge cases', () => {
const { code } = compileWithVBind(
`<div :id="title + titles + title"></div>`,
continue
}
+ const seenParents = new Set<Node>()
walkIdentifiers(exp.ast, (currentNode, parent, parentStack) => {
- if (parent && isMemberExpression(parent)) {
+ if (parent && isMemberExpression(parent) && !seenParents.has(parent)) {
+ seenParents.add(parent)
const memberExp = extractMemberExpression(parent, id => {
registerVariable(id.name, exp, true, {
start: id.start!,