#149 - Support Info, style error, and style warning types for problems for signs

This commit is contained in:
w0rp 2017-05-20 23:32:41 +01:00
parent bf8bf06681
commit f92bbab8cf
7 changed files with 169 additions and 19 deletions

View File

@ -124,6 +124,17 @@ function! ale#Var(buffer, variable_name) abort
return getbufvar(str2nr(a:buffer), l:full_name, g:[l:full_name]) return getbufvar(str2nr(a:buffer), l:full_name, g:[l:full_name])
endfunction endfunction
" Initialize a variable with a default value, if it isn't already set.
"
" Every variable name will be prefixed with 'ale_'.
function! ale#Set(variable_name, default) abort
let l:full_name = 'ale_' . a:variable_name
let l:value = get(g:, l:full_name, a:default)
let g:[l:full_name] = l:value
return l:value
endfunction
" Escape a string suitably for each platform. " Escape a string suitably for each platform.
" shellescape does not work on Windows. " shellescape does not work on Windows.
function! ale#Escape(str) abort function! ale#Escape(str) abort

View File

@ -293,6 +293,10 @@ function! ale#engine#FixLocList(buffer, linter, loclist) abort
let l:item.end_col = str2nr(l:old_item.end_col) let l:item.end_col = str2nr(l:old_item.end_col)
endif endif
if has_key(l:old_item, 'sub_type')
let l:item.sub_type = l:old_item.sub_type
endif
if l:item.lnum == 0 if l:item.lnum == 0
" When errors appear at line 0, put them at line 1 instead. " When errors appear at line 0, put them at line 1 instead.
let l:item.lnum = 1 let l:item.lnum = 1

View File

