From 5e79f62bd1dedb9ac17ac8f91f71f4f8a39a9315 Mon Sep 17 00:00:00 2001 From: Lin Lan Date: Thu, 14 Jul 2022 15:42:55 +0800 Subject: [PATCH 1/2] Add support for including function objects --- pylsp/config/schema.json | 5 +++++ pylsp/plugins/jedi_completion.py | 15 +++++++++++++++ test/plugins/test_completion.py | 20 ++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/pylsp/config/schema.json b/pylsp/config/schema.json index 44437807..9e744ac3 100644 --- a/pylsp/config/schema.json +++ b/pylsp/config/schema.json @@ -120,6 +120,11 @@ "default": true, "description": "Adds class objects as a separate completion item." }, + "pylsp.plugins.jedi_completion.include_function_objects": { + "type": "boolean", + "default": true, + "description": "Adds function objects as a separate completion item." + }, "pylsp.plugins.jedi_completion.fuzzy": { "type": "boolean", "default": false, diff --git a/pylsp/plugins/jedi_completion.py b/pylsp/plugins/jedi_completion.py index a98f3d27..b5e259e4 100644 --- a/pylsp/plugins/jedi_completion.py +++ b/pylsp/plugins/jedi_completion.py @@ -54,6 +54,7 @@ def pylsp_completions(config, document, position): should_include_params = settings.get('include_params') should_include_class_objects = settings.get('include_class_objects', True) + should_include_function_objects = settings.get('include_function_objects', True) max_to_resolve = settings.get('resolve_at_most', 25) modules_to_cache_for = settings.get('cache_for', None) @@ -63,6 +64,7 @@ def pylsp_completions(config, document, position): include_params = snippet_support and should_include_params and use_snippets(document, position) include_class_objects = snippet_support and should_include_class_objects and use_snippets(document, position) + include_function_objects = snippet_support and should_include_function_objects and use_snippets(document, position) ready_completions = [ _format_completion( @@ -88,6 +90,19 @@ def pylsp_completions(config, document, position): completion_dict['label'] += ' object' ready_completions.append(completion_dict) + if include_function_objects: + for i, c in enumerate(completions): + if c.type == 'function': + completion_dict = _format_completion( + c, + False, + resolve=resolve_eagerly, + resolve_label_or_snippet=(i < max_to_resolve) + ) + completion_dict['kind'] = lsp.CompletionItemKind.TypeParameter + completion_dict['label'] += ' object' + ready_completions.append(completion_dict) + for completion_dict in ready_completions: completion_dict['data'] = { 'doc_uri': document.uri diff --git a/test/plugins/test_completion.py b/test/plugins/test_completion.py index f70990d5..0211cc1d 100644 --- a/test/plugins/test_completion.py +++ b/test/plugins/test_completion.py @@ -356,6 +356,26 @@ def test_completion_with_class_objects(config, workspace): assert completions[1]['kind'] == lsp.CompletionItemKind.TypeParameter +def test_completion_with_function_objects(config, workspace): + doc_text = 'def foobar(): pass\nfoob' + com_position = {'line': 1, 'character': 4} + doc = Document(DOC_URI, workspace, doc_text) + config.capabilities['textDocument'] = { + 'completion': {'completionItem': {'snippetSupport': True}}} + config.update({'plugins': {'jedi_completion': { + 'include_params': True, + 'include_function_objects': True, + }}}) + completions = pylsp_jedi_completions(config, doc, com_position) + assert len(completions) == 2 + + assert completions[0]['label'] == 'foobar()' + assert completions[0]['kind'] == lsp.CompletionItemKind.Function + + assert completions[1]['label'] == 'foobar() object' + assert completions[1]['kind'] == lsp.CompletionItemKind.TypeParameter + + def test_snippet_parsing(config, workspace): doc = 'divmod' completion_position = {'line': 0, 'character': 6} From 36a81fceefe6b514287a1a5638b213fab7efa550 Mon Sep 17 00:00:00 2001 From: Lin Lan Date: Mon, 18 Jul 2022 21:30:51 +0800 Subject: [PATCH 2/2] update --- CONFIGURATION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 2f0bc535..a1d4773e 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -22,6 +22,7 @@ This server can be configured using `workspace/didChangeConfiguration` method. E | `pylsp.plugins.jedi_completion.enabled` | `boolean` | Enable or disable the plugin. | `true` | | `pylsp.plugins.jedi_completion.include_params` | `boolean` | Auto-completes methods and classes with tabstops for each parameter. | `true` | | `pylsp.plugins.jedi_completion.include_class_objects` | `boolean` | Adds class objects as a separate completion item. | `true` | +| `pylsp.plugins.jedi_completion.include_function_objects` | `boolean` | Adds function objects as a separate completion item. | `true` | | `pylsp.plugins.jedi_completion.fuzzy` | `boolean` | Enable fuzzy when requesting autocomplete. | `false` | | `pylsp.plugins.jedi_completion.eager` | `boolean` | Resolve documentation and detail eagerly. | `false` | | `pylsp.plugins.jedi_completion.resolve_at_most` | `number` | How many labels and snippets (at most) should be resolved? | `25` |