8000 Optimize completions and symbols (#508) · lcheylus/python-lsp-server@de850aa · GitHub
[go: up one dir, main page]

Skip to content

Commit de850aa

Browse files
lgeigergatesn
authored andcommitted
Optimize completions and symbols (python-lsp#508)
This PR refactors completions and symbols in order to get some easy performance wins: - Preallocate type maps - Replace append-loop with list comprehension - Replace generator expression in str.join with list comprehension
1 parent fdb2446 commit de850aa

File tree

2 files changed

+102
-106
lines changed

2 files changed

+102
-106
lines changed

pyls/plugins/jedi_completion.py

Lines changed: 59 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,40 @@
44

55
log = logging.getLogger(__name__)
66

7+
# Map to the VSCode type
8+
_TYPE_MAP = {
9+
'none': lsp.CompletionItemKind.Value,
10+
'type': lsp.CompletionItemKind.Class,
11+
'tuple': lsp.CompletionItemKind.Class,
12+
'dict': lsp.CompletionItemKind.Class,
13+
'dictionary': lsp.CompletionItemKind.Class,
14+
'function': lsp.CompletionItemKind.Function,
15+
'lambda': lsp.CompletionItemKind.Function,
16+
'generator': lsp.CompletionItemKind.Function,
17+
'class': lsp.CompletionItemKind.Class,
18+
'instance': lsp.CompletionItemKind.Reference,
19+
'method': lsp.CompletionItemKind.Method,
20+
'builtin': lsp.CompletionItemKind.Class,
21+
'builtinfunction': lsp.CompletionItemKind.Function,
22+
'module': lsp.CompletionItemKind.Module,
23+
'file': lsp.CompletionItemKind.File,
24+
'xrange': lsp.CompletionItemKind.Class,
25+
'slice': lsp.CompletionItemKind.Class,
26+
'traceback': lsp.CompletionItemKind.Class,
27+
'frame': lsp.CompletionItemKind.Class,
28+
'buffer': lsp.CompletionItemKind.Class,
29+
'dictproxy': lsp.CompletionItemKind.Class,
30+
'funcdef': lsp.CompletionItemKind.Function,
31+
'property': lsp.CompletionItemKind.Property,
32+
'import': lsp.CompletionItemKind.Module,
33+
'keyword': lsp.CompletionItemKind.Keyword,
34+
'constant': lsp.CompletionItemKind.Variable,
35+
'variable': lsp.CompletionItemKind.Variable,
36+
'value': lsp.CompletionItemKind.Value,
37+
'param': lsp.CompletionItemKind.Variable,
38+
'statement': lsp.CompletionItemKind.Keyword,
39+
}
40+
741

842
@hookimpl
943
def pyls_completions(config, document, position):
@@ -14,36 +48,35 @@ def pyls_completions(config, document, position):
1448
settings = config.plugin_settings('jedi_completion', document_path=document.path)
1549
include_params = settings.get('include_params', True)
1650

17-
completions = []
18-
for d in definitions:
19-
completion = {
20-
'label': _label(d),
21-
'kind': _kind(d),
22-
'detail': _detail(d),
23-
'documentation': _utils.format_docstring(d.docstring()),
24-
'sortText': _sort_text(d),
25-
'insertText': d.name
26-
}
27-
28-
if include_params and hasattr(d, 'params') and d.params:
29-
# For completions with params, we can generate a snippet instead
30-
completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet
31-
snippet = d.name + '('
32-
for i, param in enumerate(d.params):
33-
snippet += '${%s:%s}' % (i + 1, param.name)
34-
if i < len(d.params) - 1:
35-
snippet += ', '
36-
snippet += ')$0'
37-
completion['insertText'] = snippet
38-
39-
completions.append(completion)
40-
41-
return completions or None
51+
return [_format_completion(d, include_params) for d in definitions] or None
52+
53+
54+
def _format_completion(d, include_params=True):
55+
completion = {
56+
'label': _label(d),
57+
'kind': _TYPE_MAP.get(d.type),
58+
'detail': _detail(d),
59+
'documentation': _utils.format_docstring(d.docstring()),
60+
'sortText': _sort_text(d),
61+
'insertText': d.name
62+
}
63+
64+
if include_params and hasattr(d, 'params') and d.params:
65+
# For completions with params, we can generate a snippet instead
66+
completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet
67+
snippet = d.name + '('
68+
for i, param in enumerate(d.params):
69+
snippet += '${%s:%s}' % (i + 1, param.name)
70+
if i < len(d.params) - 1:
71+
snippet += ', '
72+
snippet += ')$0'
73+
completion['insertText'] = snippet
74+
return completion
4275

4376

4477
def _label(definition):
4578
if definition.type in ('function', 'method') and hasattr(definition, 'params'):
46-
params = ', '.join(param.name for param in definition.params)
79+
params = ', '.join([param.name for param in definition.params])
4780
return '{}({})'.format(definition.name, params)
4881

4982
return definition.name
@@ -61,41 +94,3 @@ def _sort_text(definition):
6194
# If its 'hidden', put it next last
6295
prefix = 'z{}' if definition.name.startswith('_') else 'a{}'
6396
return prefix.format(definition.name)
64-
65-
66-
def _kind(d):
67-
""" Return the VSCode type """
68-
MAP = {
69-
'none': lsp.CompletionItemKind.Value,
70-
'type': lsp.CompletionItemKind.Class,
71-
'tuple': lsp.CompletionItemKind.Class,
72-
'dict': lsp.CompletionItemKind.Class,
73-
'dictionary': lsp.CompletionItemKind.Class,
74-
'function': lsp.CompletionItemKind.Function,
75-
'lambda': lsp.CompletionItemKind.Function,
76-
'generator': lsp.CompletionItemKind.Function,
77-
'class': lsp.CompletionItemKind.Class,
78-
'instance': lsp.CompletionItemKind.Reference,
79-
'method': lsp.CompletionItemKind.Method,
80-
'builtin': lsp.CompletionItemKind.Class,
81-
'builtinfunction': lsp.CompletionItemKind.Function,
82-
'module': lsp.CompletionItemKind.Module,
83-
'file': lsp.CompletionItemKind.File,
84-
'xrange': lsp.CompletionItemKind.Class,
85-
'slice': lsp.CompletionItemKind.Class,
86-
'traceback': lsp.CompletionItemKind.Class,
87-
'frame': lsp.CompletionItemKind.Class,
88-
'buffer': lsp.CompletionItemKind.Class,
89-
'dictproxy': lsp.CompletionItemKind.Class,
90-
'funcdef': lsp.CompletionItemKind.Function,
91-
'property': lsp.CompletionItemKind.Property,
92-
'import': lsp.CompletionItemKind.Module,
93-
'keyword': lsp.CompletionItemKind.Keyword,
94-
'constant': lsp.CompletionItemKind.Variable,
95-
'variable': lsp.CompletionItemKind.Variable,
96-
'value': lsp.CompletionItemKind.Value,
97-
'param': lsp.CompletionItemKind.Variable,
98-
'statement': lsp.CompletionItemKind.Keyword,
99-
}
100-
101-
return MAP.get(d.type)

pyls/plugins/symbols.py

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -56,47 +56,48 @@ def _range(definition):
5656
}
5757

5858

59+
_SYMBOL_KIND_MAP = {
60+
'none': SymbolKind.Variable,
61+
'type': SymbolKind.Class,
62+
'tuple': SymbolKind.Class,
63+
'dict': SymbolKind.Class,
64+
'dictionary': SymbolKind.Class,
65+
'function': SymbolKind.Function,
66+
'lambda': SymbolKind.Function,
67+
'generator': SymbolKind.Function,
68+
'class': SymbolKind.Class,
69+
'instance': SymbolKind.Class,
70+
'method': SymbolKind.Method,
71+
'builtin': SymbolKind.Class,
72+
'builtinfunction': SymbolKind.Function,
73+
'module': SymbolKind.Module,
74+
'file': SymbolKind.File,
75+
'xrange': SymbolKind.Array,
76+
'slice': SymbolKind.Class,
77+
'traceback': SymbolKind.Class,
78+
'frame': SymbolKind.Class,
79+
'buffer': SymbolKind.Array,
80+
'dictproxy': SymbolKind.Class,
81+
'funcdef': SymbolKind.Function,
82+
'property': SymbolKind.Property,
83+
'import': SymbolKind.Module,
84+
'keyword': SymbolKind.Variable,
85+
'constant': SymbolKind.Constant,
86+
'variable': SymbolKind.Variable,
87+
'value': SymbolKind.Variable,
88+
'param': SymbolKind.Variable,
89+
'statement': SymbolKind.Variable,
90+
'boolean': SymbolKind.Boolean,
91+
'int': SymbolKind.Number,
92+
'longlean': SymbolKind.Number,
93+
'float': SymbolKind.Number,
94+
'complex': SymbolKind.Number,
95+
'string': SymbolKind.String,
96+
'unicode': SymbolKind.String,
97+
'list': SymbolKind.Array,
98+
}
99+
100+
59101
def _kind(d):
60102
""" Return the VSCode Symbol Type """
61-
MAP = {
62-
'none': SymbolKind.Variable,
63-
'type': SymbolKind.Class,
64-
'tuple': SymbolKind.Class,
65-
'dict': SymbolKind.Class,
66-
'dictionary': SymbolKind.Class,
67-
'function': SymbolKind.Function,
68-
'lambda': SymbolKind.Function,
69-
'generator': SymbolKind.Function,
70-
'class': SymbolKind.Class,
71-
'instance': SymbolKind.Class,
72-
'method': SymbolKind.Method,
73-
'builtin': SymbolKind.Class,
74-
'builtinfunction': SymbolKind.Function,
75-
'module': SymbolKind.Module,
76-
'file': SymbolKind.File,
77-
'xrange': SymbolKind.Array,
78-
'slice': SymbolKind.Class,
79-
'traceback': SymbolKind.Class,
80-
'frame': SymbolKind.Class,
81-
'buffer': SymbolKind.Array,
82-
'dictproxy': SymbolKind.Class,
83-
'funcdef': SymbolKind.Function,
84-
'property': SymbolKind.Property,
85-
'import': SymbolKind.Module,
86-
'keyword': SymbolKind.Variable,
87-
'constant': SymbolKind.Constant,
88-
'variable': SymbolKind.Variable,
89-
'value': SymbolKind.Variable,
90-
'param': SymbolKind.Variable,
91-
'statement': SymbolKind.Variable,
92-
'boolean': SymbolKind.Boolean,
93-
'int': SymbolKind.Number,
94-
'longlean': SymbolKind.Number,
95-
'float': SymbolKind.Number,
96-
'complex': SymbolKind.Number,
97-
'string': SymbolKind.String,
98-
'unicode': SymbolKind.String,
99-
'list': SymbolKind.Array,
100-
}
101-
102-
return MAP.get(d.type)
103+
return _SYMBOL_KIND_MAP.get(d.type)

0 commit comments

Comments
 (0)
0