Skip to content

Commit 0e22593

Browse files
aminyaalexheretic
andcommitted
feat: apply additionalTextEdits after completion
See https://microsoft.github.io/language-server-protocol/specification#textDocument_completion Co-Authored-By: Alex Butler <[email protected]>
1 parent 2317a7d commit 0e22593

File tree

4 files changed

+23
-3
lines changed

4 files changed

+23
-3
lines changed

lib/adapters/autocomplete-adapter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,8 @@ export default class AutocompleteAdapter {
421421
onDidConvertCompletionItem(item, suggestion as ac.AnySuggestion, request)
422422
}
423423

424+
suggestion.completionItem = item
425+
424426
return suggestion
425427
}
426428

lib/auto-languageclient.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
} from "./server-manager.js"
3636
import { Disposable, CompositeDisposable, Point, Range, TextEditor } from "atom"
3737
import * as ac from "atom/autocomplete-plus"
38+
import { SuggestionBase } from "./types/autocomplete-extended"
3839
import { basename } from "path"
3940

4041
export { ActiveServer, LanguageClientConnection, LanguageServerProcess }
@@ -638,7 +639,10 @@ export default class AutoLanguageClient {
638639
excludeLowerPriority: false,
639640
filterSuggestions: true,
640641
getSuggestions: this.getSuggestions.bind(this),
641-
onDidInsertSuggestion: this.onDidInsertSuggestion.bind(this),
642+
onDidInsertSuggestion: (event) => {
643+
this.handleAdditionalTextEdits(event)
644+
this.onDidInsertSuggestion(event)
645+
},
642646
getSuggestionDetailsOnSelect: this.getSuggestionDetailsOnSelect.bind(this),
643647
}
644648
}
@@ -678,6 +682,16 @@ export default class AutoLanguageClient {
678682
_request: ac.SuggestionsRequestedEvent
679683
): void {}
680684

685+
/** Handle additional text edits after a suggestion insert, e.g. `additionalTextEdits`. */
686+
private handleAdditionalTextEdits(event: ac.SuggestionInsertedEvent): void {
687+
const suggestion = event.suggestion as SuggestionBase
688+
const additionalEdits = suggestion.completionItem?.additionalTextEdits
689+
const buffer = event.editor.getBuffer()
690+
691+
ApplyEditAdapter.applyEdits(buffer, Convert.convertLsTextEdits(additionalEdits))
692+
buffer.groupLastChanges()
693+
}
694+
681695
protected onDidInsertSuggestion(_arg: ac.SuggestionInsertedEvent): void {}
682696

683697
// Definitions via LS documentHighlight and gotoDefinition------------

lib/convert.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export default class Convert {
199199
* @param textEdits The language server protocol {atomIde.TextEdit} objects to convert.
200200
* @returns An {Array} of Atom {atomIde.TextEdit} objects.
201201
*/
202-
public static convertLsTextEdits(textEdits: ls.TextEdit[] | null): atomIde.TextEdit[] {
202+
public static convertLsTextEdits(textEdits?: ls.TextEdit[] | null): atomIde.TextEdit[] {
203203
return (textEdits || []).map(Convert.convertLsTextEdit)
204204
}
205205

lib/types/autocomplete-extended.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// See this PR: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/51284
33

44
import * as ac from "atom/autocomplete-plus"
5+
import { CompletionItem } from "../languageclient"
56

67
/** Adds LSP specific properties to the Atom SuggestionBase type */
7-
interface SuggestionBase extends ac.SuggestionBase {
8+
export interface SuggestionBase extends ac.SuggestionBase {
89
/**
910
* A string that is used when filtering and sorting a set of completion items with a prefix present. When `falsy` the
1011
* [displayText](#ac.SuggestionBase.displayText) is used. When no prefix, the `sortText` property is used.
@@ -16,6 +17,9 @@ interface SuggestionBase extends ac.SuggestionBase {
1617
* the suggestion was gathered from.
1718
*/
1819
customReplacmentPrefix?: string
20+
21+
/** Original completion item, if available */
22+
completionItem?: CompletionItem
1923
}
2024
export type TextSuggestion = SuggestionBase & ac.TextSuggestion
2125
export type SnippetSuggestion = SuggestionBase & ac.SnippetSuggestion

0 commit comments

Comments
 (0)