Skip to content

Commit 86f629b

Browse files
committed
fix(typescript-plugin): prefer non-warning completion entry
1 parent 4fbd087 commit 86f629b

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TextDocument } from '@volar/language-server';
2+
import * as path from 'node:path';
23
import { afterEach, expect, test } from 'vitest';
34
import { URI } from 'vscode-uri';
45
import { getLanguageServer, testWorkspacePath } from './server.js';
@@ -867,6 +868,35 @@ test('Auto insert defines', async () => {
867868
`);
868869
});
869870
871+
test('#5847', async () => {
872+
await prepareDocument(
873+
'tsconfigProject/fixture.ts',
874+
'typescript',
875+
`export function testFn() { console.log('testFn'); }`,
876+
);
877+
expect(
878+
await requestCompletionItemToTsServer(
879+
'tsconfigProject/fixture.vue',
880+
'vue',
881+
`
882+
<script setup></script>
883+
884+
<template>{{ testFn| }}</template>
885+
`,
886+
'testFn',
887+
),
888+
).toMatchInlineSnapshot(`
889+
{
890+
"hasAction": true,
891+
"kind": "function",
892+
"kindModifiers": "export",
893+
"name": "testFn",
894+
"sortText": "16",
895+
"source": "tsconfigProject/fixture",
896+
}
897+
`);
898+
});
899+
870900
const openedDocuments: TextDocument[] = [];
871901
872902
afterEach(async () => {
@@ -918,6 +948,8 @@ async function requestCompletionItemToTsServer(
918948
const completions = await requestCompletionListToTsServer(fileName, languageId, content);
919949
let completion = completions.find((item: any) => item.name === itemLabel);
920950
expect(completion).toBeDefined();
951+
delete completion.data;
952+
completion.source &&= path.relative(testWorkspacePath, completion.source);
921953
return completion!;
922954
}
923955

packages/typescript-plugin/lib/common.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export function preprocessLanguageService(
9696
languageService.getCompletionsAtPosition = (fileName, position, preferences, formatOptions) => {
9797
let result = getCompletionsAtPosition(fileName, position, preferences, formatOptions);
9898
const language = getLanguage();
99-
if (language) {
99+
if (language && result) {
100100
const [serviceScript, targetScript, sourceScript] = getServiceScript(language, fileName);
101101
if (serviceScript && sourceScript?.generated?.root instanceof VueVirtualCode) {
102102
for (
@@ -118,10 +118,20 @@ export function preprocessLanguageService(
118118
if (generatedOffset2 !== undefined) {
119119
const completion2 = getCompletionsAtPosition(targetScript.id, generatedOffset2, preferences, formatOptions);
120120
if (completion2) {
121-
const existingNames = new Set(result?.entries.map(entry => entry.name));
121+
const nameToIndex = new Map(result.entries.map((entry, index) => [entry.name, index]));
122122
for (const entry of completion2.entries) {
123-
if (!existingNames.has(entry.name)) {
124-
result?.entries.push(entry);
123+
if (entry.kind === 'warning') {
124+
continue;
125+
}
126+
if (nameToIndex.has(entry.name)) {
127+
const index = nameToIndex.get(entry.name)!;
128+
const existingEntry = result.entries[index]!;
129+
if (existingEntry.kind === 'warning') {
130+
result.entries[index] = entry;
131+
}
132+
}
133+
else {
134+
result.entries.push(entry);
125135
}
126136
}
127137
}

0 commit comments

Comments
 (0)