From e2ba21693a64ec211eec74cd7c97b3fad31f634d Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Mon, 3 Mar 2025 20:05:03 +0800 Subject: [PATCH 1/4] fix: transform parameter list into equivalent binding pattern --- .../language-core/lib/codegen/globalTypes.ts | 5 +- .../lib/codegen/template/vSlot.ts | 89 ++++++++++++++----- 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index a13ca52464..c284139623 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -135,10 +135,7 @@ export function generateGlobalTypes({ key: keyof T, index: number, ][]; - // @ts-ignore - function __VLS_getSlotParams(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>; - // @ts-ignore - function __VLS_getSlotParam(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>[0]; + function __VLS_getSlotParameters(slot: S, decl?: D): NonNullable extends (...args: infer P) => any ? P : any[]; function __VLS_asFunctionalDirective(dir: T): T extends import('${lib}').ObjectDirective ? NonNullable : T extends (...args: any) => any diff --git a/packages/language-core/lib/codegen/template/vSlot.ts b/packages/language-core/lib/codegen/template/vSlot.ts index 974209daf2..0c87e879ff 100644 --- a/packages/language-core/lib/codegen/template/vSlot.ts +++ b/packages/language-core/lib/codegen/template/vSlot.ts @@ -1,4 +1,5 @@ import * as CompilerDOM from '@vue/compiler-dom'; +import type * as ts from 'typescript'; import type { Code } from '../../types'; import { collectVars, createTsAst, endOfLine, newLine } from '../utils'; import { wrapWith } from '../utils/wrapWith'; @@ -41,31 +42,12 @@ export function* generateVSlot( `default` ); } - yield `: __VLS_thisSlot } = ${ctx.currentComponent.ctxVar}.slots!${endOfLine}`; + yield `: __VLS_slot } = ${ctx.currentComponent.ctxVar}.slots!${endOfLine}`; if (slotDir.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { const slotAst = createTsAst(options.ts, slotDir, `(${slotDir.exp.content}) => {}`); collectVars(options.ts, slotAst, slotAst, slotBlockVars); - if (!slotDir.exp.content.includes(':')) { - yield `const [`; - yield [ - slotDir.exp.content, - 'template', - slotDir.exp.loc.start.offset, - ctx.codeFeatures.all, - ]; - yield `] = __VLS_getSlotParams(__VLS_thisSlot)${endOfLine}`; - } - else { - yield `const `; - yield [ - slotDir.exp.content, - 'template', - slotDir.exp.loc.start.offset, - ctx.codeFeatures.all, - ]; - yield ` = __VLS_getSlotParam(__VLS_thisSlot)${endOfLine}`; - } + yield* generateSlotParameters(options, ctx, slotAst, slotDir.exp); } for (const varName of slotBlockVars) { @@ -109,6 +91,71 @@ export function* generateVSlot( yield `}${newLine}`; } +function* generateSlotParameters( + options: TemplateCodegenOptions, + ctx: TemplateCodegenContext, + ast: ts.SourceFile, + exp: CompilerDOM.SimpleExpressionNode +): Generator { + const { ts } = options; + + const statement = ast.statements[0]; + if (!ts.isExpressionStatement(statement) || !ts.isArrowFunction(statement.expression)) { + return; + } + + const { expression } = statement; + const startOffset = exp.loc.start.offset - 1; + const modifies: [Code[], number, number][] = []; + const types: (Code | null)[] = []; + + for (const { name, type } of expression.parameters) { + if (type) { + modifies.push([ + [``], + name.end, + type.end, + ]); + types.push(chunk(type.getStart(ast), type.end)); + } + else { + types.push(null); + } + } + + yield `const [`; + let nextStart = 1; + for (const [codes, start, end] of modifies) { + yield chunk(nextStart, start); + yield* codes; + nextStart = end; + } + yield chunk(nextStart, expression.equalsGreaterThanToken.pos - 1); + yield `] = __VLS_getSlotParameters(__VLS_slot`; + + if (types.some(t => t)) { + yield `, `; + yield* wrapWith( + exp.loc.start.offset, + exp.loc.end.offset, + ctx.codeFeatures.verification, + `(`, + ...types.flatMap(type => type ? [`_: `, type, `, `] : `_, `), + `) => [] as any` + ); + } + yield `)${endOfLine}`; + + function chunk(start: number, end: number): Code { + return [ + ast.text.slice(start, end), + 'template', + startOffset + start, + ctx.codeFeatures.all, + ]; + } +} + export function* generateImplicitDefaultSlot( ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode From 3f42a7c9076a2e4ddc531f3f17967318803b3d7d Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Mon, 3 Mar 2025 20:17:35 +0800 Subject: [PATCH 2/4] fix: type --- packages/language-core/lib/codegen/globalTypes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index c284139623..9b4e94a35e 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -135,7 +135,8 @@ export function generateGlobalTypes({ key: keyof T, index: number, ][]; - function __VLS_getSlotParameters(slot: S, decl?: D): NonNullable extends (...args: infer P) => any ? P : any[]; + function __VLS_getSlotParameters(slot: S, decl?: D): + __VLS_PickNotAny, (...args: any) => any> extends (...args: infer P) => any ? P : any[]; function __VLS_asFunctionalDirective(dir: T): T extends import('${lib}').ObjectDirective ? NonNullable : T extends (...args: any) => any From 1d01ccddc687ecf4d3282a4035810d4287148744 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Mon, 3 Mar 2025 20:18:46 +0800 Subject: [PATCH 3/4] fix: type --- packages/language-core/lib/codegen/globalTypes.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index 9b4e94a35e..10780f30c7 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -135,8 +135,7 @@ export function generateGlobalTypes({ key: keyof T, index: number, ][]; - function __VLS_getSlotParameters(slot: S, decl?: D): - __VLS_PickNotAny, (...args: any) => any> extends (...args: infer P) => any ? P : any[]; + function __VLS_getSlotParameters(slot: S, decl?: D): Parameters<__VLS_PickNotAny, (...args: any) => any>>; function __VLS_asFunctionalDirective(dir: T): T extends import('${lib}').ObjectDirective ? NonNullable : T extends (...args: any) => any From 50c5c507a529e46ebc4bfd3e904d9b5b1a30d8a2 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Mon, 3 Mar 2025 21:08:34 +0800 Subject: [PATCH 4/4] fix: type --- packages/language-core/lib/codegen/globalTypes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index 10780f30c7..ba6074250d 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -135,7 +135,8 @@ export function generateGlobalTypes({ key: keyof T, index: number, ][]; - function __VLS_getSlotParameters(slot: S, decl?: D): Parameters<__VLS_PickNotAny, (...args: any) => any>>; + function __VLS_getSlotParameters(slot: S, decl?: D): + __VLS_PickNotAny, (...args: any) => any> extends (...args: infer P) => any ? P : any[]; function __VLS_asFunctionalDirective(dir: T): T extends import('${lib}').ObjectDirective ? NonNullable : T extends (...args: any) => any