summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/engine.vim28
-rw-r--r--doc/ale.txt29
-rw-r--r--plugin/ale.vim3
-rw-r--r--test/test_linter_type_mapping.vader120
4 files changed, 180 insertions, 0 deletions
diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim
index 1643f86b..0cccd2f1 100644
--- a/autoload/ale/engine.vim
+++ b/autoload/ale/engine.vim
@@ -257,6 +257,28 @@ function! ale#engine#SetResults(buffer, loclist) abort
endif
endfunction
+function! s:RemapItemTypes(type_map, loclist) abort
+ for l:item in a:loclist
+ let l:key = l:item.type
+ \ . (get(l:item, 'sub_type', '') ==# 'style' ? 'S' : '')
+ let l:new_key = get(a:type_map, l:key, '')
+
+ if l:new_key ==# 'E'
+ \|| l:new_key ==# 'ES'
+ \|| l:new_key ==# 'W'
+ \|| l:new_key ==# 'WS'
+ \|| l:new_key ==# 'I'
+ let l:item.type = l:new_key[0]
+
+ if l:new_key ==# 'ES' || l:new_key ==# 'WS'
+ let l:item.sub_type = 'style'
+ elseif has_key(l:item, 'sub_type')
+ call remove(l:item, 'sub_type')
+ endif
+ endif
+ endfor
+endfunction
+
function! ale#engine#FixLocList(buffer, linter_name, loclist) abort
let l:new_loclist = []
@@ -317,6 +339,12 @@ function! ale#engine#FixLocList(buffer, linter_name, loclist) abort
call add(l:new_loclist, l:item)
endfor
+ let l:type_map = get(ale#Var(a:buffer, 'type_map'), a:linter_name, {})
+
+ if !empty(l:type_map)
+ call s:RemapItemTypes(l:type_map, l:new_loclist)
+ endif
+
return l:new_loclist
endfunction
diff --git a/doc/ale.txt b/doc/ale.txt
index e15f5a0f..8c6ecf9d 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -745,6 +745,35 @@ g:ale_sign_warning *g:ale_sign_warning*
The sign for warnings in the sign gutter.
+g:ale_type_map *g:ale_type_map*
+ *b:ale_type_map*
+ Type: |Dictionary|
+ Default: `{}`
+
+ This option can be set re-map problem types for linters. Each key in
+ the |Dictionary| should be the name of a linter, and each value must be
+ a |Dictionary| mapping error types from one type to another. The
+ following types are supported:
+
+ `'E'` - `{'type': 'E'}`
+ `'ES'` - `{'type': 'E', 'sub_type': 'style'}`
+ `'W'` - `{'type': 'W'}`
+ `'WS'` - `{'type': 'W', 'sub_type': 'style'}`
+ `'I'` - `{'type': 'I'}`
+
+ For example, if you want to turn flake8 errors into warnings, you can do
+ the following: >
+
+ let g:ale_type_map = {'flake8', {'ES': 'WS', 'E': 'W'}}
+<
+ If you wanted to turn style errors and warnings into regular errors and
+ warnings, you can use the following: >
+
+ let g:ale_type_map = {'flake8', {'ES': 'E', 'WS': 'W'}}
+<
+ Type maps can be set per-buffer with `b:ale_type_map`.
+
+
g:ale_warn_about_trailing_whitespace *g:ale_warn_about_trailing_whitespace*
b:ale_warn_about_trailing_whitespace *b:ale_warn_about_trailing_whitespace*
diff --git a/plugin/ale.vim b/plugin/ale.vim
index 2bc0c103..5901187f 100644
--- a/plugin/ale.vim
+++ b/plugin/ale.vim
@@ -178,6 +178,9 @@ call ale#Set('pattern_options_enabled', !empty(g:ale_pattern_options))
" A maximum file size for checking for errors.
call ale#Set('maximum_file_size', 0)
+" Remapping of linter problems.
+call ale#Set('type_map', {})
+
function! ALEInitAuGroups() abort
" This value used to be a Boolean as a Number, and is now a String.
let l:text_changed = '' . g:ale_lint_on_text_changed
diff --git a/test/test_linter_type_mapping.vader b/test/test_linter_type_mapping.vader
new file mode 100644
index 00000000..0131b5f0
--- /dev/null
+++ b/test/test_linter_type_mapping.vader
@@ -0,0 +1,120 @@
+Before:
+ Save g:ale_type_map
+
+After:
+ Restore
+ unlet! b:ale_type_map
+
+Execute(It should be possible to remap errors to style errors):
+ let g:ale_type_map = {'foo': {'E': 'ES'}}
+
+ AssertEqual
+ \ [
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ ],
+ \ ale#engine#FixLocList(bufnr(''), 'foo', [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ ])
+
+Execute(It should be possible to remap errors to style errors with buffer-local variables):
+ let b:ale_type_map = {'foo': {'E': 'ES'}}
+
+ AssertEqual
+ \ [
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ ],
+ \ ale#engine#FixLocList(bufnr(''), 'foo', [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ ])
+
+Execute(It should be possible to remap warnings to style warnings):
+ let g:ale_type_map = {'foo': {'W': 'WS'}}
+
+ AssertEqual
+ \ [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ ],
+ \ ale#engine#FixLocList(bufnr(''), 'foo', [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ ])
+
+Execute(It should be possible to remap style errors to errors):
+ let g:ale_type_map = {'foo': {'ES': 'E'}}
+
+ AssertEqual
+ \ [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ ],
+ \ ale#engine#FixLocList(bufnr(''), 'foo', [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ ])
+
+Execute(It should be possible to remap style warnings to warnings):
+ let g:ale_type_map = {'foo': {'WS': 'W'}}
+
+ AssertEqual
+ \ [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ ],
+ \ ale#engine#FixLocList(bufnr(''), 'foo', [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ ])
+
+Execute(It should be possible to info problems to warnings):
+ let g:ale_type_map = {'foo': {'I': 'W'}}
+
+ AssertEqual
+ \ [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1, 'linter_name': 'foo'},
+ \ ],
+ \ ale#engine#FixLocList(bufnr(''), 'foo', [
+ \ {'type': 'E', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'E', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'W', 'sub_type': 'style', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ {'type': 'I', 'lnum': 1, 'text': 'x', 'bufnr': bufnr(''), 'col': 0, 'vcol': 0, 'nr': -1},
+ \ ])