@@ -18,22 +18,49 @@ export default class AutocompleteAdapter {
18
18
return serverCapabilities . completionProvider != null ;
19
19
}
20
20
21
- // Public: Primary entry point for obtaining suggestions for AutoComplete+ by
22
- // querying the language server.
21
+ _lastSuggestions : Map < atom$AutocompleteSuggestion , [ CompletionItem , boolean ] > = new Map ( ) ;
22
+
23
+ // Public: Obtain suggestion list for AutoComplete+ by querying the language server using
24
+ // the `textDocument/completion` request.
23
25
//
24
26
// * `connection` A {LanguageClientConnection} to the language server to query.
25
27
// * `request` An {Object} with the AutoComplete+ request to satisfy.
26
28
//
27
- // Returns a {Promise} of an {Array} of {Object }s containing the AutoComplete+
28
- // suggestions to display.
29
+ // Returns a {Promise} of an {Array} of {atom$AutocompleteSuggestion }s containing the
30
+ // AutoComplete+ suggestions to display.
29
31
async getSuggestions (
30
32
connection : LanguageClientConnection ,
31
33
request : atom$AutocompleteRequest ,
32
34
) : Promise < Array < atom$AutocompleteSuggestion >> {
33
- const completionItems = await connection . completion (
34
- AutocompleteAdapter . requestToTextDocumentPositionParams ( request ) ,
35
- ) ;
36
- return AutocompleteAdapter . completionItemsToSuggestions ( completionItems , request ) ;
35
+ const items = await connection . completion ( AutocompleteAdapter . requestToTextDocumentPositionParams ( request ) ) ;
36
+ return this . completionItemsToSuggestions ( items , request ) ;
37
+ }
38
+
39
+ // Public: Obtain a complete version of a suggestion with additional information
40
+ // the language server can provide by way of the `completionItem/resolve` request.
41
+ //
42
+ // * `connection` A {LanguageClientConnection} to the language server to query.
43
+ // * `request` An {Object} with the AutoComplete+ request to satisfy.
44
+ //
45
+ // Returns a {Promise} of an {atom$AutocompleteSuggestion} with the resolved AutoComplete+
46
+ // suggestion.
47
+ async completeSuggestion (
48
+ connection : LanguageClientConnection ,
49
+ suggestion : atom$AutocompleteSuggestion ,
50
+ request : atom$AutocompleteRequest ,
51
+ ) : Promise < atom$AutocompleteSuggestion > {
52
+ const originalCompletionItem = this . _lastSuggestions . get ( suggestion ) ;
53
+ if ( originalCompletionItem != null && originalCompletionItem [ 1 ] === false ) {
54
+ const resolveCompletionItem = await connection . completionItemResolve ( originalCompletionItem [ 0 ] ) ;
55
+ if ( resolveCompletionItem != null ) {
56
+ const resolvedSuggestion = AutocompleteAdapter . completionItemToSuggestion ( resolveCompletionItem , request ) ;
57
+ this . _lastSuggestions . delete ( suggestion ) ;
58
+ this . _lastSuggestions . set ( resolvedSuggestion , [ resolveCompletionItem , true ] ) ;
59
+ return resolvedSuggestion ;
60
+ }
61
+ }
62
+
63
+ return suggestion ;
37
64
}
38
65
39
66
// Public: Create TextDocumentPositionParams to be sent to the language server
@@ -59,13 +86,14 @@ export default class AutocompleteAdapter {
59
86
// * `request` An {Object} with the AutoComplete+ request to use.
60
87
//
61
88
// Returns an {Array} of AutoComplete+ suggestions ordered by the CompletionItems sortText.
62
- static completionItemsToSuggestions (
89
+ completionItemsToSuggestions (
63
90
completionItems : Array < CompletionItem > | CompletionList ,
64
91
request : atom$AutocompleteRequest ,
65
92
) : Array < atom$AutocompleteSuggestion > {
66
- return ( Array . isArray ( completionItems ) ? completionItems : completionItems . items || [ ] )
93
+ this . _lastSuggestions = new Map ( ( Array . isArray ( completionItems ) ? completionItems : completionItems . items || [ ] )
67
94
. sort ( ( a , b ) => ( a . sortText || a . label ) . localeCompare ( b . sortText || b . label ) )
68
- . map ( s => AutocompleteAdapter . completionItemToSuggestion ( s , request ) ) ;
95
+ . map ( s => [ AutocompleteAdapter . completionItemToSuggestion ( s , request ) , [ s , false ] ] ) ) ;
96
+ return Array . from ( this . _lastSuggestions . keys ( ) ) ;
69
97
}
70
98
71
99
// Public: Convert a language server protocol CompletionItem to an AutoComplete+ suggestion.
0 commit comments