diff --git a/packages/language-service/lib/plugins/vue-sfc.ts b/packages/language-service/lib/plugins/vue-sfc.ts index f04e8509e8..a911210849 100644 --- a/packages/language-service/lib/plugins/vue-sfc.ts +++ b/packages/language-service/lib/plugins/vue-sfc.ts @@ -23,8 +23,29 @@ export function create(): LanguageServicePlugin { sfcDataProvider ??= html.newHTMLDataProvider('vue', loadLanguageBlocks(context.env.locale ?? 'en')); return [sfcDataProvider]; }, + async getFormattingOptions(document, options, context) { + return await worker(document, async vueCode => { + + const formatSettings = await context.env.getConfiguration?.('html.format') ?? {}; + const blockTypes = ['template', 'script', 'style']; + + for (const customBlock of vueCode.sfc.customBlocks) { + blockTypes.push(customBlock.type); + } + + return { + ...options, + ...formatSettings, + wrapAttributes: 'auto', + unformatted: '', + contentUnformatted: blockTypes.join(','), + endWithNewline: options.insertFinalNewline ? true + : options.trimFinalNewlines ? false + : document.getText().endsWith('\n'), + }; + }) ?? {}; + }, }).create(context); - const htmlLanguageService: html.LanguageService = htmlPlugin.provide['html/languageService'](); return { @@ -148,28 +169,6 @@ export function create(): LanguageServicePlugin { return result; }); }, - - provideDocumentFormattingEdits(document, range, options) { - return worker(document, async vueCode => { - - const formatSettings = await context.env.getConfiguration?.('html.format') ?? {}; - const blockTypes = ['template', 'script', 'style']; - - for (const customBlock of vueCode.sfc.customBlocks) { - blockTypes.push(customBlock.type); - } - - return htmlLanguageService.format(document, range, { - ...options, - ...formatSettings, - unformatted: '', - contentUnformatted: blockTypes.join(','), - endWithNewline: options.insertFinalNewline ? true - : options.trimFinalNewlines ? false - : document.getText().endsWith('\n'), - }); - }); - }, }; function worker(document: TextDocument, callback: (vueSourceFile: vue.VueGeneratedCode) => T) { diff --git a/packages/language-service/tests/format/3987.spec.ts b/packages/language-service/tests/format/3987.spec.ts new file mode 100644 index 0000000000..e4656df22b --- /dev/null +++ b/packages/language-service/tests/format/3987.spec.ts @@ -0,0 +1,24 @@ +import { defineFormatTest } from '../utils/format'; + +defineFormatTest({ + title: '#' + __filename.split('.')[0], + languageId: 'vue', + input: ` + + `.trim(), + output: ` + + `.trim(), + settings: { + 'html.format.wrapAttributes': 'force-aligned', + }, +});