diff --git a/extensions/vscode-vue-language-features/schemas/vue-tsconfig.schema.json b/extensions/vscode-vue-language-features/schemas/vue-tsconfig.schema.json index 5095650fc..e4eb387d8 100644 --- a/extensions/vscode-vue-language-features/schemas/vue-tsconfig.schema.json +++ b/extensions/vscode-vue-language-features/schemas/vue-tsconfig.schema.json @@ -61,6 +61,10 @@ "type": "boolean", "markdownDescription": "https://github.com/johnsoncodehk/volar/issues/1249" }, + "experimentalUseScriptLeadingCommentInTemplate": { + "type": "boolean", + "markdownDescription": "https://github.com/johnsoncodehk/volar/issues/1369" + }, "experimentalResolveStyleCssClasses": { "enum": [ "scoped", diff --git a/packages/vue-typescript/src/types.ts b/packages/vue-typescript/src/types.ts index 87482d718..048bd733a 100644 --- a/packages/vue-typescript/src/types.ts +++ b/packages/vue-typescript/src/types.ts @@ -20,4 +20,5 @@ export interface VueCompilerOptions { experimentalDisableTemplateSupport?: boolean; experimentalResolveStyleCssClasses?: 'scoped' | 'always' | 'never'; experimentalAllowTypeNarrowingInInlineHandlers?: boolean; + experimentalUseScriptLeadingCommentInTemplate?: boolean; } diff --git a/packages/vue-typescript/src/use/useSfcTemplateScript.ts b/packages/vue-typescript/src/use/useSfcTemplateScript.ts index 12f34541a..b2c2726e6 100644 --- a/packages/vue-typescript/src/use/useSfcTemplateScript.ts +++ b/packages/vue-typescript/src/use/useSfcTemplateScript.ts @@ -39,6 +39,20 @@ export function useSfcTemplateScript( disableTemplateScript: boolean, ) { const baseFileName = path.basename(fileName); + const scriptLeadingComment = computed(() => { + let comments: string[] = []; + if (compilerOptions.experimentalUseScriptLeadingCommentInTemplate ?? true) { + for (const _script of [script, scriptSetup]) { + if (_script.value) { + const commentRanges = ts.getLeadingCommentRanges(_script.value.content, 0); + if (commentRanges) { + comments = commentRanges.map(range => _script.value!.content.substring(range.pos, range.end)); + } + } + } + } + return comments.join('\n'); + }); const cssModuleClasses = computed(() => styleFiles.value.reduce((obj, style) => { if (style.data.module) { @@ -85,6 +99,7 @@ export function useSfcTemplateScript( const codeGen = new CodeGen(); + codeGen.addText(scriptLeadingComment.value + '\n'); codeGen.addText(`import * as __VLS_types from './__VLS_types';\n`); if (script.value || scriptSetup.value) {