summaryrefslogtreecommitdiff
path: root/ale_linters/python/flake8.vim
diff options
context:
space:
mode:
Diffstat (limited to 'ale_linters/python/flake8.vim')
-rw-r--r--ale_linters/python/flake8.vim61
1 files changed, 60 insertions, 1 deletions
diff --git a/ale_linters/python/flake8.vim b/ale_linters/python/flake8.vim
index 253c7101..7af02d4e 100644
--- a/ale_linters/python/flake8.vim
+++ b/ale_linters/python/flake8.vim
@@ -94,6 +94,65 @@ function! ale_linters#python#flake8#GetCommand(buffer, version_output) abort
\ . l:display_name_args . ' -'
endfunction
+let s:end_col_pattern_map = {
+\ 'F405': '\(.\+\) may be undefined',
+\ 'F821': 'undefined name ''\([^'']\+\)''',
+\ 'F999': '^''\([^'']\+\)''',
+\ 'F841': 'local variable ''\([^'']\+\)''',
+\}
+
+function! ale_linters#python#flake8#Handle(buffer, lines) abort
+ for l:line in a:lines[:10]
+ if match(l:line, '^Traceback') >= 0
+ return [{
+ \ 'lnum': 1,
+ \ 'text': 'An exception was thrown. See :ALEDetail',
+ \ 'detail': join(a:lines, "\n"),
+ \}]
+ endif
+ endfor
+
+ " Matches patterns line the following:
+ "
+ " Matches patterns line the following:
+ "
+ " stdin:6:6: E111 indentation is not a multiple of four
+ " test.yml:35: [EANSIBLE0002] Trailing whitespace
+ let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):?(\d+)?: ([[:alnum:]]+) (.*)$'
+ let l:output = []
+
+ for l:match in ale#util#GetMatches(a:lines, l:pattern)
+ let l:code = l:match[3]
+
+ if (l:code ==# 'W291' || l:code ==# 'W293')
+ \ && !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
+ " Skip warnings for trailing whitespace if the option is off.
+ continue
+ endif
+
+ let l:item = {
+ \ 'lnum': l:match[1] + 0,
+ \ 'col': l:match[2] + 0,
+ \ 'text': l:code . ': ' . l:match[4],
+ \ 'type': l:code[:0] ==# 'E' ? 'E' : 'W',
+ \}
+
+ let l:end_col_pattern = get(s:end_col_pattern_map, l:code, '')
+
+ if !empty(l:end_col_pattern)
+ let l:end_col_match = matchlist(l:match[4], l:end_col_pattern)
+
+ if !empty(l:end_col_match)
+ let l:item.end_col = l:item.col + len(l:end_col_match[1]) - 1
+ endif
+ endif
+
+ call add(l:output, l:item)
+ endfor
+
+ return l:output
+endfunction
+
call ale#linter#Define('python', {
\ 'name': 'flake8',
\ 'executable_callback': 'ale_linters#python#flake8#GetExecutable',
@@ -101,5 +160,5 @@ call ale#linter#Define('python', {
\ {'callback': 'ale_linters#python#flake8#VersionCheck'},
\ {'callback': 'ale_linters#python#flake8#GetCommand', 'output_stream': 'both'},
\ ],
-\ 'callback': 'ale#handlers#python#HandlePEP8Format',
+\ 'callback': 'ale_linters#python#flake8#Handle',
\})