Skip to content

Commit 8b9d74c

Browse files
fix(typescript-plugin): get preferences and formatOptions in tsserver (#5829)
1 parent b1f9ad0 commit 8b9d74c

File tree

4 files changed

+161
-37
lines changed

4 files changed

+161
-37
lines changed

packages/language-server/tests/completions.spec.ts

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,154 @@ test('HTML tags and built-in components', async () => {
194194
"template",
195195
"BaseTransition",
196196
"Fixture",
197+
]
198+
`);
199+
});
200+
201+
test('Auto import', async () => {
202+
const server = await getLanguageServer();
203+
server.tsserver.message({
204+
seq: server.nextSeq(),
205+
command: 'configure',
206+
arguments: {
207+
preferences: {
208+
includeCompletionsForModuleExports: true,
209+
includeCompletionsWithInsertText: true,
210+
},
211+
} satisfies import('typescript').server.protocol.ConfigureRequestArguments,
212+
});
213+
const items = (await requestCompletionListToVueServer('fixture.vue', 'vue', `<template><| /></template>`)).items;
214+
console.log(items);
215+
expect(
216+
(await requestCompletionListToVueServer('fixture.vue', 'vue', `<template><| /></template>`)).items
217+
.map(item => item.label),
218+
).toMatchInlineSnapshot(`
219+
[
220+
"!DOCTYPE",
221+
"html",
222+
"head",
223+
"title",
224+
"base",
225+
"link",
226+
"meta",
227+
"style",
228+
"body",
229+
"article",
230+
"section",
231+
"nav",
232+
"aside",
233+
"h1",
234+
"h2",
235+
"h3",
236+
"h4",
237+
"h5",
238+
"h6",
239+
"header",
240+
"footer",
241+
"address",
242+
"p",
243+
"hr",
244+
"pre",
245+
"blockquote",
246+
"ol",
247+
"ul",
248+
"li",
249+
"dl",
250+
"dt",
251+
"dd",
252+
"figure",
253+
"figcaption",
254+
"main",
255+
"div",
256+
"a",
257+
"em",
258+
"strong",
259+
"small",
260+
"s",
261+
"cite",
262+
"q",
263+
"dfn",
264+
"abbr",
265+
"ruby",
266+
"rb",
267+
"rt",
268+
"rp",
269+
"time",
270+
"code",
271+
"var",
272+
"samp",
273+
"kbd",
274+
"sub",
275+
"sup",
276+
"i",
277+
"b",
278+
"u",
279+
"mark",
280+
"bdi",
281+
"bdo",
282+
"span",
283+
"br",
284+
"wbr",
285+
"ins",
286+
"del",
287+
"picture",
288+
"img",
289+
"iframe",
290+
"embed",
291+
"object",
292+
"param",
293+
"video",
294+
"audio",
295+
"source",
296+
"track",
297+
"map",
298+
"area",
299+
"table",
300+
"caption",
301+
"colgroup",
302+
"col",
303+
"tbody",
304+
"thead",
305+
"tfoot",
306+
"tr",
307+
"td",
308+
"th",
309+
"form",
310+
"label",
311+
"input",
312+
"button",
313+
"select",
314+
"datalist",
315+
"optgroup",
316+
"option",
317+
"textarea",
318+
"output",
319+
"progress",
320+
"meter",
321+
"fieldset",
322+
"legend",
323+
"details",
324+
"summary",
325+
"dialog",
326+
"script",
327+
"noscript",
328+
"canvas",
329+
"data",
330+
"hgroup",
331+
"menu",
332+
"search",
333+
"fencedframe",
334+
"selectedcontent",
335+
"Transition",
336+
"TransitionGroup",
337+
"KeepAlive",
338+
"Teleport",
339+
"Suspense",
340+
"component",
341+
"slot",
342+
"template",
343+
"BaseTransition",
344+
"Fixture",
197345
"BaseTransition",
198346
"BaseTransitionPropsValidators",
199347
"callWithAsyncErrorHandling",

packages/language-service/lib/plugins/vue-template.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import { camelize, capitalize } from '@vue/shared';
1919
import type { ComponentPropInfo } from '@vue/typescript-plugin/lib/requests/getComponentProps';
2020
import { create as createHtmlService, resolveReference } from 'volar-service-html';
2121
import { create as createPugService } from 'volar-service-pug';
22-
import { getFormatCodeSettings } from 'volar-service-typescript/lib/configs/getFormatCodeSettings.js';
23-
import { getUserPreferences } from 'volar-service-typescript/lib/configs/getUserPreferences.js';
2422
import {
2523
applyCompletionEntryDetails,
2624
convertCompletionInfo,
@@ -278,7 +276,6 @@ export function create(
278276
const transformedItems = new WeakSet<html.CompletionItem>();
279277

280278
let initializing: Promise<void> | undefined;
281-
let formattingOptions: html.FormattingOptions | undefined;
282279
let lastCompletionDocument: TextDocument | undefined;
283280

284281
return {
@@ -289,16 +286,6 @@ export function create(
289286
disposable?.dispose();
290287
},
291288

292-
provideDocumentFormattingEdits(document, range, options, ...rest) {
293-
formattingOptions = options;
294-
return baseServiceInstance.provideDocumentFormattingEdits?.(document, range, options, ...rest);
295-
},
296-
297-
provideOnTypeFormattingEdits(document, position, key, options, ...rest) {
298-
formattingOptions = options;
299-
return baseServiceInstance.provideOnTypeFormattingEdits?.(document, position, key, options, ...rest);
300-
},
301-
302289
async provideCompletionItems(document, position, completionContext, token) {
303290
if (document.languageId !== languageId) {
304291
return;
@@ -340,15 +327,9 @@ export function create(
340327
const map = context.language.maps.get(info.code, info.script);
341328
let spliced = false;
342329
for (const [sourceOffset] of map.toSourceLocation(offset)) {
343-
const [formatOptions, preferences] = await Promise.all([
344-
getFormatCodeSettings(context, document, formattingOptions),
345-
getUserPreferences(context, document),
346-
]);
347330
const autoImport = await getAutoImportSuggestions(
348331
info.root.fileName,
349332
sourceOffset,
350-
preferences,
351-
formatOptions,
352333
);
353334
if (!autoImport) {
354335
continue;
@@ -515,11 +496,7 @@ export function create(
515496
if (!sourceScript) {
516497
return item;
517498
}
518-
const [formatOptions, preferences] = await Promise.all([
519-
getFormatCodeSettings(context, lastCompletionDocument!, formattingOptions),
520-
getUserPreferences(context, lastCompletionDocument!),
521-
]);
522-
const details = await resolveAutoImportCompletionEntry(item.data, preferences, formatOptions);
499+
const details = await resolveAutoImportCompletionEntry(item.data);
523500
if (details) {
524501
const virtualCode = sourceScript.generated!.embeddedCodes.get(decoded[1])!;
525502
const sourceDocument = context.documents.get(

packages/typescript-plugin/index.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ export = createLanguageServicePlugin(
136136
);
137137
});
138138
session.addProtocolHandler('_vue:getAutoImportSuggestions', request => {
139-
const [fileName, position, preferences, formatOptions]: Parameters<Requests['getAutoImportSuggestions']> =
140-
request.arguments;
139+
const [fileName, position]: Parameters<Requests['getAutoImportSuggestions']> = request.arguments;
141140
const { project, language, sourceScript, virtualCode } = getProjectAndVirtualCode(fileName);
142141
const tsLanguageService = projectToOriginalLanguageService.get(project);
143142
if (!tsLanguageService) {
@@ -156,8 +155,8 @@ export = createLanguageServicePlugin(
156155
const result = tsLanguageService.getCompletionsAtPosition(
157156
fileName,
158157
tsPosition2,
159-
preferences,
160-
formatOptions,
158+
session['getPreferences'](fileName),
159+
session['getFormatOptions'](fileName),
161160
);
162161
if (result) {
163162
resolveCompletionResult(
@@ -183,7 +182,12 @@ export = createLanguageServicePlugin(
183182
}
184183
return createResponse(result);
185184
}
186-
const result = tsLanguageService.getCompletionsAtPosition(fileName, 0, preferences, formatOptions);
185+
const result = tsLanguageService.getCompletionsAtPosition(
186+
fileName,
187+
0,
188+
session['getPreferences'](fileName),
189+
session['getFormatOptions'](fileName),
190+
);
187191
if (result) {
188192
resolveCompletionResult(
189193
ts,
@@ -211,8 +215,7 @@ export = createLanguageServicePlugin(
211215
return createResponse(undefined);
212216
});
213217
session.addProtocolHandler('_vue:resolveAutoImportCompletionEntry', request => {
214-
const [data, preferences, formatOptions]: Parameters<Requests['resolveAutoImportCompletionEntry']> =
215-
request.arguments;
218+
const [data]: Parameters<Requests['resolveAutoImportCompletionEntry']> = request.arguments;
216219
if (!(data as any).__getAutoImportSuggestions) {
217220
return createResponse(undefined);
218221
}
@@ -226,9 +229,9 @@ export = createLanguageServicePlugin(
226229
fileName,
227230
position,
228231
entryName,
229-
formatOptions,
232+
session['getFormatOptions'](fileName),
230233
source,
231-
preferences,
234+
session['getPreferences'](fileName),
232235
data,
233236
);
234237
if (details) {

packages/typescript-plugin/lib/requests/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,8 @@ export interface Requests {
5959
getAutoImportSuggestions(
6060
fileName: string,
6161
position: number,
62-
preferences: ts.UserPreferences,
63-
formatOptions: ts.FormatCodeSettings,
6462
): Response<ts.CompletionInfo>;
6563
resolveAutoImportCompletionEntry(
6664
data: ts.CompletionEntryData,
67-
preferences: ts.UserPreferences,
68-
formatOptions: ts.FormatCodeSettings,
6965
): Response<ts.CompletionEntryDetails>;
7066
}

0 commit comments

Comments
 (0)