Skip to content

Commit 7d8c939

Browse files
committed
feat: support auto-complete for template local variables
close #1284
1 parent ef261c4 commit 7d8c939

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

packages/vue-code-gen/src/generators/template.ts

+15
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,13 @@ export function generate(
497497
}
498498
tsCodeGen.addText(`) {\n`);
499499

500+
// fix https://github.com/johnsoncodehk/volar/issues/1284
501+
tsCodeGen.addText(`declare const __VLS_ctx: typeof __VLS_ctxBase & {\n`);
502+
for (const localVar in localVars) {
503+
tsCodeGen.addText(`${localVar}: typeof ${localVar},\n`);
504+
}
505+
tsCodeGen.addText(`};\n`);
506+
500507
for (const childNode of node.children) {
501508
visitNode(childNode, parentEl);
502509
}
@@ -595,6 +602,14 @@ export function generate(
595602

596603
for (const varName of slotBlockVars)
597604
localVars[varName] = (localVars[varName] ?? 0) + 1;
605+
606+
if (slotBlockVars.length) {
607+
tsCodeGen.addText(`declare const __VLS_ctx: typeof __VLS_ctxBase & {\n`);
608+
for (const localVar of slotBlockVars) {
609+
tsCodeGen.addText(`${localVar}: typeof ${localVar},\n`);
610+
}
611+
tsCodeGen.addText(`};\n`);
612+
}
598613
}
599614
writeDirectives(node);
600615
writeElReferences(node); // <el ref="foo" />

packages/vue-typescript/src/use/useSfcTemplateScript.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export function useSfcTemplateScript(
9898

9999
writeImportTypes();
100100

101-
codeGen.addText(`declare var __VLS_ctx: InstanceType<typeof __VLS_component> & {\n`);
101+
codeGen.addText(`declare const __VLS_ctxBase: InstanceType<typeof __VLS_component> & {\n`);
102102
/* CSS Module */
103103
const cssModuleMappingsArr: ReturnType<typeof writeCssClassProperties>[] = [];
104104
for (const moduleName in cssModuleClasses.value) {
@@ -108,15 +108,16 @@ export function useSfcTemplateScript(
108108
codeGen.addText('};\n');
109109
}
110110
codeGen.addText(`};\n`);
111+
codeGen.addText(`declare const __VLS_ctx: typeof __VLS_ctxBase;\n`);
111112

112-
codeGen.addText(`declare var __VLS_vmUnwrap: typeof __VLS_options & { components: { } };\n`);
113+
codeGen.addText(`declare const __VLS_vmUnwrap: typeof __VLS_options & { components: { } };\n`);
113114

114115
/* Components */
115116
codeGen.addText('/* Components */\n');
116-
codeGen.addText('declare var __VLS_otherComponents: NonNullable<typeof __VLS_component extends { components: infer C } ? C : {}> & __VLS_types.GlobalComponents & typeof __VLS_vmUnwrap.components & __VLS_types.PickComponents<typeof __VLS_ctx>;\n');
117-
codeGen.addText('declare var __VLS_ownComponent: __VLS_types.SelfComponent<typeof __VLS_name, typeof __VLS_component>;\n');
118-
codeGen.addText('declare var __VLS_allComponents: typeof __VLS_otherComponents & Omit<typeof __VLS_ownComponent, keyof typeof __VLS_otherComponents>;\n');
119-
codeGen.addText('declare var __VLS_rawComponents: __VLS_types.ConvertInvalidComponents<typeof __VLS_allComponents> & JSX.IntrinsicElements;\n'); // sort by priority
117+
codeGen.addText('declare const __VLS_otherComponents: NonNullable<typeof __VLS_component extends { components: infer C } ? C : {}> & __VLS_types.GlobalComponents & typeof __VLS_vmUnwrap.components & __VLS_types.PickComponents<typeof __VLS_ctx>;\n');
118+
codeGen.addText('declare const __VLS_ownComponent: __VLS_types.SelfComponent<typeof __VLS_name, typeof __VLS_component>;\n');
119+
codeGen.addText('declare const __VLS_allComponents: typeof __VLS_otherComponents & Omit<typeof __VLS_ownComponent, keyof typeof __VLS_otherComponents>;\n');
120+
codeGen.addText('declare const __VLS_rawComponents: __VLS_types.ConvertInvalidComponents<typeof __VLS_allComponents> & JSX.IntrinsicElements;\n'); // sort by priority
120121

121122
codeGen.addText(`__VLS_allComponents.${SearchTexts.Components};\n`);
122123
codeGen.addText(`({} as __VLS_types.GlobalAttrs).${SearchTexts.GlobalAttrs};\n`);
@@ -126,7 +127,7 @@ export function useSfcTemplateScript(
126127
codeGen.addText('type __VLS_StyleScopedClasses = {\n');
127128
const cssScopedMappings = writeCssClassProperties(cssScopedClasses.value, true, 'boolean', true);
128129
codeGen.addText('};\n');
129-
codeGen.addText('declare var __VLS_styleScopedClasses: __VLS_StyleScopedClasses | keyof __VLS_StyleScopedClasses | (keyof __VLS_StyleScopedClasses)[];\n');
130+
codeGen.addText('declare const __VLS_styleScopedClasses: __VLS_StyleScopedClasses | keyof __VLS_StyleScopedClasses | (keyof __VLS_StyleScopedClasses)[];\n');
130131

131132
codeGen.addText(`/* CSS variable injection */\n`);
132133
writeCssVars();

0 commit comments

Comments
 (0)