Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit b60c543

Browse files
authored
Convert to custom Suggestion type & filter text with filterText key (#262)
* Convert to custom autocomplete Suggestion type * Filter and sort text using `filterText` property when there is a prefix
1 parent 319b95a commit b60c543

File tree

4 files changed

+521
-472
lines changed

4 files changed

+521
-472
lines changed

lib/adapters/autocomplete-adapter.ts

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ import {
2020
TextEditor,
2121
} from 'atom';
2222
import * as ac from 'atom/autocomplete-plus';
23+
import { Suggestion, TextSuggestion, SnippetSuggestion } from 'atom-ide';
2324

2425
interface SuggestionCacheEntry {
2526
isIncomplete: boolean;
2627
triggerPoint: Point;
2728
triggerChar: string;
28-
suggestionMap: Map<ac.AnySuggestion, PossiblyResolvedCompletionItem>;
29+
suggestionMap: Map<Suggestion, PossiblyResolvedCompletionItem>;
2930
}
3031

3132
type CompletionItemAdjuster =
@@ -93,7 +94,7 @@ export default class AutocompleteAdapter {
9394
}
9495

9596
const filtered = !(request.prefix === "" || (triggerChar !== '' && triggerOnly));
96-
return filtered ? filter(suggestions, request.prefix, { key: 'text' }) : suggestions;
97+
return filtered ? filter(suggestions, request.prefix, { key: 'filterText' }) : suggestions;
9798
}
9899

