]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-vapor): cache optional call expression (#14246)
authoredison <daiwei521@126.com>
Thu, 25 Dec 2025 13:30:40 +0000 (21:30 +0800)
committerGitHub <noreply@github.com>
Thu, 25 Dec 2025 13:30:40 +0000 (21:30 +0800)
packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
packages/compiler-vapor/__tests__/transforms/vBind.spec.ts
packages/compiler-vapor/src/generators/expression.ts

index bddf5544cc02802789e98b3652d28c20854b9d3d..0594b0037ccf925998f21e3806bf5cbe6fff292c 100644 (file)
@@ -286,6 +286,22 @@ export function render(_ctx) {
 }"
 `;
 
+exports[`cache multiple access > should cache optional call expression with same arguments 1`] = `
+"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("<div></div>")
+
+export function render(_ctx) {
+  const n0 = t0()
+  const n1 = t0()
+  _renderEffect(() => {
+    const _obj_foo_bar = _ctx.obj[_ctx.foo?.(_ctx.bar)]
+    _setProp(n0, "id", _obj_foo_bar)
+    _setProp(n1, "id", _obj_foo_bar)
+  })
+  return [n0, n1]
+}"
+`;
+
 exports[`cache multiple access > should not cache method call with different arguments 1`] = `
 "import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
 const t0 = _template("<div></div>")
index 7195e52afca6dcd6f2cbe68852e0ccefde7e451c..2e459a8a41d39f3f0fd391ca6811f32494fbec74 100644 (file)
@@ -974,4 +974,13 @@ describe('cache multiple access', () => {
     expect(code).contains(`const _msg_replace_1_2 = _ctx.msg.replace('1', '2')`)
     expect(code).not.contains('const _msg = _ctx.msg')
   })
+
+  test('should cache optional call expression with same arguments', () => {
+    const { code } = compileWithVBind(`
+      <div :id="obj[foo?.(bar)]"></div>
+      <div :id="obj[foo?.(bar)]"></div>
+    `)
+    expect(code).matchSnapshot()
+    expect(code).contains(`const _obj_foo_bar = _ctx.obj[_ctx.foo?.(_ctx.bar)]`)
+  })
 })
index 3893282d6fa07cde9ed8633789c0ef69e9d1c07f..7dca94d55788cb9473386fd386238a02ffdf6506 100644 (file)
@@ -677,6 +677,8 @@ function extractMemberExpression(
       return `${extractMemberExpression(exp.left, onIdentifier)} ${exp.operator} ${extractMemberExpression(exp.right, onIdentifier)}`
     case 'CallExpression': // foo[bar(baz)]
       return `${extractMemberExpression(exp.callee, onIdentifier)}(${exp.arguments.map(arg => extractMemberExpression(arg, onIdentifier)).join(', ')})`
+    case 'OptionalCallExpression': // foo[bar?.(baz)]
+      return `${extractMemberExpression(exp.callee, onIdentifier)}?.(${exp.arguments.map(arg => extractMemberExpression(arg, onIdentifier)).join(', ')})`
     case 'MemberExpression': // foo[bar.baz]
     case 'OptionalMemberExpression': // foo?.bar
       const object = extractMemberExpression(exp.object, onIdentifier)