Skip to content

Commit e57119f

Browse files
muffinmadccordoba12
authored andcommitted
Detect multiline imports and don't show snippets for them (#694)
1 parent 71c2fc5 commit e57119f

File tree

2 files changed

+52
-9
lines changed

2 files changed

+52
-9
lines changed

pyls/plugins/jedi_completion.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
'statement': lsp.CompletionItemKind.Keyword,
4040
}
4141

42+
# Types of parso nodes for which snippet is not included in the completion
43+
_IMPORTS = ('import_name', 'import_from')
44+
4245

4346
@hookimpl
4447
def pyls_completions(config, document, position):
@@ -51,8 +54,8 @@ def pyls_completions(config, document, position):
5154

5255
settings = config.plugin_settings('jedi_completion', document_path=document.path)
5356
should_include_params = settings.get('include_params')
54-
include_params = (use_snippets(document, position) and
55-
snippet_support and should_include_params)
57+
include_params = (snippet_support and should_include_params and
58+
use_snippets(document, position))
5659
return [_format_completion(d, include_params) for d in definitions] or None
5760

5861

@@ -63,13 +66,19 @@ def use_snippets(document, position):
6366
This returns `False` if a completion is being requested on an import
6467
statement, `True` otherwise.
6568
"""
66-
lines = document.source.split('\n')
67-
act_line = lines[position['line']]
68-
tokens = parso.parse(act_line)
69-
act_statement = tokens.children[0].get_code()
70-
if act_statement.startswith('import') or act_statement.startswith('from'):
71-
return False
72-
return True
69+
line = position['line']
70+
lines = document.source.split('\n', line)
71+
act_lines = [lines[line][:position['character']]]
72+
line -= 1
73+
while line > -1:
74+
act_line = lines[line]
75+
if act_line.rstrip().endswith('\\'):
76+
act_lines.insert(0, act_line)
77+
line -= 1
78+
else:
79+
break
80+
tokens = parso.parse('\n'.join(act_lines).split(';')[-1].strip())
81+
return tokens.children[0].type not in _IMPORTS
7382

7483

7584
def _format_completion(d, include_params=True):

test/plugins/test_completion.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,37 @@ def test_snippets_completion(config):
166166
completions = pyls_jedi_completions(config, doc, com_position)
167167
out = 'defaultdict(${1:default_factory}, ${2:iterable}, ${3:kwargs})$0'
168168
assert completions[0]['insertText'] == out
169+
170+
171+
def test_multiline_snippets(config):
172+
document = 'from datetime import\\\n date,\\\n datetime \na=date'
173+
doc = Document(DOC_URI, document)
174+
config.capabilities['textDocument'] = {
175+
'completion': {'completionItem': {'snippetSupport': True}}}
176+
config.update({'plugins': {'jedi_completion': {'include_params': True}}})
177+
178+
position = {'line': 1, 'character': 5}
179+
completions = pyls_jedi_completions(config, doc, position)
180+
assert completions[0]['insertText'] == 'date'
181+
182+
position = {'line': 2, 'character': 9}
183+
completions = pyls_jedi_completions(config, doc, position)
184+
assert completions[0]['insertText'] == 'datetime'
185+
186+
187+
def test_multistatement_snippet(config):
188+
config.capabilities['textDocument'] = {
189+
'completion': {'completionItem': {'snippetSupport': True}}}
190+
config.update({'plugins': {'jedi_completion': {'include_params': True}}})
191+
192+
document = 'a = 1; from datetime import date'
193+
doc = Document(DOC_URI, document)
194+
position = {'line': 0, 'character': len(document)}
195+
completions = pyls_jedi_completions(config, doc, position)
196+
assert completions[0]['insertText'] == 'date'
197+
198+
document = 'from datetime import date; a = date'
199+
doc = Document(DOC_URI, document)
200+
position = {'line': 0, 'character': len(document)}
201+
completions = pyls_jedi_completions(config, doc, position)
202+
assert completions[0]['insertText'] == 'date(${1:year}, ${2:month}, ${3:day})$0'

0 commit comments

Comments
 (0)