99100
private shouldTrigger(
@@ -113,7 +114,7 @@ export default class AutocompleteAdapter {
113114
triggerChar: string,
114115
triggerOnly: boolean,
115116
onDidConvertCompletionItem?: CompletionItemAdjuster,
116-
): Promise<ac.AnySuggestion[]> {
117+
): Promise<Suggestion[]> {
117118
const cache = this._suggestionCache.get(server);
118119

119120
const triggerColumn = (triggerChar !== '' && triggerOnly)
@@ -134,7 +135,7 @@ export default class AutocompleteAdapter {
134135
);
135136

136137
// Setup the cache for subsequent filtered results
137-
const isComplete = completions == null || Array.isArray(completions) || completions.isIncomplete === false;
138+
const isComplete = completions === null || Array.isArray(completions) || completions.isIncomplete === false;
138139
const suggestionMap = this.completionItemsToSuggestions(completions, request, onDidConvertCompletionItem);
139140
this._suggestionCache.set(server, { isIncomplete: !isComplete, triggerChar, triggerPoint, suggestionMap });
140141

@@ -281,13 +282,16 @@ export default class AutocompleteAdapter {
281282
completionItems: CompletionItem[] | CompletionList | null,
282283
request: ac.SuggestionsRequestedEvent,
283284
onDidConvertCompletionItem?: CompletionItemAdjuster,
284-
): Map<ac.AnySuggestion, PossiblyResolvedCompletionItem> {
285-
return new Map((Array.isArray(completionItems) ? completionItems : (completionItems && completionItems.items || []))
285+
): Map<Suggestion, PossiblyResolvedCompletionItem> {
286+
const completionsArray = Array.isArray(completionItems)
287+
? completionItems
288+
: (completionItems && completionItems.items) || [];
289+
return new Map(completionsArray
286290
.sort((a, b) => (a.sortText || a.label).localeCompare(b.sortText || b.label))
287-
.map<[ac.AnySuggestion, PossiblyResolvedCompletionItem]>(
291+
.map<[Suggestion, PossiblyResolvedCompletionItem]>(
288292
(s) => [
289293
AutocompleteAdapter.completionItemToSuggestion(
290-
s, {} as ac.AnySuggestion, request, onDidConvertCompletionItem),
294+
s, {} as Suggestion, request, onDidConvertCompletionItem),
291295
new PossiblyResolvedCompletionItem(s, false)]));
292296
}
293297

@@ -302,15 +306,15 @@ export default class AutocompleteAdapter {
302306
// Returns the {atom$AutocompleteSuggestion} passed in as suggestion with the conversion applied.
303307
public static completionItemToSuggestion(
304308
item: CompletionItem,
305-
suggestion: ac.AnySuggestion,
309+
suggestion: Suggestion,
306310
request: ac.SuggestionsRequestedEvent,
307311
onDidConvertCompletionItem?: CompletionItemAdjuster,
308-
): ac.AnySuggestion {
309-
AutocompleteAdapter.applyCompletionItemToSuggestion(item, suggestion as ac.TextSuggestion);
310-
AutocompleteAdapter.applyTextEditToSuggestion(item.textEdit, request.editor, suggestion as ac.TextSuggestion);
311-
AutocompleteAdapter.applySnippetToSuggestion(item, suggestion as ac.SnippetSuggestion);
312+
): Suggestion {
313+
AutocompleteAdapter.applyCompletionItemToSuggestion(item, suggestion as TextSuggestion);
314+
AutocompleteAdapter.applyTextEditToSuggestion(item.textEdit, request.editor, suggestion as TextSuggestion);
315+
AutocompleteAdapter.applySnippetToSuggestion(item, suggestion as SnippetSuggestion);
312316
if (onDidConvertCompletionItem != null) {
313-
onDidConvertCompletionItem(item, suggestion, request);
317+
onDidConvertCompletionItem(item, suggestion as ac.AnySuggestion, request);
314318
}
315319

316320
return suggestion;
@@ -319,14 +323,15 @@ export default class AutocompleteAdapter {
319323
// Public: Convert the primary parts of a language server protocol CompletionItem to an AutoComplete+ suggestion.
320324
//
321325
// * `item` An {CompletionItem} containing the completion items to be merged into.
322-
// * `suggestion` The {atom$AutocompleteSuggestion} to merge the conversion into.
326+
// * `suggestion` The {Suggestion} to merge the conversion into.
323327
//
324-
// Returns an {atom$AutocompleteSuggestion} created from the {CompletionItem}.
328+
// Returns the {Suggestion} with details added from the {CompletionItem}.
325329
public static applyCompletionItemToSuggestion(
326330
item: CompletionItem,
327-
suggestion: ac.TextSuggestion,
331+
suggestion: TextSuggestion,
328332
) {
329333
suggestion.text = item.insertText || item.label;
334+
suggestion.filterText = item.filterText || item.label;
330335
suggestion.displayText = item.label;
331336
suggestion.type = AutocompleteAdapter.completionKindToSuggestionType(item.kind);
332337
suggestion.rightLabel = item.detail;
@@ -356,7 +361,7 @@ export default class AutocompleteAdapter {
356361
public static applyTextEditToSuggestion(
357362
textEdit: TextEdit | undefined,
358363
editor: TextEditor,
359-
suggestion: ac.TextSuggestion,
364+
suggestion: TextSuggestion,
360365
): void {
361366
if (textEdit) {
362367
suggestion.replacementPrefix = editor.getTextInBufferRange(Convert.lsRangeToAtomRange(textEdit.range));
@@ -370,7 +375,7 @@ export default class AutocompleteAdapter {
370375
// * `item` An {CompletionItem} containing the completion items to be merged into.
371376
// * `suggestion` The {atom$AutocompleteSuggestion} to merge the conversion into.
372377
//
373-
public static applySnippetToSuggestion(item: CompletionItem, suggestion: ac.SnippetSuggestion): void {
378+
public static applySnippetToSuggestion(item: CompletionItem, suggestion: SnippetSuggestion): void {
374379
if (item.insertTextFormat === InsertTextFormat.Snippet) {
375380
suggestion.snippet = item.textEdit != null ? item.textEdit.newText : (item.insertText || '');
376381
}

0 commit comments

Comments
 (0)