8000 Fix multi-line signatures (#480) · lcheylus/python-lsp-server@1b5b69b · GitHub
[go: up one dir, main page]

Skip to content

Commit 1b5b69b

Browse files
authored
Fix multi-line signatures (python-lsp#480)
* Fix multi-line signature * Remove whitespace
1 parent 46fd374 commit 1b5b69b

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

pyls/plugins/signature.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ def pyls_signature_help(document, position):
2020
return {'signatures': []}
2121

2222
s = signatures[0]
23+
24+
# Docstring contains one or more lines of signature, followed by empty line, followed by docstring
25+
function_sig_lines = (s.docstring().split('\n\n') or [''])[0].splitlines()
26+
function_sig = ' '.join([line.strip() for line in function_sig_lines])
2327
sig = {
24-
'label': (s.docstring().splitlines() or [''])[0],
28+
'label': function_sig,
2529
'documentation': _utils.format_docstring(s.docstring(raw=True))
2630
}
2731

test/plugins/test_signature.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,26 @@ def main(param1, param2):
1818
main(
1919
"""
2020

21+
MULTI_LINE_DOC = """import sys
22+
23+
def main(param1=None,
24+
param2=None,
25+
param3=None,
26+
param4=None,
27+
param5=None,
28+
param6=None,
29+
param7=None,
30+
param8=None):
31+
\"\"\" Main docstring
32+
33+
Args:
34+
param1 (str): Docs for param1
35+
\"\"\"
36+
raise Exception()
37+
38+
main(
39+
"""
40+
2141

2242
def test_no_signature():
2343
# Over blank line
@@ -44,6 +64,25 @@ def test_signature():
4464
assert sig_info['activeParameter'] == 0
4565

4666

67+
def test_multi_line_signature():
68+
# Over '( ' in main(
69+
sig_position = {'line': 17, 'character': 5}
70+
doc = Document(DOC_URI, MULTI_LINE_DOC)
71+
72+
sig_info = signature.pyls_signature_help(doc, sig_position)
73+
74+
sigs = sig_info['signatures']
75+
assert len(sigs) == 1
76+
assert sigs[0]['label'] == (
77+
'main(param1=None, param2=None, param3=None, param4=None, '
78+
'param5=None, param6=None, param7=None, param8=None)'
79+
)
80+
assert sigs[0]['parameters'][0]['label'] == 'param1'
81+
assert sigs[0]['parameters'][0]['documentation'] == 'Docs for param1'
82+
83+
assert sig_info['activeParameter'] == 0
84+
85+
4786
@pytest.mark.parametrize('regex,doc', [
4887
(signature.SPHINX, " :param test: parameter docstring"),
4988
(signature.EPYDOC, " @param test: parameter docstring"),

0 commit comments

Comments
 (0)
0