From fb96d05c520defb324cf8c0756ed7b577c1f3896 Mon Sep 17 00:00:00 2001 From: "Lyu, Wei Da" Date: Fri, 15 Apr 2022 09:16:52 +0800 Subject: [PATCH] (fix) don't remove next char in remove import code action --- .../features/CodeActionsProvider.ts | 24 ++++++---- .../features/CodeActionsProvider.test.ts | 46 +++++++++++++++++++ .../code-actions/remove-imports-inline.svelte | 1 + 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 packages/language-server/test/plugins/typescript/testfiles/code-actions/remove-imports-inline.svelte diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index 32326817c..b8f8fc447 100644 --- a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts @@ -162,14 +162,22 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { ) { edit.span.length -= 1; range = mapRangeToOriginal(fragment, convertRange(fragment, edit.span)); - range.end.character += 1; - if ( - fragment instanceof SvelteSnapshotFragment && - isAtEndOfLine( - getLineAtPosition(range.end, fragment.originalText), - range.end.character - ) - ) { + + if (!(fragment instanceof SvelteSnapshotFragment)) { + range.end.character += 1; + return range; + } + + const line = getLineAtPosition(range.end, fragment.originalText); + // remove-import code action will removes the + // line break generated by svelte2tsx, + // but when there's no line break in the source + // move back to next character would remove the next character + if ([';', '"', "'"].includes(line[range.end.character])) { + range.end.character += 1; + } + + if (isAtEndOfLine(line, range.end.character)) { range.end.line += 1; range.end.character = 0; } diff --git a/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts b/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts index c2cb1bb9c..0d82aca7c 100644 --- a/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts @@ -337,6 +337,52 @@ function test(useNewTransformation: boolean) { ]); }); + it('remove import inline with script tag', async () => { + const { provider, document } = setup('remove-imports-inline.svelte'); + + const codeActions = await provider.getCodeActions( + document, + Range.create(Position.create(0, 9), Position.create(0, 9)), + { + diagnostics: [ + { + code: 6133, + message: "'CodeActions' is declared but its value is never read", + range: Range.create(Position.create(0, 8), Position.create(0, 54)), + source: 'js' + } + ], + only: [CodeActionKind.QuickFix] + } + ); + + assert.deepStrictEqual(codeActions, [ + { + edit: { + documentChanges: [ + { + edits: [ + { + newText: '', + range: { + end: Position.create(0, 54), + start: Position.create(0, 8) + } + } + ], + textDocument: { + uri: getUri('remove-imports-inline.svelte'), + version: null + } + } + ] + }, + kind: 'quickfix', + title: "Remove import from './codeactions.svelte'" + } + ]); + }); + it('organizes imports', async () => { const { provider, document } = setup('codeactions.svelte'); diff --git a/packages/language-server/test/plugins/typescript/testfiles/code-actions/remove-imports-inline.svelte b/packages/language-server/test/plugins/typescript/testfiles/code-actions/remove-imports-inline.svelte new file mode 100644 index 000000000..a9c43880e --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/code-actions/remove-imports-inline.svelte @@ -0,0 +1 @@ + \ No newline at end of file