Skip to content

Commit 5a13db1

Browse files
authored
Fix Jedi type map (use types offered by modern Jedi) (#18)
* Fix Jedi type map (use types offered by modern Jedi) * Use JEDI_VERSION
1 parent b65f4a8 commit 5a13db1

File tree

2 files changed

+86
-29
lines changed

2 files changed

+86
-29
lines changed

pylsp/plugins/jedi_completion.py

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,21 @@
1010

1111
log = logging.getLogger(__name__)
1212

13-
# Map to the VSCode type
13+
# Map to the LSP type
14+
# > Valid values for type are ``module``, `` class ``, ``instance``, ``function``,
15+
# > ``param``, ``path``, ``keyword``, ``property`` and ``statement``.
16+
# see: https://jedi.readthedocs.io/en/latest/docs/api-classes.html#jedi.api.classes.BaseName.type
1417
_TYPE_MAP = {
15-
'none': lsp.CompletionItemKind.Value,
16-
'type': lsp.CompletionItemKind.Class,
17-
'tuple': lsp.CompletionItemKind.Class,
18-
'dict': lsp.CompletionItemKind.Class,
19-
'dictionary': lsp.CompletionItemKind.Class,
20-
'function': lsp.CompletionItemKind.Function,
21-
'lambda': lsp.CompletionItemKind.Function,
22-
'generator': lsp.CompletionItemKind.Function,
18+
'module': lsp.CompletionItemKind.Module,
19+
'namespace': lsp.CompletionItemKind.Module, # to be added in Jedi 0.18+
2320
'class': lsp.CompletionItemKind.Class,
2421
'instance': lsp.CompletionItemKind.Reference,
25-
'method': lsp.CompletionItemKind.Method,
26-
'builtin': lsp.CompletionItemKind.Class,
27-
'builtinfunction': lsp.CompletionItemKind.Function,
28-
'module': lsp.CompletionItemKind.Module,
29-
'file': lsp.CompletionItemKind.File,
30-
'path': lsp.CompletionItemKind.Text,
31-
'xrange': lsp.CompletionItemKind.Class,
32-
'slice': lsp.CompletionItemKind.Class,
33-
'traceback': lsp.CompletionItemKind.Class,
34-
'frame': lsp.CompletionItemKind.Class,
35-
'buffer': lsp.CompletionItemKind.Class,
36-
'dictproxy': lsp.CompletionItemKind.Class,
37-
'funcdef': lsp.CompletionItemKind.Function,
38-
'property': lsp.CompletionItemKind.Property,
39-
'import': lsp.CompletionItemKind.Module,
40-
'keyword': lsp.CompletionItemKind.Keyword,
41-
'constant': lsp.CompletionItemKind.Variable,
42-
'variable': lsp.CompletionItemKind.Variable,
43-
'value': lsp.CompletionItemKind.Value,
22+
'function': lsp.CompletionItemKind.Function,
4423
'param': lsp.CompletionItemKind.Variable,
45-
'statement': lsp.CompletionItemKind.Keyword,
24+
'path': lsp.CompletionItemKind.File,
25+
'keyword': lsp.CompletionItemKind.Keyword,
26+
'property': lsp.CompletionItemKind.Property, # added in Jedi 0.18
27+
'statement': lsp.CompletionItemKind.Variable
4628
}
4729

4830
# Types of parso nodes for which snippet is not included in the completion

test/plugins/test_completion.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
import os
55
import sys
66

7+
from pathlib import Path
8+
from typing import NamedTuple, Dict
9+
710
import pytest
811

912
from pylsp import uris, lsp
1013
from pylsp.workspace import Document
1114
from pylsp.plugins.jedi_completion import pylsp_completions as pylsp_jedi_completions
1215
from pylsp.plugins.rope_completion import pylsp_completions as pylsp_rope_completions
16+
from pylsp._utils import JEDI_VERSION
1317

1418

1519
PY2 = sys.version[0] == '2'
@@ -50,6 +54,77 @@ def test_rope_import_completion(config, workspace):
5054
assert items is None
5155

5256

57+
class TypeCase(NamedTuple):
58+
document: str
59+
position: dict
60+
label: str
61+
expected: lsp.CompletionItemKind
62+
63+
64+
TYPE_CASES: Dict[str, TypeCase] = {
65+
'variable': TypeCase(
66+
document='test = 1\ntes',
67+
position={'line': 1, 'character': 3},
68+
label='test',
69+
expected=lsp.CompletionItemKind.Variable
70+
),
71+
'function': TypeCase(
72+
document='def test():\n pass\ntes',
73+
position={'line': 2, 'character': 3},
74+
label='test()',
75+
expected=lsp.CompletionItemKind.Function
76+
),
77+
'keyword': TypeCase(
78+
document='fro',
79+
position={'line': 0, 'character': 3},
80+
label='from',
81+
expected=lsp.CompletionItemKind.Keyword
82+
),
83+
'file': TypeCase(
84+
document='"' + __file__[:-2].replace('"', '\\"') + '"',
85+
position={'line': 0, 'character': len(__file__) - 2},
86+
label=Path(__file__).name + '"',
87+
expected=lsp.CompletionItemKind.File
88+
),
89+
'module': TypeCase(
90+
document='import statis',
91+
position={'line': 0, 'character': 13},
92+
label='statistics',
93+
expected=lsp.CompletionItemKind.Module
94+
),
95+
'class': TypeCase(
96+
document='KeyErr',
97+
position={'line': 0, 'character': 6},
98+
label='KeyError',
99+
expected=lsp.CompletionItemKind.Class
100+
),
101+
'property': TypeCase(
102+
document=(
103+
'class A:\n'
104+
' @property\n'
105+
' def test(self):\n'
106+
' pass\n'
107+
'A().tes'
108+
),
109+
position={'line': 4, 'character': 5},
110+
label='test',
111+
expected=lsp.CompletionItemKind.Property
112+
)
113+
}
114+
115+
116+
@pytest.mark.parametrize('case', list(TYPE_CASES.values()), ids=list(TYPE_CASES.keys()))
117+
def test_jedi_completion_type(case, config, workspace):
118+
# property support was introduced in 0.18
119+
if case.expected == lsp.CompletionItemKind.Property and JEDI_VERSION.startswith('0.17'):
120+
return
121+
122+
doc = Document(DOC_URI, workspace, case.document)
123+
items = pylsp_jedi_completions(config, doc, case.position)
124+
items = {i['label']: i for i in items}
125+
assert items[case.label]['kind'] == case.expected
126+
127+
53128
def test_jedi_completion(config, workspace):
54129
# Over 'i' in os.path.isabs(...)
55130
com_position = {'line': 1, 'character': 15}

0 commit comments

Comments
 (0)