From aa6fddaa34a48fc8647e331f5a479befc38a93b5 Mon Sep 17 00:00:00 2001 From: Mohammad Amin Chitgarha Date: Fri, 22 Jul 2022 01:26:10 +0430 Subject: [PATCH] Use textEdit of completionItem unconditionally The server's CompletionItem.textEdit should always be respected, because in recent versions of the LSP, it is the server who should tell what to replace and what not. Before this change, a trigger character was always ignored, whether the server requested to replace it or not. This could be problematic in some cases. For instance, in PHP, you have a dollar sign beforeevery variable. If the server request to replace say `$th` with `$this` using a TextEdit interface, the client translates this to replacing `th` with `$this`, which results in a wrong `$$this` result. --- lib/adapters/autocomplete-adapter.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/adapters/autocomplete-adapter.ts b/lib/adapters/autocomplete-adapter.ts index 4ec9131b..2518159a 100644 --- a/lib/adapters/autocomplete-adapter.ts +++ b/lib/adapters/autocomplete-adapter.ts @@ -191,15 +191,12 @@ export default class AutocompleteAdapter { ) ) - // spec guarantees all edits are on the same line, so we only need to check the columns - const triggerColumns: [number, number] = [triggerPoint.column, request.bufferPosition.column] - // Setup the cache for subsequent filtered results const isComplete = completions === null || Array.isArray(completions) || !completions.isIncomplete const suggestionMap = this.completionItemsToSuggestions( completions, request, - triggerColumns, + [], shouldReplace, onDidConvertCompletionItem ) @@ -357,6 +354,7 @@ export default class AutocompleteAdapter { * @param completionItems An {Array} of {CompletionItem} objects or a {CompletionList} containing completion items to * be converted. * @param request The {atom$AutocompleteRequest} to satisfy. + * @param triggerColumns Deprecated, and have no effect. * @param shouldReplace The behavior of suggestion acceptance (see {ShouldReplace}). * @param onDidConvertCompletionItem A function that takes a {CompletionItem}, an {atom$AutocompleteSuggestion} and a * {atom$AutocompleteRequest} allowing you to adjust converted items. @@ -365,7 +363,7 @@ export default class AutocompleteAdapter { public completionItemsToSuggestions( completionItems: CompletionItem[] | CompletionList | null, request: ac.SuggestionsRequestedEvent, - triggerColumns: [number, number], + triggerColumns: number[], shouldReplace: ShouldReplace, onDidConvertCompletionItem?: CompletionItemAdjuster ): Map { @@ -395,6 +393,7 @@ export default class AutocompleteAdapter { * @param item An {CompletionItem} containing a completion item to be converted. * @param suggestion A {atom$AutocompleteSuggestion} to have the conversion applied to. * @param request The {atom$AutocompleteRequest} to satisfy. + * @param triggerColumns Deprecated, and have no effect. * @param shouldReplace The behavior of suggestion acceptance (see {ShouldReplace}). * @param onDidConvertCompletionItem A function that takes a {CompletionItem}, an {atom$AutocompleteSuggestion} and a * {atom$AutocompleteRequest} allowing you to adjust converted items. @@ -404,7 +403,7 @@ export default class AutocompleteAdapter { item: CompletionItem, suggestion: Suggestion, request: ac.SuggestionsRequestedEvent, - triggerColumns: [number, number], + triggerColumns: number[], shouldReplace: ShouldReplace, onDidConvertCompletionItem?: CompletionItemAdjuster ): Suggestion { @@ -466,13 +465,14 @@ export default class AutocompleteAdapter { * * @param textEdit A {TextEdit} from a CompletionItem to apply. * @param editor An Atom {TextEditor} used to obtain the necessary text replacement. + * @param triggerColumns Deprecated, and have no effect. * @param suggestion An {atom$AutocompleteSuggestion} to set the replacementPrefix and text properties of. * @param shouldReplace The behavior of suggestion acceptance (see {ShouldReplace}). */ public static applyTextEditToSuggestion( textEdit: TextEdit | InsertReplaceEdit | undefined, editor: TextEditor, - triggerColumns: [number, number], + triggerColumns: number[], originalBufferPosition: Point, suggestion: TextSuggestion, shouldReplace: ShouldReplace @@ -489,10 +489,9 @@ export default class AutocompleteAdapter { range = textEdit.insert } - if (range.start.character !== triggerColumns[0]) { - const atomRange = Convert.lsRangeToAtomRange(range) - suggestion.customReplacmentPrefix = editor.getTextInBufferRange([atomRange.start, originalBufferPosition]) - } + const atomRange = Convert.lsRangeToAtomRange(range) + suggestion.customReplacmentPrefix = editor.getTextInBufferRange([atomRange.start, originalBufferPosition]) + suggestion.text = textEdit.newText }