From: 山吹色御守 <85992002+KazariEX@users.noreply.github.com> Date: Thu, 25 Dec 2025 13:17:15 +0000 (+0800) Subject: fix(compiler-vapor): avoid cache declarations for call expression member access ... X-Git-Tag: v3.6.0-beta.2~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cef372bce1df82dda1d9a8344ae2170453f09df0;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-vapor): avoid cache declarations for call expression member access (#14245) close #14244 --- diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap index 316cf92243..bddf5544cc 100644 --- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap +++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap @@ -270,6 +270,38 @@ export function render(_ctx) { }" `; +exports[`cache multiple access > should cache method call with same arguments 1`] = ` +"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue'; +const t0 = _template("
") + +export function render(_ctx) { + const n0 = t0() + const n1 = t0() + _renderEffect(() => { + const _msg_replace_1_2 = _ctx.msg.replace('1', '2') + _setProp(n0, "id", _msg_replace_1_2) + _setProp(n1, "id", _msg_replace_1_2) + }) + 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("
") + +export function render(_ctx) { + const n0 = t0() + const n1 = t0() + _renderEffect(() => { + const _msg = _ctx.msg + _setProp(n0, "id", _msg.replace('1', '2')) + _setProp(n1, "id", _msg.replace('1', '3')) + }) + return [n0, n1] +}" +`; + exports[`cache multiple access > variable name substring edge cases 1`] = ` "import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue'; const t0 = _template("
", true) diff --git a/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts b/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts index ddbc125cd5..7195e52afc 100644 --- a/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts +++ b/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts @@ -954,4 +954,24 @@ describe('cache multiple access', () => { expect(code).matchSnapshot() expect(code).not.contains('const _bar = _ctx.bar') }) + + test('should not cache method call with different arguments', () => { + const { code } = compileWithVBind(` +
+
+ `) + expect(code).matchSnapshot() + expect(code).contains('const _msg = _ctx.msg') + expect(code).not.contains('_ctx.msg.replace') + }) + + test('should cache method call with same arguments', () => { + const { code } = compileWithVBind(` +
+
+ `) + expect(code).matchSnapshot() + expect(code).contains(`const _msg_replace_1_2 = _ctx.msg.replace('1', '2')`) + expect(code).not.contains('const _msg = _ctx.msg') + }) }) diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts index 9012ee1f2e..3893282d6f 100644 --- a/packages/compiler-vapor/src/generators/expression.ts +++ b/packages/compiler-vapor/src/generators/expression.ts @@ -337,6 +337,12 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) { end: id.end!, }) }) + + const parentOfMemberExp = parentStack[parentStack.length - 2] + if (parentOfMemberExp && isCallExpression(parentOfMemberExp)) { + return + } + registerVariable( memberExp, exp, @@ -685,6 +691,12 @@ function extractMemberExpression( } } +const isCallExpression = (node: Node) => { + return ( + node.type === 'CallExpression' || node.type === 'OptionalCallExpression' + ) +} + const isMemberExpression = (node: Node) => { return ( node.type === 'MemberExpression' ||