Skip to content

Commit fe1e31f

Browse files
authored
(fix) use completion-logic for import-code-action (#369)
#343
1 parent 54b328b commit fe1e31f

File tree

4 files changed

+35
-21
lines changed

4 files changed

+35
-21
lines changed

packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ export class TypeScriptPlugin
7979
this.configManager = configManager;
8080
this.lsAndTsDocResolver = new LSAndTSDocResolver(docManager, workspacePath);
8181
this.completionProvider = new CompletionsProviderImpl(this.lsAndTsDocResolver);
82-
this.codeActionsProvider = new CodeActionsProviderImpl(this.lsAndTsDocResolver);
82+
this.codeActionsProvider = new CodeActionsProviderImpl(
83+
this.lsAndTsDocResolver,
84+
this.completionProvider,
85+
);
8386
this.updateImportsProvider = new UpdateImportsProviderImpl(this.lsAndTsDocResolver);
8487
this.diagnosticsProvider = new DiagnosticsProviderImpl(this.lsAndTsDocResolver);
8588
this.renameProvider = new RenameProviderImpl(this.lsAndTsDocResolver);
@@ -108,9 +111,10 @@ export class TypeScriptPlugin
108111
return null;
109112
}
110113
const declaration = ts.displayPartsToString(info.displayParts);
111-
const documentation = typeof info.documentation === 'string'
112-
? info.documentation
113-
: ts.displayPartsToString(info.documentation);
114+
const documentation =
115+
typeof info.documentation === 'string'
116+
? info.documentation
117+
: ts.displayPartsToString(info.documentation);
114118

115119
// https://microsoft.github.io/language-server-protocol/specification#textDocument_hover
116120
const contents = ['```typescript', declaration, '```']

packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import {
1111
import { Document, mapRangeToOriginal, isRangeInTag } from '../../../lib/documents';
1212
import { pathToUrl } from '../../../utils';
1313
import { CodeActionsProvider } from '../../interfaces';
14-
import { SnapshotFragment } from '../DocumentSnapshot';
14+
import { SnapshotFragment, SvelteSnapshotFragment } from '../DocumentSnapshot';
1515
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
1616
import { convertRange } from '../utils';
1717
import { flatten } from '../../../utils';
1818
import ts from 'typescript';
19+
import { CompletionsProviderImpl } from './CompletionProvider';
1920

2021
interface RefactorArgs {
2122
type: 'refactor';
@@ -25,7 +26,10 @@ interface RefactorArgs {
2526
}
2627

2728
export class CodeActionsProviderImpl implements CodeActionsProvider {
28-
constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {}
29+
constructor(
30+
private readonly lsAndTsDocResolver: LSAndTSDocResolver,
31+
private readonly completionProvider: CompletionsProviderImpl,
32+
) {}
2933

3034
async getCodeActions(
3135
document: Document,
@@ -122,6 +126,17 @@ export class CodeActionsProviderImpl implements CodeActionsProvider {
122126
null,
123127
),
124128
change.textChanges.map((edit) => {
129+
if (
130+
fix.fixName === 'import' &&
131+
doc instanceof SvelteSnapshotFragment
132+
) {
133+
return this.completionProvider.codeActionChangeToTextEdit(
134+
document,
135+
doc,
136+
edit,
137+
true,
138+
);
139+
}
125140
return TextEdit.replace(
126141
mapRangeToOriginal(doc!, convertRange(doc!, edit.span)),
127142
edit.newText,

packages/language-server/src/plugins/typescript/features/CompletionProvider.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,9 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
210210

211211
for (const action of actions) {
212212
for (const change of action.changes) {
213-
edit.push(...this.codeActionChangesToTextEdit(
214-
document,
215-
fragment,
216-
change,
217-
isImport
218-
));
213+
edit.push(
214+
...this.codeActionChangesToTextEdit(document, fragment, change, isImport),
215+
);
219216
}
220217
}
221218

@@ -255,7 +252,7 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
255252
);
256253
}
257254

258-
private codeActionChangeToTextEdit(
255+
codeActionChangeToTextEdit(
259256
doc: Document,
260257
fragment: SvelteSnapshotFragment,
261258
change: ts.TextChange,
@@ -308,20 +305,16 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
308305
return TextEdit.replace(range, change.newText);
309306
}
310307

311-
private mapRangeForNewImport(
312-
fragment: SvelteSnapshotFragment,
313-
virtualRange: Range
314-
) {
308+
private mapRangeForNewImport(fragment: SvelteSnapshotFragment, virtualRange: Range) {
315309
const sourceMapableRange = this.offsetLinesAndMovetoStartOfLine(virtualRange, -1);
316-
const mappableRange = mapRangeToOriginal(
317-
fragment, sourceMapableRange);
310+
const mappableRange = mapRangeToOriginal(fragment, sourceMapableRange);
318311
return this.offsetLinesAndMovetoStartOfLine(mappableRange, 1);
319312
}
320313

321314
private offsetLinesAndMovetoStartOfLine({ start, end }: Range, offsetLines: number) {
322315
return Range.create(
323316
Position.create(start.line + offsetLines, 0),
324-
Position.create(end.line + offsetLines, 0)
317+
Position.create(end.line + offsetLines, 0),
325318
);
326319
}
327320

packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import ts from 'typescript';
66
import * as path from 'path';
77
import * as assert from 'assert';
88
import { Range, Position, CodeActionKind, TextDocumentEdit } from 'vscode-languageserver';
9+
import { CompletionsProviderImpl } from '../../../../src/plugins/typescript/features/CompletionProvider';
910

1011
const testDir = path.join(__dirname, '..');
1112

@@ -27,7 +28,8 @@ describe('CodeActionsProvider', () => {
2728
(textDocument) => new Document(textDocument.uri, textDocument.text),
2829
);
2930
const lsAndTsDocResolver = new LSAndTSDocResolver(docManager, testDir);
30-
const provider = new CodeActionsProviderImpl(lsAndTsDocResolver);
31+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver);
32+
const provider = new CodeActionsProviderImpl(lsAndTsDocResolver, completionProvider);
3133
const filePath = getFullPath(filename);
3234
const document = docManager.openDocument(<any>{
3335
uri: pathToUrl(filePath),

0 commit comments

Comments
 (0)