diff --git a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts index 827b9e8a8..f13c0d96f 100644 --- a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts +++ b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts @@ -79,7 +79,10 @@ export class TypeScriptPlugin this.configManager = configManager; this.lsAndTsDocResolver = new LSAndTSDocResolver(docManager, workspacePath); this.completionProvider = new CompletionsProviderImpl(this.lsAndTsDocResolver); - this.codeActionsProvider = new CodeActionsProviderImpl(this.lsAndTsDocResolver); + this.codeActionsProvider = new CodeActionsProviderImpl( + this.lsAndTsDocResolver, + this.completionProvider, + ); this.updateImportsProvider = new UpdateImportsProviderImpl(this.lsAndTsDocResolver); this.diagnosticsProvider = new DiagnosticsProviderImpl(this.lsAndTsDocResolver); this.renameProvider = new RenameProviderImpl(this.lsAndTsDocResolver); @@ -108,9 +111,10 @@ export class TypeScriptPlugin return null; } const declaration = ts.displayPartsToString(info.displayParts); - const documentation = typeof info.documentation === 'string' - ? info.documentation - : ts.displayPartsToString(info.documentation); + const documentation = + typeof info.documentation === 'string' + ? info.documentation + : ts.displayPartsToString(info.documentation); // https://microsoft.github.io/language-server-protocol/specification#textDocument_hover const contents = ['```typescript', declaration, '```'] diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index 42a8897e0..815ea1c86 100644 --- a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts @@ -11,11 +11,12 @@ import { import { Document, mapRangeToOriginal, isRangeInTag } from '../../../lib/documents'; import { pathToUrl } from '../../../utils'; import { CodeActionsProvider } from '../../interfaces'; -import { SnapshotFragment } from '../DocumentSnapshot'; +import { SnapshotFragment, SvelteSnapshotFragment } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertRange } from '../utils'; import { flatten } from '../../../utils'; import ts from 'typescript'; +import { CompletionsProviderImpl } from './CompletionProvider'; interface RefactorArgs { type: 'refactor'; @@ -25,7 +26,10 @@ interface RefactorArgs { } export class CodeActionsProviderImpl implements CodeActionsProvider { - constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} + constructor( + private readonly lsAndTsDocResolver: LSAndTSDocResolver, + private readonly completionProvider: CompletionsProviderImpl, + ) {} async getCodeActions( document: Document, @@ -122,6 +126,17 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { null, ), change.textChanges.map((edit) => { + if ( + fix.fixName === 'import' && + doc instanceof SvelteSnapshotFragment + ) { + return this.completionProvider.codeActionChangeToTextEdit( + document, + doc, + edit, + true, + ); + } return TextEdit.replace( mapRangeToOriginal(doc!, convertRange(doc!, edit.span)), edit.newText, diff --git a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts index 22414fc04..8a3c7b8e2 100644 --- a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts @@ -210,12 +210,9 @@ export class CompletionsProviderImpl implements CompletionsProvider { (textDocument) => new Document(textDocument.uri, textDocument.text), ); const lsAndTsDocResolver = new LSAndTSDocResolver(docManager, testDir); - const provider = new CodeActionsProviderImpl(lsAndTsDocResolver); + const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver); + const provider = new CodeActionsProviderImpl(lsAndTsDocResolver, completionProvider); const filePath = getFullPath(filename); const document = docManager.openDocument({ uri: pathToUrl(filePath),