diff --git a/packages/language-server/tests/completions.spec.ts b/packages/language-server/tests/completions.spec.ts index c941097804..78a7c61e34 100644 --- a/packages/language-server/tests/completions.spec.ts +++ b/packages/language-server/tests/completions.spec.ts @@ -1,5 +1,6 @@ import type { TextDocument } from '@volar/language-server'; import * as path from 'node:path'; +import type * as ts from 'typescript'; import { afterEach, expect, test } from 'vitest'; import { URI } from 'vscode-uri'; import { getLanguageServer, testWorkspacePath } from './server.js'; @@ -621,10 +622,17 @@ test('Directives', async () => { await requestCompletionItemToVueServer('fixture.vue', 'vue', ``, 'v-pre'); }); -// FIXME: -test.skip('Directive Modifiers', async () => { +test('Directive Modifiers', async () => { expect( (await requestCompletionListToVueServer( + 'fixture.vue', + 'vue', + ``, + )).items.filter(item => item.label === 'camel').length, + ).toBe(1); + + expect( + (await requestCompletionListToTsServer( 'fixture.vue', 'vue', ` @@ -633,16 +641,14 @@ test.skip('Directive Modifiers', async () => { `, - )).items.map(item => item.label), + )).map(item => item.name), ).toMatchInlineSnapshot(` [ "attr", - "prop" + "prop", ] `); }); @@ -1059,8 +1065,8 @@ async function requestCompletionItemToTsServer( const completions = await requestCompletionListToTsServer(fileName, languageId, content); let completion = completions.find((item: any) => item.name === itemLabel); expect(completion).toBeDefined(); - delete completion.data; - completion.source &&= path.relative(testWorkspacePath, completion.source).replace(/\\/g, '/'); + delete completion!.data; + completion!.source &&= path.relative(testWorkspacePath, completion!.source).replace(/\\/g, '/'); return completion!; } @@ -1082,7 +1088,7 @@ async function requestCompletionListToTsServer(fileName: string, languageId: str }); expect(res.success).toBe(true); - return res.body; + return res.body as ts.CompletionEntry[]; } async function prepareDocument(fileName: string, languageId: string, content: string) { diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index 2999d65665..7153e38bbd 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -272,6 +272,10 @@ export function create( htmlCompletion.isIncomplete = true; } + if (htmlCompletion.items[0]?.kind === 12 satisfies typeof CompletionItemKind.Value) { + addDirectiveModifiers(htmlCompletion, htmlCompletion.items[0], document); + } + await resolveAutoImportPlaceholder(htmlCompletion, info); resolveComponentItemKinds(htmlCompletion); @@ -336,8 +340,6 @@ export function create( } break; case 12 satisfies typeof CompletionItemKind.Value: - addDirectiveModifiers(htmlCompletion, item, document); - if ( typeof item.documentation === 'object' && item.documentation.value.includes('*@deprecated*') ) {