diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index 2aa6f3771..9eb90ab20 100644 --- a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts @@ -1,3 +1,4 @@ +import ts from 'typescript'; import { CodeAction, CodeActionContext, @@ -10,18 +11,15 @@ import { } from 'vscode-languageserver'; import { Document, - mapRangeToOriginal, + getLineAtPosition, isRangeInTag, - isInTag, - getLineAtPosition + mapRangeToOriginal } from '../../../lib/documents'; -import { pathToUrl, flatten, isNotNullOrUndefined, modifyLines, getIndent } from '../../../utils'; +import { flatten, getIndent, isNotNullOrUndefined, modifyLines, pathToUrl } from '../../../utils'; import { CodeActionsProvider } from '../../interfaces'; import { SnapshotFragment, SvelteSnapshotFragment } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertRange } from '../utils'; - -import ts from 'typescript'; import { CompletionsProviderImpl } from './CompletionProvider'; import { isNoTextSpanInGeneratedCode, SnapshotFragmentMap } from './utils'; @@ -189,8 +187,7 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { fragment, edit, true, - isInTag(range.start, document.scriptInfo) || - isInTag(range.start, document.moduleScriptInfo) + range.start ); } diff --git a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts index fb96067a7..a84bfa8b0 100644 --- a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts @@ -317,8 +317,7 @@ export class CompletionsProviderImpl implements CompletionsProvider this.codeActionChangeToTextEdit( @@ -363,7 +362,7 @@ export class CompletionsProviderImpl implements CompletionsProvider { return pathToUrl(join(testFilesDir, file)); }; -describe('CompletionProviderImpl', () => { +describe.only('CompletionProviderImpl', () => { function setup(filename: string) { const docManager = new DocumentManager( (textDocument) => new Document(textDocument.uri, textDocument.text) @@ -524,6 +524,54 @@ describe('CompletionProviderImpl', () => { ); }); + it('resolve auto import completion in instance script (instance and module script present)', async () => { + const { completionProvider, document } = setup('importcompletions9.svelte'); + + const completions = await completionProvider.getCompletions( + document, + Position.create(5, 7) + ); + document.version++; + + const item = completions?.items.find((item) => item.label === 'onMount'); + const { additionalTextEdits } = await completionProvider.resolveCompletion(document, item!); + + assert.strictEqual( + harmonizeNewLines(additionalTextEdits![0]?.newText), + // " instead of ' because VSCode uses " by default when there are no other imports indicating otherwise + `${newLine}import { onMount } from "svelte";${newLine}${newLine}` + ); + + assert.deepEqual( + additionalTextEdits![0]?.range, + Range.create(Position.create(4, 8), Position.create(4, 8)) + ); + }); + + it('resolve auto import completion in module script (instance and module script present)', async () => { + const { completionProvider, document } = setup('importcompletions9.svelte'); + + const completions = await completionProvider.getCompletions( + document, + Position.create(1, 7) + ); + document.version++; + + const item = completions?.items.find((item) => item.label === 'onMount'); + const { additionalTextEdits } = await completionProvider.resolveCompletion(document, item!); + + assert.strictEqual( + harmonizeNewLines(additionalTextEdits![0]?.newText), + // " instead of ' because VSCode uses " by default when there are no other imports indicating otherwise + `${newLine}import { onMount } from "svelte";${newLine}${newLine}` + ); + + assert.deepEqual( + additionalTextEdits![0]?.range, + Range.create(Position.create(0, 25), Position.create(0, 25)) + ); + }); + async function openFileToBeImported( docManager: DocumentManager, completionProvider: CompletionsProviderImpl, @@ -656,7 +704,7 @@ describe('CompletionProviderImpl', () => { }); it('resolve auto completion in correct place when already imported in module script', async () => { - const { completionProvider, document } = setup('importCompletion8.svelte'); + const { completionProvider, document } = setup('importcompletions8.svelte'); const completions = await completionProvider.getCompletions( document, diff --git a/packages/language-server/test/plugins/typescript/testfiles/completions/importCompletion8.svelte b/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions8.svelte similarity index 100% rename from packages/language-server/test/plugins/typescript/testfiles/completions/importCompletion8.svelte rename to packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions8.svelte diff --git a/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions9.svelte b/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions9.svelte new file mode 100644 index 000000000..7c7d536de --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/completions/importcompletions9.svelte @@ -0,0 +1,7 @@ + + +