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;
}