From 734192414dda579e20fa67489b4e09753966a42a Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 20 Aug 2020 19:16:24 +0200 Subject: [PATCH 1/4] (fix) filter out component import if already one present #462 Drawback: Also will mark commented out imports as already imported - but this seems like a bigger edge case than having double imports when doing barrel exports --- .../typescript/features/CompletionProvider.ts | 32 +++++++++++++++++-- packages/language-server/src/utils.ts | 12 +++++++ 2 files changed, 42 insertions(+), 2 deletions(-) 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 Date: Thu, 20 Aug 2020 19:30:35 +0200 Subject: [PATCH 2/4] lint --- packages/language-server/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/language-server/src/utils.ts b/packages/language-server/src/utils.ts index 304770b2d..61239d863 100644 --- a/packages/language-server/src/utils.ts +++ b/packages/language-server/src/utils.ts @@ -100,7 +100,7 @@ export function regexLastIndexOf(text: string, regex: RegExp, endPos?: number) { * Get all matches of a regexp. */ export function getRegExpMatches(regex: RegExp, str: string) { - let matches: RegExpExecArray[] = []; + const matches: RegExpExecArray[] = []; let match: RegExpExecArray | null; while ((match = regex.exec(str))) { matches.push(match); From 959bca56d2289f3c07dcc71c7d23cede5e3cf600 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 21 Aug 2020 11:54:24 +0200 Subject: [PATCH 3/4] test --- .../features/CompletionProvider.test.ts | 26 +++++++++++++++++++ .../importcompletions-2nd-import.svelte | 4 +++ .../testfiles/completions/to-import.ts | 1 + 3 files changed, 31 insertions(+) create mode 100644 packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions-2nd-import.svelte create mode 100644 packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts diff --git a/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts b/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts index 7a3949414..d9f6d09b2 100644 --- a/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts @@ -458,6 +458,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); + + const completions = await completionProvider.getCompletions( + document, + Position.create(2, 13), + ); + document.version++; + + const items = completions?.items.filter((item) => item.label === 'ImportedFile'); + 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..8c43eb094 --- /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..20fbc80ac --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts @@ -0,0 +1 @@ +export class ImportedFile {} From 499fafa8ae348e3ac4bef96fb9c8795053f06802 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 21 Aug 2020 12:05:54 +0200 Subject: [PATCH 4/4] fix tests --- .../plugins/typescript/features/CompletionProvider.test.ts | 7 ++++--- .../completions/importcompletions-2nd-import.svelte | 4 ++-- .../plugins/typescript/testfiles/completions/to-import.ts | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts b/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts index d9f6d09b2..0b204c343 100644 --- a/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/CompletionProvider.test.ts @@ -358,8 +358,9 @@ describe('CompletionProviderImpl', () => { 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) || '', @@ -464,7 +465,7 @@ describe('CompletionProviderImpl', () => { 'importcompletions-2nd-import.svelte', ); // make sure that the ts language service does know about the imported-file file - await openFileToBeImported(docManager, completionProvider); + await openFileToBeImported(docManager, completionProvider, 'ScndImport.svelte'); const completions = await completionProvider.getCompletions( document, @@ -472,7 +473,7 @@ describe('CompletionProviderImpl', () => { ); document.version++; - const items = completions?.items.filter((item) => item.label === 'ImportedFile'); + const items = completions?.items.filter((item) => item.label === 'ScndImport'); assert.equal(items?.length, 1); const item = items?.[0]; 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 index 8c43eb094..5eff49b75 100644 --- 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 @@ -1,4 +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 index 20fbc80ac..4f39e0368 100644 --- a/packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts +++ b/packages/language-server/test/plugins/typescript/testfiles/completions/to-import.ts @@ -1 +1 @@ -export class ImportedFile {} +export class ScndImport {}