diff --git a/lib/adapters/autocomplete-adapter.ts b/lib/adapters/autocomplete-adapter.ts index a8b5e98b..2dcf6865 100644 --- a/lib/adapters/autocomplete-adapter.ts +++ b/lib/adapters/autocomplete-adapter.ts @@ -379,6 +379,8 @@ export default class AutocompleteAdapter { onDidConvertCompletionItem(item, suggestion as ac.AnySuggestion, request); } + suggestion.completionItem = item; + return suggestion; } diff --git a/lib/auto-languageclient.ts b/lib/auto-languageclient.ts index 273e7e02..598d73e7 100644 --- a/lib/auto-languageclient.ts +++ b/lib/auto-languageclient.ts @@ -471,7 +471,10 @@ export default class AutoLanguageClient { suggestionPriority: 2, excludeLowerPriority: false, getSuggestions: this.getSuggestions.bind(this), - onDidInsertSuggestion: this.onDidInsertSuggestion.bind(this), + onDidInsertSuggestion: (event) => { + this.handleAdditionalTextEdits(event); + this.onDidInsertSuggestion(event); + }, getSuggestionDetailsOnSelect: this.getSuggestionDetailsOnSelect.bind(this), }; } @@ -510,6 +513,16 @@ export default class AutoLanguageClient { ): void { } + // Handle additional stuff after a suggestion insert, e.g. `additionalTextEdits`. + private handleAdditionalTextEdits(e: ac.SuggestionInsertedEvent): void { + const suggestion = e.suggestion as atomIde.SuggestionBase; + const additionalEdits = suggestion.completionItem && suggestion.completionItem.additionalTextEdits; + const buffer = e.editor.getBuffer(); + + ApplyEditAdapter.applyEdits(buffer, Convert.convertLsTextEdits(additionalEdits)); + buffer.groupLastChanges(); + } + protected onDidInsertSuggestion(_arg: ac.SuggestionInsertedEvent): void { } // Definitions via LS documentHighlight and gotoDefinition------------ diff --git a/lib/convert.ts b/lib/convert.ts index 95437659..599b2911 100644 --- a/lib/convert.ts +++ b/lib/convert.ts @@ -225,7 +225,7 @@ export default class Convert { * @param textEdits The language server protocol {TextEdit} objects to convert. * @returns An {Array} of Atom {TextEdit} objects. */ - public static convertLsTextEdits(textEdits: ls.TextEdit[] | null): TextEdit[] { + public static convertLsTextEdits(textEdits?: ls.TextEdit[] | null): TextEdit[] { return (textEdits || []).map(Convert.convertLsTextEdit); } diff --git a/typings/atom-ide/index.d.ts b/typings/atom-ide/index.d.ts index 6a49f6b7..2395dd53 100644 --- a/typings/atom-ide/index.d.ts +++ b/typings/atom-ide/index.d.ts @@ -1,6 +1,7 @@ declare module 'atom-ide' { import { Disposable, Grammar, Point, Range, TextEditor } from 'atom'; import * as ac from 'atom/autocomplete-plus'; + import { CompletionItem } from 'lib/languageclient'; export interface OutlineProvider { name: string; @@ -381,6 +382,9 @@ declare module 'atom-ide' { * was gathered from. */ customReplacmentPrefix?: string; + + /** Original completion item, if available */ + completionItem?: CompletionItem; } export type TextSuggestion = SuggestionBase & ac.TextSuggestion;