diff --git a/packages/vscode-vue-languageservice/src/generators/template.ts b/packages/vscode-vue-languageservice/src/generators/template.ts index f5dca33f19..9b7f282689 100644 --- a/packages/vscode-vue-languageservice/src/generators/template.ts +++ b/packages/vscode-vue-languageservice/src/generators/template.ts @@ -75,10 +75,10 @@ export function generate( }>, }> = {}; const tagResolves: Record, offsets: number[], }> = {}; @@ -94,6 +94,7 @@ export function generate( const var_rawComponent = `__VLS_${elementIndex++}`; const var_baseProps = `__VLS_${elementIndex++}`; const var_emit = `__VLS_${elementIndex++}`; + const var_slots = `__VLS_${elementIndex++}`; const var_events: Record = {}; tsCodeGen.addText(`declare const ${var_correctTagName}: __VLS_GetComponentName;\n`); @@ -101,6 +102,10 @@ export function generate( tsCodeGen.addText(`declare const ${var_rawComponent}: __VLS_GetProperty;\n`); tsCodeGen.addText(`declare const ${var_baseProps}: __VLS_ExtractComponentProps;\n`); tsCodeGen.addText(`declare const ${var_emit}: __VLS_ExtractEmit2;\n`); + tsCodeGen.addText(`declare const ${var_slots}: + __VLS_TemplateSlots + & __VLS_ScriptSlots + & __VLS_DefaultSlots;\n`); const resolvedTag = tags[tag]; const tagRanges = resolvedTag.offsets.map(offset => ({ start: offset, end: offset + tag.length })); @@ -212,10 +217,10 @@ export function generate( } tagResolves[tag] = { - name: var_correctTagName, rawComponent: var_rawComponent, baseProps: var_baseProps, emit: var_emit, + slots: var_slots, events: var_events, offsets: tags[tag].offsets.map(offset => htmlToTemplate(offset, offset)).filter(shared.notEmpty), }; @@ -1123,7 +1128,7 @@ export function generate( slotName = prop.arg.content; } const diagStart = tsCodeGen.getText().length; - tsCodeGen.addText(`({ ...__VLS_getTemplateSlots(__VLS_wrapComponents[${tagResolves[parentEl.tag].name}]), ...__VLS_getScriptSlots(__VLS_rawComponents[${tagResolves[parentEl.tag].name}])})`); + tsCodeGen.addText(tagResolves[parentEl.tag].slots); const argRange = prop.arg ? { start: prop.arg.loc.start.offset, diff --git a/packages/vscode-vue-languageservice/src/utils/globalDoc.ts b/packages/vscode-vue-languageservice/src/utils/globalDoc.ts index 2344e8da36..217ce15cdf 100644 --- a/packages/vscode-vue-languageservice/src/utils/globalDoc.ts +++ b/packages/vscode-vue-languageservice/src/utils/globalDoc.ts @@ -79,8 +79,13 @@ declare global { function __VLS_directiveFunction(dir: T): T extends ObjectDirective ? V extends { value: infer V_2 } ? (value: V_2) => void : (value: V) => void : T extends FunctionDirective ? V extends { value: infer V_2 } ? (value: V_2) => void : (value: V) => void : T; - function __VLS_getTemplateSlots(t: T): T extends { __VLS_slots: infer S } ? S : {}; - function __VLS_getScriptSlots(t: T): T extends new (...args: any) => { $slots?: infer S } ? (S extends object ? S : {}) : {}; + type __VLS_TemplateSlots = T extends { __VLS_slots: infer S } ? S : {}; + type __VLS_ScriptSlots = T extends new (...args: any) => { $slots?: infer S } + ? { [K in keyof S]: S[K] extends (obj: infer O) => any ? O : S[K] } + : {}; + type __VLS_DefaultSlots = W extends { __VLS_slots: infer _ } + ? {} : R extends new (...args: any) => { $slots?: infer _ } + ? {} : Record; type __VLS_GetComponentName = K extends keyof T ? IsAny extends false ? K : __VLS_GetComponentName_CamelCase> : __VLS_GetComponentName_CamelCase>; type __VLS_GetComponentName_CamelCase = K extends keyof T ? IsAny extends false ? K : __VLS_GetComponentName_CapitalCase> : __VLS_GetComponentName_CapitalCase>;