Skip to content

Commit 57cebfb

Browse files
authored
(refactor) simplify completion provider (#293)
Thanks to the work in #285, `svelte2tsx` now creates files with named default exports, which makes some code in the `CompletionProvider` obsolete.
1 parent a836754 commit 57cebfb

File tree

1 file changed

+7
-59
lines changed

1 file changed

+7
-59
lines changed

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

Lines changed: 7 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
mapCompletionItemToOriginal,
1515
mapRangeToOriginal,
1616
} from '../../../lib/documents';
17-
import { isNotNullOrUndefined, pathToUrl } from '../../../utils';
17+
import { pathToUrl } from '../../../utils';
1818
import { AppCompletionItem, AppCompletionList, CompletionsProvider } from '../../interfaces';
1919
import { SvelteSnapshotFragment } from '../DocumentSnapshot';
2020
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
@@ -92,27 +92,18 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
9292
}
9393

9494
const completionItems = completions.entries
95-
.map((comp) =>
96-
this.toCompletionItem(fragment, comp, pathToUrl(tsDoc.filePath), position),
97-
)
98-
.filter(isNotNullOrUndefined)
95+
.map((comp) => this.toCompletionItem(comp, pathToUrl(tsDoc.filePath), position))
9996
.map((comp) => mapCompletionItemToOriginal(fragment, comp));
10097

10198
return CompletionList.create(completionItems, !!tsDoc.parserError);
10299
}
103100

104101
private toCompletionItem(
105-
fragment: SvelteSnapshotFragment,
106102
comp: ts.CompletionEntry,
107103
uri: string,
108104
position: Position,
109-
): AppCompletionItem<CompletionEntryWithIdentifer> | null {
110-
const result = this.getCompletionLabelAndInsert(fragment, comp);
111-
if (!result) {
112-
return null;
113-
}
114-
115-
const { label, insertText, isSvelteComp } = result;
105+
): AppCompletionItem<CompletionEntryWithIdentifer> {
106+
const { label, insertText, isSvelteComp } = this.getCompletionLabelAndInsert(comp);
116107

117108
return {
118109
label,
@@ -131,22 +122,11 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
131122
};
132123
}
133124

134-
private getCompletionLabelAndInsert(
135-
fragment: SvelteSnapshotFragment,
136-
comp: ts.CompletionEntry,
137-
) {
138-
let { kind, kindModifiers, name, source } = comp;
125+
private getCompletionLabelAndInsert(comp: ts.CompletionEntry) {
126+
const { kind, kindModifiers, name, source } = comp;
139127
const isScriptElement = kind === ts.ScriptElementKind.scriptElement;
140128
const hasModifier = Boolean(comp.kindModifiers);
141-
142129
const isSvelteComp = this.isSvelteComponentImport(`import ${name} from ${source}`);
143-
if (isSvelteComp) {
144-
name = this.changeSvelteComponentName(name);
145-
146-
if (this.isExistingSvelteComponentImport(fragment, name, source)) {
147-
return null;
148-
}
149-
}
150130

151131
if (isScriptElement && hasModifier) {
152132
return {
@@ -155,28 +135,13 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
155135
isSvelteComp,
156136
};
157137
}
158-
if (isSvelteComp && kind === ts.ScriptElementKind.classElement) {
159-
return {
160-
insertText: name,
161-
label: name,
162-
isSvelteComp,
163-
};
164-
}
138+
165139
return {
166140
label: name,
167141
isSvelteComp,
168142
};
169143
}
170144

171-
private isExistingSvelteComponentImport(
172-
fragment: SvelteSnapshotFragment,
173-
name: string,
174-
source?: string,
175-
): boolean {
176-
const importStatement = new RegExp(`import ${name} from ["'\`][\\s\\S]+\\.svelte["'\`]`);
177-
return !!source && !!fragment.text.match(importStatement);
178-
}
179-
180145
async resolveCompletion(
181146
document: Document,
182147
completionItem: AppCompletionItem<CompletionEntryWithIdentifer>,
@@ -260,10 +225,6 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
260225
fragment: SvelteSnapshotFragment,
261226
change: ts.TextChange,
262227
): TextEdit {
263-
if (this.isSvelteComponentImport(change.newText)) {
264-
change.newText = this.changeSvelteComponentImportName(change.newText);
265-
}
266-
267228
const scriptTagInfo = fragment.scriptInfo;
268229
if (!scriptTagInfo) {
269230
// no script tag defined yet, add it.
@@ -299,19 +260,6 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
299260
private isSvelteComponentImport(text: string) {
300261
return /import \w+ from [\s\S]*.svelte($|"|'| )/.test(text);
301262
}
302-
303-
private changeSvelteComponentImportName(text: string) {
304-
return text.replace(
305-
/import (\w+) from /,
306-
(_, componentMatch) => `import ${this.changeSvelteComponentName(componentMatch)} from `,
307-
);
308-
}
309-
310-
private changeSvelteComponentName(name: string) {
311-
const newName = name.replace(/(\w+)Svelte$/, '$1');
312-
// make sure first letter is uppercase
313-
return newName[0].toUpperCase() + newName.substr(1);
314-
}
315263
}
316264

317265
const beginOfDocumentRange = Range.create(Position.create(0, 0), Position.create(0, 0));

0 commit comments

Comments
 (0)