@ -8,15 +8,33 @@ if !hlexists('ALEErrorSign')
highlight link ALEErrorSign error highlight link ALEErrorSign error
endif endif
if !hlexists('ALEStyleErrorSign')
highlight link ALEStyleErrorSign ALEErrorSign
endif
if !hlexists('ALEWarningSign') if !hlexists('ALEWarningSign')
highlight link ALEWarningSign todo highlight link ALEWarningSign todo
endif endif
if !hlexists('ALEStyleWarningSign')
highlight link ALEStyleWarningSign ALEWarningSign
endif
if !hlexists('ALEInfoSign')
highlight link ALEInfoSign ALEWarningSign
endif
" Signs show up on the left for error markers. " Signs show up on the left for error markers.
execute 'sign define ALEErrorSign text=' . g:ale_sign_error execute 'sign define ALEErrorSign text=' . g:ale_sign_error
\ . ' texthl=ALEErrorSign linehl=ALEErrorLine' \ . ' texthl=ALEErrorSign linehl=ALEErrorLine'
execute 'sign define ALEStyleErrorSign text=' . g:ale_sign_style_error
\ . ' texthl=ALEStyleErrorSign linehl=ALEStyleErrorSign'
execute 'sign define ALEWarningSign text=' . g:ale_sign_warning execute 'sign define ALEWarningSign text=' . g:ale_sign_warning
\ . ' texthl=ALEWarningSign linehl=ALEWarningLine' \ . ' texthl=ALEWarningSign linehl=ALEWarningLine'
execute 'sign define ALEStyleWarningSign text=' . g:ale_sign_style_warning
\ . ' texthl=ALEStyleWarningSign linehl=ALEStyleWarningSign'
execute 'sign define ALEInfoSign text=' . g:ale_sign_info
\ . ' texthl=ALEInfoSign linehl=ALEInfoLine'
sign define ALEDummySign sign define ALEDummySign
" Read sign data for a buffer to a list of lines. " Read sign data for a buffer to a list of lines.
@ -36,7 +54,7 @@ function! ale#sign#ParseSigns(line_list) abort
" 行=1 識別子=1000001 名前=ALEWarningSign " 行=1 識別子=1000001 名前=ALEWarningSign
" línea=12 id=1000001 nombre=ALEWarningSign " línea=12 id=1000001 nombre=ALEWarningSign
" riga=1 id=1000001, nome=ALEWarningSign " riga=1 id=1000001, nome=ALEWarningSign
let l:pattern = '^.*=\(\d\+\).*=\(\d\+\).*=ALE\(Error\|Warning\|Dummy\)Sign' let l:pattern = '\v^.*\=(\d+).*\=(\d+).*\=(ALE[a-zA-Z]+Sign)'
let l:result = [] let l:result = []
for l:line in a:line_list for l:line in a:line_list
@ -46,7 +64,7 @@ function! ale#sign#ParseSigns(line_list) abort
call add(l:result, [ call add(l:result, [
\ str2nr(l:match[1]), \ str2nr(l:match[1]),
\ str2nr(l:match[2]), \ str2nr(l:match[2]),
\ 'ALE' . l:match[3] . 'Sign', \ l:match[3],
\]) \])
endif endif
endfor endfor
@ -108,14 +126,40 @@ function! s:SetDummySignIfNeeded(buffer, current_sign_list, new_signs) abort
return l:is_dummy_sign_set return l:is_dummy_sign_set
endfunction endfunction
function! ale#sign#GetSignType(sublist) abort
let l:highest_level = 100
for l:item in a:sublist
let l:level = (l:item.type ==# 'I' ? 2 : l:item.type ==# 'W')
if get(l:item, 'sub_type', '') ==# 'style'
let l:level += 10
endif
if l:level < l:highest_level
let l:highest_level = l:level
endif
endfor
if l:highest_level == 10
return 'ALEStyleErrorSign'
elseif l:highest_level == 11
return 'ALEStyleWarningSign'
elseif l:highest_level == 2
return 'ALEInfoSign'
elseif l:highest_level == 1
return 'ALEWarningSign'
endif
return 'ALEErrorSign'
endfunction
function! s:PlaceNewSigns(buffer, grouped_items) abort function! s:PlaceNewSigns(buffer, grouped_items) abort
" Add the new signs, " Add the new signs,
for l:index in range(0, len(a:grouped_items) - 1) for l:index in range(0, len(a:grouped_items) - 1)
let l:sign_id = l:index + g:ale_sign_offset + 1 let l:sign_id = l:index + g:ale_sign_offset + 1
let l:sublist = a:grouped_items[l:index] let l:sublist = a:grouped_items[l:index]
let l:type = !empty(filter(copy(l:sublist), 'v:val.type ==# ''E''')) let l:type = ale#sign#GetSignType(a:grouped_items[l:index])
\ ? 'ALEErrorSign'
\ : 'ALEWarningSign'
" Save the sign IDs we are setting back on our loclist objects. " Save the sign IDs we are setting back on our loclist objects.
" These IDs will be used to preserve items which are set many times. " These IDs will be used to preserve items which are set many times.

View File

@ -539,12 +539,26 @@ g:ale_set_signs *g:ale_set_signs*
Default: `has('signs')` Default: `has('signs')`
When this option is set to `1`, the |sign| column will be populated with When this option is set to `1`, the |sign| column will be populated with
signs marking where errors and warnings appear in the file. The signs marking where problems appear in the file.
`ALEErrorSign` and `ALEWarningSign` highlight groups will be used to provide
highlighting for the signs. The text used for signs can be customised with ALE will use the following highlight groups for problems:
the |g:ale_sign_error| and |g:ale_sign_warning| options. The `ALEErrorSign`
and `ALEWarningLine` highlight groups will be used to provide highlighting `ALEErrorSign` - Items with `'type': 'E'`
for the lines that the signs reside on. `ALEWarningSign` - Items with `'type': 'W'`
`ALEInfoSign` - Items with `'type': 'I'`
`ALEStyleErrorSign` - Items with `'type': 'E'` and `'sub_type': 'style'`
`ALEStyleWarningSign` - Items with `'type': 'W'` and `'sub_type': 'style'`
The markers for the highlights can be customized with the following options:
|g:ale_sign_error|
|g:ale_sign_warning|
|g:ale_sign_info|
|g:ale_sign_style_error|
|g:ale_sign_style_warning|
When multiple problems exist on the same line, the signs will take
precedence in the order above, from highest to lowest.
g:ale_sign_column_always *g:ale_sign_column_always* g:ale_sign_column_always *g:ale_sign_column_always*
@ -563,9 +577,31 @@ g:ale_sign_error *g:ale_sign_error*
Type: |String| Type: |String|
Default: `'>>'` Default: `'>>'`
This string can be changed to change the characters used for the sign gutter The sign for errors in the sign gutter.
for lines which at least one error on them. Lines with both errors and
warnings on them will show the error marker, as errors take precedence.
g:ale_sign_info *g:ale_sign_info*
Type: |String|
Default: `g:ale_sign_warning`
The sign for "info" markers in the sign gutter.
g:ale_sign_style_error *g:ale_sign_style_error*
Type: |String|
Default: `g:ale_sign_error`
The sign for style errors in the sign gutter.
g:ale_sign_style_warning *g:ale_sign_style_warning*
Type: |String|
Default: `g:ale_sign_warning`
The sign for style warnings in the sign gutter.
g:ale_sign_offset *g:ale_sign_offset* g:ale_sign_offset *g:ale_sign_offset*
@ -587,8 +623,7 @@ g:ale_sign_warning *g:ale_sign_warning*
Type: |String| Type: |String|
Default: `'--'` Default: `'--'`
This string can be changed to change the characters used for the sign gutter The sign for warnings in the sign gutter.
for lines which at least one warning on them.
g:ale_statusline_format *g:ale_statusline_format* g:ale_statusline_format *g:ale_statusline_format*

View File

@ -111,9 +111,12 @@ let g:ale_set_signs = get(g:, 'ale_set_signs', has('signs'))
" This flag can be set to 0 to disable setting error highlights. " This flag can be set to 0 to disable setting error highlights.
let g:ale_set_highlights = get(g:, 'ale_set_highlights', has('syntax')) let g:ale_set_highlights = get(g:, 'ale_set_highlights', has('syntax'))
" These variables dicatate what sign is used to indicate errors and warnings. " These variables dictate what sign is used to indicate errors and warnings.
let g:ale_sign_error = get(g:, 'ale_sign_error', '>>') call ale#Set('sign_error', '>>')
let g:ale_sign_warning = get(g:, 'ale_sign_warning', '--') call ale#Set('sign_style_error', g:ale_sign_error)
call ale#Set('sign_warning', '--')
call ale#Set('sign_style_warning', g:ale_sign_warning)
call ale#Set('sign_info', g:ale_sign_warning)
" This variable sets an offset which can be set for sign IDs. " This variable sets an offset which can be set for sign IDs.
" This ID can be changed depending on what IDs are set for other plugins. " This ID can be changed depending on what IDs are set for other plugins.

View File

@ -71,6 +71,38 @@ After:
call ale#linter#Reset() call ale#linter#Reset()
sign unplace * sign unplace *
Execute(ale#sign#GetSignType should return the right sign types):
AssertEqual 'ALEErrorSign', ale#sign#GetSignType([{'type': 'E'}])
AssertEqual 'ALEStyleErrorSign', ale#sign#GetSignType([{'type': 'E', 'sub_type': 'style'}])
AssertEqual 'ALEWarningSign', ale#sign#GetSignType([{'type': 'W'}])
AssertEqual 'ALEStyleWarningSign', ale#sign#GetSignType([{'type': 'W', 'sub_type': 'style'}])
AssertEqual 'ALEInfoSign', ale#sign#GetSignType([{'type': 'I'}])
AssertEqual 'ALEErrorSign', ale#sign#GetSignType([
\ {'type': 'E'},
\ {'type': 'W'},
\ {'type': 'I'},
\ {'type': 'E', 'sub_type': 'style'},
\ {'type': 'W', 'sub_type': 'style'},
\])
AssertEqual 'ALEWarningSign', ale#sign#GetSignType([
\ {'type': 'W'},
\ {'type': 'I'},
\ {'type': 'E', 'sub_type': 'style'},
\ {'type': 'W', 'sub_type': 'style'},
\])
AssertEqual 'ALEInfoSign', ale#sign#GetSignType([
\ {'type': 'I'},
\ {'type': 'E', 'sub_type': 'style'},
\ {'type': 'W', 'sub_type': 'style'},
\])
AssertEqual 'ALEStyleErrorSign', ale#sign#GetSignType([
\ {'type': 'E', 'sub_type': 'style'},
\ {'type': 'W', 'sub_type': 'style'},
\])
AssertEqual 'ALEStyleWarningSign', ale#sign#GetSignType([
\ {'type': 'W', 'sub_type': 'style'},
\])
Given testft(A file with warnings/errors): Given testft(A file with warnings/errors):
foo foo
bar bar

View File

@ -164,3 +164,24 @@ Execute(FixLocList should pass on col_length values):
\ {'text': 'a', 'lnum': '010', 'col': '011', 'end_col': 12}, \ {'text': 'a', 'lnum': '010', 'col': '011', 'end_col': 12},
\ ], \ ],
\ ) \ )
Execute(FixLocList should allow subtypes to be set):
AssertEqual
\ [
\ {
\ 'text': 'a',
\ 'lnum': 10,
\ 'col': 0,
\ 'bufnr': bufnr('%'),
\ 'vcol': 0,
\ 'type': 'E',
\ 'sub_type': 'style',
\ 'nr': -1,
\ 'linter_name': 'foobar',
\ },
\],
\ ale#engine#FixLocList(
\ bufnr('%'),
\ {'name': 'foobar'},
\ [{'text': 'a', 'lnum': 11, 'sub_type': 'style'}],
\ )