diff --git a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts index ef098faed..01d3cfc72 100644 --- a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts @@ -17,7 +17,7 @@ import { mapRangeToOriginal, getNodeIfIsInComponentStartTag, } from '../../../lib/documents'; -import { isNotNullOrUndefined, pathToUrl } from '../../../utils'; +import { isNotNullOrUndefined, pathToUrl, getRegExpMatches, flatten } from '../../../utils'; import { AppCompletionItem, AppCompletionList, CompletionsProvider } from '../../interfaces'; import { SvelteSnapshotFragment, SvelteDocumentSnapshot } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; @@ -102,9 +102,16 @@ export class CompletionsProviderImpl implements CompletionsProvider - this.toCompletionItem(fragment, comp, pathToUrl(tsDoc.filePath), position), + this.toCompletionItem( + fragment, + comp, + pathToUrl(tsDoc.filePath), + position, + existingImports, + ), ) .filter(isNotNullOrUndefined) .map((comp) => mapCompletionItemToOriginal(fragment, comp)) @@ -113,6 +120,14 @@ export class CompletionsProviderImpl implements CompletionsProvider + (match[1] ?? match[2]).split(','), + ); + const tidiedImports = flatten(rawImports).map((match) => match.trim()); + return new Set(tidiedImports); + } + private getEventCompletions( lang: ts.LanguageService, doc: Document, @@ -182,6 +197,7 @@ export class CompletionsProviderImpl implements CompletionsProvider, ): AppCompletionItem | null { const completionLabelAndInsert = this.getCompletionLabelAndInsert(fragment, comp); if (!completionLabelAndInsert) { @@ -189,6 +205,13 @@ export class CompletionsProviderImpl implements CompletionsProvider { async function openFileToBeImported( docManager: DocumentManager, completionProvider: CompletionsProviderImpl, + name = 'imported-file.svelte', ) { - const filePath = join(testFilesDir, 'imported-file.svelte'); + const filePath = join(testFilesDir, name); const hoverinfoDoc = docManager.openDocument({ uri: pathToUrl(filePath), text: ts.sys.readFile(filePath) || '', @@ -458,6 +459,32 @@ describe('CompletionProviderImpl', () => { assert.strictEqual(additionalTextEdits, undefined); }); + + it('doesnt suggest svelte auto import when already other import with same name present', async () => { + const { completionProvider, document, docManager } = setup( + 'importcompletions-2nd-import.svelte', + ); + // make sure that the ts language service does know about the imported-file file + await openFileToBeImported(docManager, completionProvider, 'ScndImport.svelte'); + + const completions = await completionProvider.getCompletions( + document, + Position.create(2, 13), + ); + document.version++; + + const items = completions?.items.filter((item) => item.label === 'ScndImport'); + assert.equal(items?.length, 1); + + const item = items?.[0]; + assert.equal(item?.additionalTextEdits, undefined); + assert.equal(item?.detail, undefined); + assert.equal(item?.kind, CompletionItemKind.Variable); + + const { additionalTextEdits } = await completionProvider.resolveCompletion(document, item!); + + assert.strictEqual(additionalTextEdits, undefined); + }); }); function harmonizeNewLines(input?: string) { diff --git a/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions-2nd-import.svelte b/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions-2nd-import.svelte new file mode 100644 index 000000000..5eff49b75 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions-2nd-import.svelte @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts b/packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts new file mode 100644 index 000000000..4f39e0368 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts @@ -0,0 +1 @@ +export class ScndImport {}