77import parso
88
99from pylsp import _utils , hookimpl , lsp
10- from pylsp .plugins ._resolvers import LABEL_RESOLVER
10+ from pylsp .plugins ._resolvers import LABEL_RESOLVER , SNIPPET_RESOLVER
1111
1212log = logging .getLogger (__name__ )
1313
@@ -59,6 +59,7 @@ def pylsp_completions(config, document, position):
5959 modules_to_cache_labels_for = settings .get ('cache_labels_for' , None )
6060 if modules_to_cache_labels_for is not None :
6161 LABEL_RESOLVER .cached_modules = modules_to_cache_labels_for
62+ SNIPPET_RESOLVER .cached_modules = modules_to_cache_labels_for
6263
6364 include_params = snippet_support and should_include_params and use_snippets (document , position )
6465 include_class_objects = snippet_support and should_include_class_objects and use_snippets (document , position )
@@ -68,7 +69,7 @@ def pylsp_completions(config, document, position):
6869 c ,
6970 include_params ,
7071 resolve = resolve_eagerly ,
71- resolve_label = (i < max_labels_resolve )
72+ resolve_label_or_snippet = (i < max_labels_resolve )
7273 )
7374 for i , c in enumerate (completions )
7475 ]
@@ -81,7 +82,7 @@ def pylsp_completions(config, document, position):
8182 c ,
8283 False ,
8384 resolve = resolve_eagerly ,
84- resolve_label = (i < max_labels_resolve )
85+ resolve_label_or_snippet = (i < max_labels_resolve )
8586 )
8687 completion_dict ['kind' ] = lsp .CompletionItemKind .TypeParameter
8788 completion_dict ['label' ] += ' object'
@@ -173,9 +174,9 @@ def _resolve_completion(completion, d):
173174 return completion
174175
175176
176- def _format_completion (d , include_params = True , resolve = False , resolve_label = False ):
177+ def _format_completion (d , include_params = True , resolve = False , resolve_label_or_snippet = False ):
177178 completion = {
178- 'label' : _label (d , resolve_label ),
179+ 'label' : _label (d , resolve_label_or_snippet ),
179180 'kind' : _TYPE_MAP .get (d .type ),
180181 'sortText' : _sort_text (d ),
181182 'insertText' : d .name
@@ -191,29 +192,8 @@ def _format_completion(d, include_params=True, resolve=False, resolve_label=Fals
191192 completion ['insertText' ] = path
192193
193194 if include_params and not is_exception_class (d .name ):
194- sig = d .get_signatures ()
195- if not sig :
196- return completion
197-
198- positional_args = [param for param in sig [0 ].params
199- if '=' not in param .description and
200- param .name not in {'/' , '*' }]
201-
202- if len (positional_args ) > 1 :
203- # For completions with params, we can generate a snippet instead
204- completion ['insertTextFormat' ] = lsp .InsertTextFormat .Snippet
205- snippet = d .name + '('
206- for i , param in enumerate (positional_args ):
207- snippet += '${%s:%s}' % (i + 1 , param .name )
208- if i < len (positional_args ) - 1 :
209- snippet += ', '
210- snippet += ')$0'
211- completion ['insertText' ] = snippet
212- elif len (positional_args ) == 1 :
213- completion ['insertTextFormat' ] = lsp .InsertTextFormat .Snippet
214- completion ['insertText' ] = d .name + '($0)'
215- else :
216- completion ['insertText' ] = d .name + '()'
195+ snippet = _snippet (d , resolve_label_or_snippet )
196+ completion .update (snippet )
217197
218198 return completion
219199
@@ -227,6 +207,13 @@ def _label(definition, resolve=False):
227207 return definition .name
228208
229209
210+ def _snippet (definition , resolve = False ):
211+ if not resolve :
212+ return {}
213+ snippet = SNIPPET_RESOLVER .get_or_create (definition )
214+ return snippet
215+
216+
230217def _detail (definition ):
231218 try :
232219 return definition .parent ().full_name or ''
0 commit comments