diff --git a/packages/language-server/tests/completions.spec.ts b/packages/language-server/tests/completions.spec.ts index 512dda3db5..ba3b43a022 100644 --- a/packages/language-server/tests/completions.spec.ts +++ b/packages/language-server/tests/completions.spec.ts @@ -194,6 +194,154 @@ test('HTML tags and built-in components', async () => { "template", "BaseTransition", "Fixture", + ] + `); +}); + +test('Auto import', async () => { + const server = await getLanguageServer(); + server.tsserver.message({ + seq: server.nextSeq(), + command: 'configure', + arguments: { + preferences: { + includeCompletionsForModuleExports: true, + includeCompletionsWithInsertText: true, + }, + } satisfies import('typescript').server.protocol.ConfigureRequestArguments, + }); + const items = (await requestCompletionListToVueServer('fixture.vue', 'vue', ``)).items; + console.log(items); + expect( + (await requestCompletionListToVueServer('fixture.vue', 'vue', ``)).items + .map(item => item.label), + ).toMatchInlineSnapshot(` + [ + "!DOCTYPE", + "html", + "head", + "title", + "base", + "link", + "meta", + "style", + "body", + "article", + "section", + "nav", + "aside", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "footer", + "address", + "p", + "hr", + "pre", + "blockquote", + "ol", + "ul", + "li", + "dl", + "dt", + "dd", + "figure", + "figcaption", + "main", + "div", + "a", + "em", + "strong", + "small", + "s", + "cite", + "q", + "dfn", + "abbr", + "ruby", + "rb", + "rt", + "rp", + "time", + "code", + "var", + "samp", + "kbd", + "sub", + "sup", + "i", + "b", + "u", + "mark", + "bdi", + "bdo", + "span", + "br", + "wbr", + "ins", + "del", + "picture", + "img", + "iframe", + "embed", + "object", + "param", + "video", + "audio", + "source", + "track", + "map", + "area", + "table", + "caption", + "colgroup", + "col", + "tbody", + "thead", + "tfoot", + "tr", + "td", + "th", + "form", + "label", + "input", + "button", + "select", + "datalist", + "optgroup", + "option", + "textarea", + "output", + "progress", + "meter", + "fieldset", + "legend", + "details", + "summary", + "dialog", + "script", + "noscript", + "canvas", + "data", + "hgroup", + "menu", + "search", + "fencedframe", + "selectedcontent", + "Transition", + "TransitionGroup", + "KeepAlive", + "Teleport", + "Suspense", + "component", + "slot", + "template", + "BaseTransition", + "Fixture", "BaseTransition", "BaseTransitionPropsValidators", "callWithAsyncErrorHandling", diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index 5d5bdbfbd8..e1deab3ee8 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -19,8 +19,6 @@ import { camelize, capitalize } from '@vue/shared'; import type { ComponentPropInfo } from '@vue/typescript-plugin/lib/requests/getComponentProps'; import { create as createHtmlService, resolveReference } from 'volar-service-html'; import { create as createPugService } from 'volar-service-pug'; -import { getFormatCodeSettings } from 'volar-service-typescript/lib/configs/getFormatCodeSettings.js'; -import { getUserPreferences } from 'volar-service-typescript/lib/configs/getUserPreferences.js'; import { applyCompletionEntryDetails, convertCompletionInfo, @@ -278,7 +276,6 @@ export function create( const transformedItems = new WeakSet(); let initializing: Promise | undefined; - let formattingOptions: html.FormattingOptions | undefined; let lastCompletionDocument: TextDocument | undefined; return { @@ -289,16 +286,6 @@ export function create( disposable?.dispose(); }, - provideDocumentFormattingEdits(document, range, options, ...rest) { - formattingOptions = options; - return baseServiceInstance.provideDocumentFormattingEdits?.(document, range, options, ...rest); - }, - - provideOnTypeFormattingEdits(document, position, key, options, ...rest) { - formattingOptions = options; - return baseServiceInstance.provideOnTypeFormattingEdits?.(document, position, key, options, ...rest); - }, - async provideCompletionItems(document, position, completionContext, token) { if (document.languageId !== languageId) { return; @@ -340,15 +327,9 @@ export function create( const map = context.language.maps.get(info.code, info.script); let spliced = false; for (const [sourceOffset] of map.toSourceLocation(offset)) { - const [formatOptions, preferences] = await Promise.all([ - getFormatCodeSettings(context, document, formattingOptions), - getUserPreferences(context, document), - ]); const autoImport = await getAutoImportSuggestions( info.root.fileName, sourceOffset, - preferences, - formatOptions, ); if (!autoImport) { continue; @@ -515,11 +496,7 @@ export function create( if (!sourceScript) { return item; } - const [formatOptions, preferences] = await Promise.all([ - getFormatCodeSettings(context, lastCompletionDocument!, formattingOptions), - getUserPreferences(context, lastCompletionDocument!), - ]); - const details = await resolveAutoImportCompletionEntry(item.data, preferences, formatOptions); + const details = await resolveAutoImportCompletionEntry(item.data); if (details) { const virtualCode = sourceScript.generated!.embeddedCodes.get(decoded[1])!; const sourceDocument = context.documents.get( diff --git a/packages/typescript-plugin/index.ts b/packages/typescript-plugin/index.ts index c082cce47a..a9008031f6 100644 --- a/packages/typescript-plugin/index.ts +++ b/packages/typescript-plugin/index.ts @@ -136,8 +136,7 @@ export = createLanguageServicePlugin( ); }); session.addProtocolHandler('_vue:getAutoImportSuggestions', request => { - const [fileName, position, preferences, formatOptions]: Parameters = - request.arguments; + const [fileName, position]: Parameters = request.arguments; const { project, language, sourceScript, virtualCode } = getProjectAndVirtualCode(fileName); const tsLanguageService = projectToOriginalLanguageService.get(project); if (!tsLanguageService) { @@ -156,8 +155,8 @@ export = createLanguageServicePlugin( const result = tsLanguageService.getCompletionsAtPosition( fileName, tsPosition2, - preferences, - formatOptions, + session['getPreferences'](fileName), + session['getFormatOptions'](fileName), ); if (result) { resolveCompletionResult( @@ -183,7 +182,12 @@ export = createLanguageServicePlugin( } return createResponse(result); } - const result = tsLanguageService.getCompletionsAtPosition(fileName, 0, preferences, formatOptions); + const result = tsLanguageService.getCompletionsAtPosition( + fileName, + 0, + session['getPreferences'](fileName), + session['getFormatOptions'](fileName), + ); if (result) { resolveCompletionResult( ts, @@ -211,8 +215,7 @@ export = createLanguageServicePlugin( return createResponse(undefined); }); session.addProtocolHandler('_vue:resolveAutoImportCompletionEntry', request => { - const [data, preferences, formatOptions]: Parameters = - request.arguments; + const [data]: Parameters = request.arguments; if (!(data as any).__getAutoImportSuggestions) { return createResponse(undefined); } @@ -226,9 +229,9 @@ export = createLanguageServicePlugin( fileName, position, entryName, - formatOptions, + session['getFormatOptions'](fileName), source, - preferences, + session['getPreferences'](fileName), data, ); if (details) { diff --git a/packages/typescript-plugin/lib/requests/index.ts b/packages/typescript-plugin/lib/requests/index.ts index 008bc7687f..38cd410fb3 100644 --- a/packages/typescript-plugin/lib/requests/index.ts +++ b/packages/typescript-plugin/lib/requests/index.ts @@ -59,12 +59,8 @@ export interface Requests { getAutoImportSuggestions( fileName: string, position: number, - preferences: ts.UserPreferences, - formatOptions: ts.FormatCodeSettings, ): Response; resolveAutoImportCompletionEntry( data: ts.CompletionEntryData, - preferences: ts.UserPreferences, - formatOptions: ts.FormatCodeSettings, ): Response; }