Bugfix: python add blank lines (#1944)
* Don't add newlines when not a control statement for Python * Add test for accidental newline fix * Add docstring detection to avoid adding unnecessarily newlines * Add tests for docstring detection
This commit is contained in:
parent
aa5c82b171
commit
8e7e810db6
2 changed files with 72 additions and 1 deletions
|
@ -6,13 +6,28 @@ function! ale#fixers#generic_python#AddLinesBeforeControlStatements(buffer, line
|
||||||
let l:new_lines = []
|
let l:new_lines = []
|
||||||
let l:last_indent_size = 0
|
let l:last_indent_size = 0
|
||||||
let l:last_line_is_blank = 0
|
let l:last_line_is_blank = 0
|
||||||
|
let l:in_docstring = 0
|
||||||
|
|
||||||
for l:line in a:lines
|
for l:line in a:lines
|
||||||
let l:indent_size = len(matchstr(l:line, '^ *'))
|
let l:indent_size = len(matchstr(l:line, '^ *'))
|
||||||
|
|
||||||
|
if !l:in_docstring
|
||||||
|
" Make sure it is not just a single line docstring and then verify
|
||||||
|
" it's starting a new docstring
|
||||||
|
if match(l:line, '\v^ *("""|'''''').*("""|'''''')') == -1
|
||||||
|
\&& match(l:line, '\v^ *("""|'''''')') >= 0
|
||||||
|
let l:in_docstring = 1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
if match(l:line, '\v^ *.*("""|'''''')') >= 0
|
||||||
|
let l:in_docstring = 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
if !l:last_line_is_blank
|
if !l:last_line_is_blank
|
||||||
|
\&& !l:in_docstring
|
||||||
\&& l:indent_size <= l:last_indent_size
|
\&& l:indent_size <= l:last_indent_size
|
||||||
\&& match(l:line, '\v^ *(return|if|for|while|break|continue)') >= 0
|
\&& match(l:line, '\v^ *(return|if|for|while|break|continue)(\(| |$)') >= 0
|
||||||
call add(l:new_lines, '')
|
call add(l:new_lines, '')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -6,15 +6,22 @@ After:
|
||||||
|
|
||||||
Given python(Some Python without blank lines):
|
Given python(Some Python without blank lines):
|
||||||
def foo():
|
def foo():
|
||||||
|
""" This is a simple test docstring """
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
def bar():
|
def bar():
|
||||||
|
'''This is another simple test docstring'''
|
||||||
return 1
|
return 1
|
||||||
return 4
|
return 4
|
||||||
|
|
||||||
|
|
||||||
def bar():
|
def bar():
|
||||||
|
"""
|
||||||
|
This is a multi-line
|
||||||
|
docstring
|
||||||
|
"""
|
||||||
|
|
||||||
if x:
|
if x:
|
||||||
pass
|
pass
|
||||||
for l in x:
|
for l in x:
|
||||||
|
@ -44,16 +51,25 @@ Execute(Blank lines should be added appropriately):
|
||||||
|
|
||||||
Expect python(Newlines should be added):
|
Expect python(Newlines should be added):
|
||||||
def foo():
|
def foo():
|
||||||
|
""" This is a simple test docstring """
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
def bar():
|
def bar():
|
||||||
|
'''This is another simple test docstring'''
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
return 4
|
return 4
|
||||||
|
|
||||||
|
|
||||||
def bar():
|
def bar():
|
||||||
|
"""
|
||||||
|
This is a multi-line
|
||||||
|
docstring
|
||||||
|
"""
|
||||||
|
|
||||||
if x:
|
if x:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -109,3 +125,43 @@ Expect python(extra newlines shouldn't be added to the main block):
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
Given python(A file with variables/docstring that start with a control statement):
|
||||||
|
def some():
|
||||||
|
"""
|
||||||
|
This is a docstring that contains an
|
||||||
|
break control statement and also contains a
|
||||||
|
return something funny.
|
||||||
|
"""
|
||||||
|
|
||||||
|
continue_some_var = True
|
||||||
|
forward_something = False
|
||||||
|
|
||||||
|
if (
|
||||||
|
continue_some_var and
|
||||||
|
forwarded_something
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
Execute(Fix the file):
|
||||||
|
let g:ale_fixers = {'python': ['add_blank_lines_for_python_control_statements']}
|
||||||
|
ALEFix
|
||||||
|
|
||||||
|
Expect python(Extra new lines are not added to the file):
|
||||||
|
def some():
|
||||||
|
"""
|
||||||
|
This is a docstring that contains an
|
||||||
|
break control statement and also contains a
|
||||||
|
return something funny.
|
||||||
|
"""
|
||||||
|
|
||||||
|
continue_some_var = True
|
||||||
|
forward_something = False
|
||||||
|
|
||||||
|
if (
|
||||||
|
continue_some_var and
|
||||||
|
forwarded_something
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
|
Reference in a new issue