Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 148 additions & 0 deletions packages/language-server/tests/completions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', `<template><| /></template>`)).items;
console.log(items);
expect(
(await requestCompletionListToVueServer('fixture.vue', 'vue', `<template><| /></template>`)).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",
Expand Down
25 changes: 1 addition & 24 deletions packages/language-service/lib/plugins/vue-template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -278,7 +276,6 @@ export function create(
const transformedItems = new WeakSet<html.CompletionItem>();

let initializing: Promise<void> | undefined;
let formattingOptions: html.FormattingOptions | undefined;
let lastCompletionDocument: TextDocument | undefined;

return {
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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(
Expand Down
21 changes: 12 additions & 9 deletions packages/typescript-plugin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,7 @@ export = createLanguageServicePlugin(
);
});
session.addProtocolHandler('_vue:getAutoImportSuggestions', request => {
const [fileName, position, preferences, formatOptions]: Parameters<Requests['getAutoImportSuggestions']> =
request.arguments;
const [fileName, position]: Parameters<Requests['getAutoImportSuggestions']> = request.arguments;
const { project, language, sourceScript, virtualCode } = getProjectAndVirtualCode(fileName);
const tsLanguageService = projectToOriginalLanguageService.get(project);
if (!tsLanguageService) {
Expand All @@ -156,8 +155,8 @@ export = createLanguageServicePlugin(
const result = tsLanguageService.getCompletionsAtPosition(
fileName,
tsPosition2,
preferences,
formatOptions,
session['getPreferences'](fileName),
session['getFormatOptions'](fileName),
);
if (result) {
resolveCompletionResult(
Expand All @@ -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,
Expand Down Expand Up @@ -211,8 +215,7 @@ export = createLanguageServicePlugin(
return createResponse(undefined);
});
session.addProtocolHandler('_vue:resolveAutoImportCompletionEntry', request => {
const [data, preferences, formatOptions]: Parameters<Requests['resolveAutoImportCompletionEntry']> =
request.arguments;
const [data]: Parameters<Requests['resolveAutoImportCompletionEntry']> = request.arguments;
if (!(data as any).__getAutoImportSuggestions) {
return createResponse(undefined);
}
Expand All @@ -226,9 +229,9 @@ export = createLanguageServicePlugin(
fileName,
position,
entryName,
formatOptions,
session['getFormatOptions'](fileName),
source,
preferences,
session['getPreferences'](fileName),
data,
);
if (details) {
Expand Down
4 changes: 0 additions & 4 deletions packages/typescript-plugin/lib/requests/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,8 @@ export interface Requests {
getAutoImportSuggestions(
fileName: string,
position: number,
preferences: ts.UserPreferences,
formatOptions: ts.FormatCodeSettings,
): Response<ts.CompletionInfo>;
resolveAutoImportCompletionEntry(
data: ts.CompletionEntryData,
preferences: ts.UserPreferences,
formatOptions: ts.FormatCodeSettings,
): Response<ts.CompletionEntryDetails>;
}