From 8e09c994960f2209deb63cbddcfd8106045a1f61 Mon Sep 17 00:00:00 2001 From: zhiyuanzmj <260480378@qq.com> Date: Thu, 6 Nov 2025 20:20:19 +0800 Subject: [PATCH 1/2] fix(compiler-vapor): wrap event handler in parentheses for TSExpression --- .../transforms/__snapshots__/vOn.spec.ts.snap | 2 +- .../compiler-vapor/__tests__/transforms/vOn.spec.ts | 6 ++++-- packages/compiler-vapor/src/generators/event.ts | 10 +++++++++- packages/compiler-vapor/src/generators/expression.ts | 11 +++-------- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap index 8423cb2ed55..a5f1e83fbb6 100644 --- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap +++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap @@ -145,7 +145,7 @@ _delegateEvents("click") export function render(_ctx, $props, $emit, $attrs, $slots) { const n0 = t0() - n0.$evtclick = e => _ctx.handleClick(e) + n0.$evtclick = e => (_ctx.handleClick as any)(e) return n0 }" `; diff --git a/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts b/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts index 414ea0e298b..a8fca105134 100644 --- a/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts @@ -685,7 +685,7 @@ describe('v-on', () => { test('expression with type', () => { const { code } = compileWithVOn( - `
`, + `
`, { bindingMetadata: { handleClick: BindingTypes.SETUP_CONST, @@ -693,7 +693,9 @@ describe('v-on', () => { }, ) expect(code).matchSnapshot() - expect(code).include('n0.$evtclick = e => _ctx.handleClick(e)') + expect(code).include( + 'n0.$evtclick = e => (_ctx.handleClick as any)(e)', + ) }) test('component event with special characters', () => { diff --git a/packages/compiler-vapor/src/generators/event.ts b/packages/compiler-vapor/src/generators/event.ts index cfb47b61184..076d9435706 100644 --- a/packages/compiler-vapor/src/generators/event.ts +++ b/packages/compiler-vapor/src/generators/event.ts @@ -1,6 +1,7 @@ import { BindingTypes, type SimpleExpressionNode, + TS_NODE_TYPES, isFnExpression, isMemberExpression, } from '@vue/compiler-dom' @@ -126,7 +127,14 @@ export function genEventHandler( // non constant, wrap with invocation as `e => foo.bar(e)` // when passing as component handler, access is always dynamic so we // can skip this - handlerExp = [`e => `, ...handlerExp, `(e)`] + const isTSNode = value.ast && TS_NODE_TYPES.includes(value.ast.type) + handlerExp = [ + `e => `, + isTSNode ? '(' : '', + ...handlerExp, + isTSNode ? ')' : '', + `(e)`, + ] } } else if (isFnExpression(value, context.options)) { // Fn expression: @click="e => foo(e)" diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts index c70d4a56613..2faaa13ff5d 100644 --- a/packages/compiler-vapor/src/generators/expression.ts +++ b/packages/compiler-vapor/src/generators/expression.ts @@ -10,7 +10,6 @@ import { NewlineType, type SimpleExpressionNode, type SourceLocation, - TS_NODE_TYPES, advancePositionWithClone, createSimpleExpression, isInDestructureAssignment, @@ -64,7 +63,6 @@ export function genExpression( let hasMemberExpression = false if (ids.length) { const [frag, push] = buildCodeFragment() - const isTSNode = ast && TS_NODE_TYPES.includes(ast.type) ids .sort((a, b) => a.start! - b.start!) .forEach((id, i) => { @@ -73,11 +71,8 @@ export function genExpression( const end = id.end! - 1 const last = ids[i - 1] - if (!(isTSNode && i === 0)) { - const leadingText = content.slice(last ? last.end! - 1 : 0, start) - if (leadingText.length) push([leadingText, NewlineType.Unknown]) - } - + const leadingText = content.slice(last ? last.end! - 1 : 0, start) + if (leadingText.length) push([leadingText, NewlineType.Unknown]) const source = content.slice(start, end) const parentStack = parentStackMap.get(id)! const parent = parentStack[parentStack.length - 1] @@ -103,7 +98,7 @@ export function genExpression( ), ) - if (i === ids.length - 1 && end < content.length && !isTSNode) { + if (i === ids.length - 1 && end < content.length) { push([content.slice(end), NewlineType.Unknown]) } }) From 9d4d95ea5321fcba0fbb162a3a5b8b700fdd52f4 Mon Sep 17 00:00:00 2001 From: zhiyuanzmj <260480378@qq.com> Date: Thu, 6 Nov 2025 20:58:08 +0800 Subject: [PATCH 2/2] chore: update snap --- .../__tests__/transforms/__snapshots__/vOn.spec.ts.snap | 2 +- packages/compiler-vapor/__tests__/transforms/vOn.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap index a5f1e83fbb6..52c47030a80 100644 --- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap +++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap @@ -145,7 +145,7 @@ _delegateEvents("click") export function render(_ctx, $props, $emit, $attrs, $slots) { const n0 = t0() - n0.$evtclick = e => (_ctx.handleClick as any)(e) + n0.$evtclick = e => (_ctx.foo[_ctx.handleClick] as any)(e) return n0 }" `; diff --git a/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts b/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts index a8fca105134..3402f577f06 100644 --- a/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-vapor/__tests__/transforms/vOn.spec.ts @@ -685,7 +685,7 @@ describe('v-on', () => { test('expression with type', () => { const { code } = compileWithVOn( - `
`, + `
`, { bindingMetadata: { handleClick: BindingTypes.SETUP_CONST, @@ -694,7 +694,7 @@ describe('v-on', () => { ) expect(code).matchSnapshot() expect(code).include( - 'n0.$evtclick = e => (_ctx.handleClick as any)(e)', + 'n0.$evtclick = e => (_ctx.foo[_ctx.handleClick] as any)(e)', ) })