Compare commits
9 commits
Author | SHA1 | Date | |
---|---|---|---|
|
2ee3dcdd62 | ||
|
465db4daa1 | ||
|
fb8c090971 | ||
|
d29e32d42d | ||
|
ab2b181012 | ||
|
033a6c1178 | ||
|
7d66293bbc | ||
|
1fc3a1563b | ||
|
a31f54d08f |
24 changed files with 236 additions and 169 deletions
|
@ -29,7 +29,7 @@ function! ale_linters#cs#mcsc#GetCommand(buffer) abort
|
||||||
\ : ''
|
\ : ''
|
||||||
|
|
||||||
" register temporary module target file with ale
|
" register temporary module target file with ale
|
||||||
let l:out = tempname()
|
let l:out = ale#util#Tempname()
|
||||||
call ale#engine#ManageFile(a:buffer, l:out)
|
call ale#engine#ManageFile(a:buffer, l:out)
|
||||||
|
|
||||||
" The code is compiled as a module and the output is redirected to a
|
" The code is compiled as a module and the output is redirected to a
|
||||||
|
|
|
@ -10,7 +10,7 @@ endfunction
|
||||||
|
|
||||||
function! ale_linters#cuda#nvcc#GetCommand(buffer) abort
|
function! ale_linters#cuda#nvcc#GetCommand(buffer) abort
|
||||||
" Unused: use ale#util#nul_file
|
" Unused: use ale#util#nul_file
|
||||||
" let l:output_file = tempname() . '.ii'
|
" let l:output_file = ale#util#Tempname() . '.ii'
|
||||||
" call ale#engine#ManageFile(a:buffer, l:output_file)
|
" call ale#engine#ManageFile(a:buffer, l:output_file)
|
||||||
|
|
||||||
return ale#Escape(ale_linters#cuda#nvcc#GetExecutable(a:buffer))
|
return ale#Escape(ale_linters#cuda#nvcc#GetExecutable(a:buffer))
|
||||||
|
|
|
@ -128,14 +128,7 @@ function! ale_linters#elm#make#HandleElm018Line(line, output) abort
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale_linters#elm#make#FileIsBuffer(path) abort
|
function! ale_linters#elm#make#FileIsBuffer(path) abort
|
||||||
let l:is_windows = has('win32')
|
return ale#path#IsTempName(a:path)
|
||||||
let l:temp_dir = l:is_windows ? $TMP : $TMPDIR
|
|
||||||
|
|
||||||
if has('win32')
|
|
||||||
return a:path[0:len(l:temp_dir) - 1] is? l:temp_dir
|
|
||||||
else
|
|
||||||
return a:path[0:len(l:temp_dir) - 1] is# l:temp_dir
|
|
||||||
endif
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale_linters#elm#make#ParseMessage(message) abort
|
function! ale_linters#elm#make#ParseMessage(message) abort
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
let g:ale_erlang_erlc_options = get(g:, 'ale_erlang_erlc_options', '')
|
let g:ale_erlang_erlc_options = get(g:, 'ale_erlang_erlc_options', '')
|
||||||
|
|
||||||
function! ale_linters#erlang#erlc#GetCommand(buffer) abort
|
function! ale_linters#erlang#erlc#GetCommand(buffer) abort
|
||||||
let l:output_file = tempname()
|
let l:output_file = ale#util#Tempname()
|
||||||
call ale#engine#ManageFile(a:buffer, l:output_file)
|
call ale#engine#ManageFile(a:buffer, l:output_file)
|
||||||
|
|
||||||
return 'erlc -o ' . ale#Escape(l:output_file)
|
return 'erlc -o ' . ale#Escape(l:output_file)
|
||||||
|
|
|
@ -20,7 +20,7 @@ function! ale_linters#thrift#thrift#GetCommand(buffer) abort
|
||||||
let l:generators = ['cpp']
|
let l:generators = ['cpp']
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let l:output_dir = tempname()
|
let l:output_dir = ale#util#Tempname()
|
||||||
call mkdir(l:output_dir)
|
call mkdir(l:output_dir)
|
||||||
call ale#engine#ManageDirectory(a:buffer, l:output_dir)
|
call ale#engine#ManageDirectory(a:buffer, l:output_dir)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ if !exists('g:ale_verilog_verilator_options')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! ale_linters#verilog#verilator#GetCommand(buffer) abort
|
function! ale_linters#verilog#verilator#GetCommand(buffer) abort
|
||||||
let l:filename = tempname() . '_verilator_linted.v'
|
let l:filename = ale#util#Tempname() . '_verilator_linted.v'
|
||||||
|
|
||||||
" Create a special filename, so we can detect it in the handler.
|
" Create a special filename, so we can detect it in the handler.
|
||||||
call ale#engine#ManageFile(a:buffer, l:filename)
|
call ale#engine#ManageFile(a:buffer, l:filename)
|
||||||
|
|
|
@ -13,7 +13,7 @@ function! s:TemporaryFilename(buffer) abort
|
||||||
|
|
||||||
" Create a temporary filename, <temp_dir>/<original_basename>
|
" Create a temporary filename, <temp_dir>/<original_basename>
|
||||||
" The file itself will not be created by this function.
|
" The file itself will not be created by this function.
|
||||||
return tempname() . (has('win32') ? '\' : '/') . l:filename
|
return ale#util#Tempname() . (has('win32') ? '\' : '/') . l:filename
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Given a command string, replace every...
|
" Given a command string, replace every...
|
||||||
|
|
|
@ -98,7 +98,7 @@ endfunction
|
||||||
|
|
||||||
" Create a new temporary directory and manage it in one go.
|
" Create a new temporary directory and manage it in one go.
|
||||||
function! ale#engine#CreateDirectory(buffer) abort
|
function! ale#engine#CreateDirectory(buffer) abort
|
||||||
let l:temporary_directory = tempname()
|
let l:temporary_directory = ale#util#Tempname()
|
||||||
" Create the temporary directory for the file, unreadable by 'other'
|
" Create the temporary directory for the file, unreadable by 'other'
|
||||||
" users.
|
" users.
|
||||||
call mkdir(l:temporary_directory, '', 0750)
|
call mkdir(l:temporary_directory, '', 0750)
|
||||||
|
@ -221,7 +221,12 @@ function! s:HandleExit(job_id, exit_code) abort
|
||||||
call ale#history#RememberOutput(l:buffer, a:job_id, l:output[:])
|
call ale#history#RememberOutput(l:buffer, a:job_id, l:output[:])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let l:loclist = ale#util#GetFunction(l:linter.callback)(l:buffer, l:output)
|
try
|
||||||
|
let l:loclist = ale#util#GetFunction(l:linter.callback)(l:buffer, l:output)
|
||||||
|
" Handle the function being unknown, or being deleted.
|
||||||
|
catch /E700/
|
||||||
|
let l:loclist = []
|
||||||
|
endtry
|
||||||
|
|
||||||
call ale#engine#HandleLoclist(l:linter.name, l:buffer, l:loclist)
|
call ale#engine#HandleLoclist(l:linter.name, l:buffer, l:loclist)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
" Description: Error handling for the format GHC outputs.
|
" Description: Error handling for the format GHC outputs.
|
||||||
|
|
||||||
" Remember the directory used for temporary files for Vim.
|
" Remember the directory used for temporary files for Vim.
|
||||||
let s:temp_dir = fnamemodify(tempname(), ':h')
|
let s:temp_dir = fnamemodify(ale#util#Tempname(), ':h')
|
||||||
" Build part of a regular expression for matching ALE temporary filenames.
|
" Build part of a regular expression for matching ALE temporary filenames.
|
||||||
let s:temp_regex_prefix =
|
let s:temp_regex_prefix =
|
||||||
\ '\M'
|
\ '\M'
|
||||||
|
|
|
@ -105,11 +105,17 @@ function! ale#lsp#response#GetErrorMessage(response) abort
|
||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Include the traceback as details, if it's there.
|
" Include the traceback or error data as details, if present.
|
||||||
let l:traceback = get(get(a:response.error, 'data', {}), 'traceback', [])
|
let l:error_data = get(a:response.error, 'data', {})
|
||||||
|
|
||||||
if type(l:traceback) is type([]) && !empty(l:traceback)
|
if type(l:error_data) is type('')
|
||||||
let l:message .= "\n" . join(l:traceback, "\n")
|
let l:message .= "\n" . l:error_data
|
||||||
|
else
|
||||||
|
let l:traceback = get(l:error_data, 'traceback', [])
|
||||||
|
|
||||||
|
if type(l:traceback) is type([]) && !empty(l:traceback)
|
||||||
|
let l:message .= "\n" . join(l:traceback, "\n")
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return l:message
|
return l:message
|
||||||
|
|
|
@ -84,7 +84,7 @@ function! ale#path#IsAbsolute(filename) abort
|
||||||
return a:filename[:0] is# '/' || a:filename[1:2] is# ':\'
|
return a:filename[:0] is# '/' || a:filename[1:2] is# ':\'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let s:temp_dir = ale#path#Simplify(fnamemodify(tempname(), ':h'))
|
let s:temp_dir = ale#path#Simplify(fnamemodify(ale#util#Tempname(), ':h'))
|
||||||
|
|
||||||
" Given a filename, return 1 if the file represents some temporary file
|
" Given a filename, return 1 if the file represents some temporary file
|
||||||
" created by Vim.
|
" created by Vim.
|
||||||
|
|
|
@ -45,25 +45,23 @@ if !hlexists('ALESignColumnWithErrors')
|
||||||
highlight link ALESignColumnWithErrors error
|
highlight link ALESignColumnWithErrors error
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
function! ale#sign#SetUpDefaultColumnWithoutErrorsHighlight() abort
|
||||||
|
redir => l:output
|
||||||
|
0verbose silent highlight SignColumn
|
||||||
|
redir end
|
||||||
|
|
||||||
|
let l:highlight_syntax = join(split(l:output)[2:])
|
||||||
|
let l:match = matchlist(l:highlight_syntax, '\vlinks to (.+)$')
|
||||||
|
|
||||||
|
if !empty(l:match)
|
||||||
|
execute 'highlight link ALESignColumnWithoutErrors ' . l:match[1]
|
||||||
|
elseif l:highlight_syntax isnot# 'cleared'
|
||||||
|
execute 'highlight ALESignColumnWithoutErrors ' . l:highlight_syntax
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
if !hlexists('ALESignColumnWithoutErrors')
|
if !hlexists('ALESignColumnWithoutErrors')
|
||||||
function! s:SetSignColumnWithoutErrorsHighlight() abort
|
call ale#sign#SetUpDefaultColumnWithoutErrorsHighlight()
|
||||||
redir => l:output
|
|
||||||
silent highlight SignColumn
|
|
||||||
redir end
|
|
||||||
|
|
||||||
let l:highlight_syntax = join(split(l:output)[2:])
|
|
||||||
|
|
||||||
let l:match = matchlist(l:highlight_syntax, '\vlinks to (.+)$')
|
|
||||||
|
|
||||||
if !empty(l:match)
|
|
||||||
execute 'highlight link ALESignColumnWithoutErrors ' . l:match[1]
|
|
||||||
elseif l:highlight_syntax isnot# 'cleared'
|
|
||||||
execute 'highlight ALESignColumnWithoutErrors ' . l:highlight_syntax
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call s:SetSignColumnWithoutErrorsHighlight()
|
|
||||||
delfunction s:SetSignColumnWithoutErrorsHighlight
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Signs show up on the left for error markers.
|
" Signs show up on the left for error markers.
|
||||||
|
|
|
@ -268,9 +268,8 @@ endfunction
|
||||||
" See :help sandbox
|
" See :help sandbox
|
||||||
function! ale#util#InSandbox() abort
|
function! ale#util#InSandbox() abort
|
||||||
try
|
try
|
||||||
function! s:SandboxCheck() abort
|
let &equalprg=&equalprg
|
||||||
endfunction
|
catch /E48/
|
||||||
catch /^Vim\%((\a\+)\)\=:E48/
|
|
||||||
" E48 is the sandbox error.
|
" E48 is the sandbox error.
|
||||||
return 1
|
return 1
|
||||||
endtry
|
endtry
|
||||||
|
@ -278,6 +277,25 @@ function! ale#util#InSandbox() abort
|
||||||
return 0
|
return 0
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! ale#util#Tempname() abort
|
||||||
|
let l:clear_tempdir = 0
|
||||||
|
|
||||||
|
if exists('$TMPDIR') && empty($TMPDIR)
|
||||||
|
let l:clear_tempdir = 1
|
||||||
|
let $TMPDIR = '/tmp'
|
||||||
|
endif
|
||||||
|
|
||||||
|
try
|
||||||
|
let l:name = tempname() " no-custom-checks
|
||||||
|
finally
|
||||||
|
if l:clear_tempdir
|
||||||
|
let $TMPDIR = ''
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
|
||||||
|
return l:name
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Given a single line, or a List of lines, and a single pattern, or a List
|
" Given a single line, or a List of lines, and a single pattern, or a List
|
||||||
" of patterns, return all of the matches for the lines(s) from the given
|
" of patterns, return all of the matches for the lines(s) from the given
|
||||||
" patterns, using matchlist().
|
" patterns, using matchlist().
|
||||||
|
|
|
@ -111,6 +111,9 @@ these are reported with ALE's `custom-linting-rules` script. See
|
||||||
* Don't use the `shellescape()` function. It doesn't escape arguments properly
|
* Don't use the `shellescape()` function. It doesn't escape arguments properly
|
||||||
on Windows. Use `ale#Escape()` instead, which will avoid escaping where it
|
on Windows. Use `ale#Escape()` instead, which will avoid escaping where it
|
||||||
isn't needed, and generally escape arguments better on Windows.
|
isn't needed, and generally escape arguments better on Windows.
|
||||||
|
* Don't use the `tempname()` function. It doesn't work when `$TMPDIR` isn't
|
||||||
|
set. Use `ale#util#Tempname()` instead, which temporarily sets `$TMPDIR`
|
||||||
|
appropriately where needed.
|
||||||
|
|
||||||
Apply the following guidelines when writing Vader test files.
|
Apply the following guidelines when writing Vader test files.
|
||||||
|
|
||||||
|
|
13
doc/ale.txt
13
doc/ale.txt
|
@ -1401,8 +1401,7 @@ g:ale_set_balloons *g:ale_set_balloons*
|
||||||
*b:ale_set_balloons*
|
*b:ale_set_balloons*
|
||||||
|
|
||||||
Type: |Number|
|
Type: |Number|
|
||||||
Default: `(has('balloon_eval') && has('gui_running'))`
|
Default: `has('balloon_eval') && has('gui_running')`
|
||||||
`|| (has('balloon_eval_term') && !has('gui_running'))`
|
|
||||||
|
|
||||||
When this option is set to `1`, balloon messages will be displayed for
|
When this option is set to `1`, balloon messages will be displayed for
|
||||||
problems or hover information if available.
|
problems or hover information if available.
|
||||||
|
@ -1412,6 +1411,12 @@ g:ale_set_balloons *g:ale_set_balloons*
|
||||||
supporting "Hover" information, per |ale-hover|, then brief information
|
supporting "Hover" information, per |ale-hover|, then brief information
|
||||||
about the symbol under the cursor will be displayed in a balloon.
|
about the symbol under the cursor will be displayed in a balloon.
|
||||||
|
|
||||||
|
Balloons can be enabled for terminal versions of Vim that support balloons,
|
||||||
|
but some versions of Vim will produce strange mouse behavior when balloons
|
||||||
|
are enabled. To configure balloons for your terminal, you should first
|
||||||
|
configure your |ttymouse| setting, and then consider setting
|
||||||
|
`g:ale_set_balloons` to `1` before ALE is loaded.
|
||||||
|
|
||||||
`b:ale_set_balloons` can be set to `0` to disable balloons for a buffer.
|
`b:ale_set_balloons` can be set to `0` to disable balloons for a buffer.
|
||||||
Balloons cannot be enabled for a specific buffer when not initially enabled
|
Balloons cannot be enabled for a specific buffer when not initially enabled
|
||||||
globally.
|
globally.
|
||||||
|
@ -2206,6 +2211,10 @@ ale#linter#Define(filetype, linter) *ale#linter#Define()*
|
||||||
defined, as LSP linters handle diagnostics
|
defined, as LSP linters handle diagnostics
|
||||||
automatically. See |ale-lsp-linters|.
|
automatically. See |ale-lsp-linters|.
|
||||||
|
|
||||||
|
If the function named does not exist, including if
|
||||||
|
the function is later deleted, ALE will behave as if
|
||||||
|
the callback returned an empty list.
|
||||||
|
|
||||||
The keys for each item in the List will be handled in
|
The keys for each item in the List will be handled in
|
||||||
the following manner:
|
the following manner:
|
||||||
*ale-loclist-format*
|
*ale-loclist-format*
|
||||||
|
|
|
@ -35,12 +35,6 @@ endif
|
||||||
" Set this flag so that other plugins can use it, like airline.
|
" Set this flag so that other plugins can use it, like airline.
|
||||||
let g:loaded_ale = 1
|
let g:loaded_ale = 1
|
||||||
|
|
||||||
" Set the TMPDIR environment variable if it is not set automatically.
|
|
||||||
" This can automatically fix some environments.
|
|
||||||
if has('unix') && empty($TMPDIR)
|
|
||||||
let $TMPDIR = '/tmp'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" This global variable is used internally by ALE for tracking information for
|
" This global variable is used internally by ALE for tracking information for
|
||||||
" each buffer which linters are being run against.
|
" each buffer which linters are being run against.
|
||||||
let g:ale_buffer_info = {}
|
let g:ale_buffer_info = {}
|
||||||
|
@ -114,10 +108,7 @@ let g:ale_set_highlights = get(g:, 'ale_set_highlights', has('syntax'))
|
||||||
let g:ale_echo_cursor = get(g:, 'ale_echo_cursor', 1)
|
let g:ale_echo_cursor = get(g:, 'ale_echo_cursor', 1)
|
||||||
|
|
||||||
" This flag can be set to 0 to disable balloon support.
|
" This flag can be set to 0 to disable balloon support.
|
||||||
let g:ale_set_balloons = get(g:, 'ale_set_balloons',
|
let g:ale_set_balloons = get(g:, 'ale_set_balloons', has('balloon_eval') && has('gui_running'))
|
||||||
\ (has('balloon_eval') && has('gui_running'))
|
|
||||||
\ || (has('balloon_eval_term') && !has('gui_running'))
|
|
||||||
\)
|
|
||||||
|
|
||||||
" This flag can be set to 0 to disable warnings for trailing whitespace
|
" This flag can be set to 0 to disable warnings for trailing whitespace
|
||||||
let g:ale_warn_about_trailing_whitespace = get(g:, 'ale_warn_about_trailing_whitespace', 1)
|
let g:ale_warn_about_trailing_whitespace = get(g:, 'ale_warn_about_trailing_whitespace', 1)
|
||||||
|
|
|
@ -11,10 +11,9 @@ set -u
|
||||||
|
|
||||||
image=w0rp/ale
|
image=w0rp/ale
|
||||||
current_image_id=71553d0ab3e8
|
current_image_id=71553d0ab3e8
|
||||||
current_digest=sha256:fea0ddf220c080af9d615d86c277cdecbd63682e430cba92fff2014ebf2a5f3a
|
|
||||||
|
|
||||||
# Used in all test scripts for running the selected Docker image.
|
# Used in all test scripts for running the selected Docker image.
|
||||||
DOCKER_RUN_IMAGE="$image:$current_image_id"
|
DOCKER_RUN_IMAGE="$image"
|
||||||
export DOCKER_RUN_IMAGE
|
export DOCKER_RUN_IMAGE
|
||||||
|
|
||||||
tests='test/*.vader test/*/*.vader test/*/*/*.vader test/*/*/*.vader'
|
tests='test/*.vader test/*/*.vader test/*/*/*.vader test/*/*/*.vader'
|
||||||
|
@ -110,7 +109,8 @@ fi
|
||||||
# Delete .swp files in the test directory, which cause Vim 8 to hang.
|
# Delete .swp files in the test directory, which cause Vim 8 to hang.
|
||||||
find test -name '*.swp' -delete
|
find test -name '*.swp' -delete
|
||||||
|
|
||||||
docker pull "$image"@"$current_digest"
|
docker images -q w0rp/ale | grep "^$current_image_id" > /dev/null \
|
||||||
|
|| docker pull "$image"
|
||||||
|
|
||||||
output_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
|
output_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
Before:
|
Before:
|
||||||
let b:tmp = has('win32') ? substitute($TMP, '\\', '\\\\', 'g') : $TMPDIR
|
|
||||||
|
|
||||||
runtime ale_linters/elm/make.vim
|
runtime ale_linters/elm/make.vim
|
||||||
|
|
||||||
After:
|
After:
|
||||||
unlet! b:tmp
|
|
||||||
unlet! g:config_error_lines
|
unlet! g:config_error_lines
|
||||||
|
|
||||||
call ale#linter#Reset()
|
call ale#linter#Reset()
|
||||||
|
@ -22,12 +19,12 @@ Execute(The elm-make handler should parse Elm 0.19 general problems correctly):
|
||||||
\ }
|
\ }
|
||||||
\ ],
|
\ ],
|
||||||
\ ale_linters#elm#make#Handle(347, [
|
\ ale_linters#elm#make#Handle(347, [
|
||||||
\ '{
|
\ json_encode({
|
||||||
\ "type": "error",
|
\ 'type': 'error',
|
||||||
\ "path": "' . b:tmp . '/Module.elm",
|
\ 'path': ale#util#Tempname() . '/Module.elm',
|
||||||
\ "title": "UNKNOWN IMPORT",
|
\ 'title': 'UNKNOWN IMPORT',
|
||||||
\ "message": ["error details\n\n", { "string": "styled details" }]
|
\ 'message': ["error details\n\n", { 'string': 'styled details' }]
|
||||||
\ }'
|
\ }),
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
Execute(The elm-make handler should parse Elm 0.19 compilation errors correctly):
|
Execute(The elm-make handler should parse Elm 0.19 compilation errors correctly):
|
||||||
|
@ -47,7 +44,7 @@ Execute(The elm-make handler should parse Elm 0.19 compilation errors correctly)
|
||||||
\ 'end_lnum': 407,
|
\ 'end_lnum': 407,
|
||||||
\ 'end_col': 17,
|
\ 'end_col': 17,
|
||||||
\ 'type': 'E',
|
\ 'type': 'E',
|
||||||
\ 'text': "error details 2",
|
\ 'text': 'error details 2',
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ 'lnum': 406,
|
\ 'lnum': 406,
|
||||||
|
@ -55,35 +52,35 @@ Execute(The elm-make handler should parse Elm 0.19 compilation errors correctly)
|
||||||
\ 'end_lnum': 406,
|
\ 'end_lnum': 406,
|
||||||
\ 'end_col': 93,
|
\ 'end_col': 93,
|
||||||
\ 'type': 'E',
|
\ 'type': 'E',
|
||||||
\ 'text': "error details 3",
|
\ 'text': 'error details 3',
|
||||||
\ },
|
\ },
|
||||||
\ ],
|
\ ],
|
||||||
\ ale_linters#elm#make#Handle(347, [
|
\ ale_linters#elm#make#Handle(347, [
|
||||||
\ '{
|
\ json_encode({
|
||||||
\ "type": "compile-errors",
|
\ 'type': 'compile-errors',
|
||||||
\ "errors": [
|
\ 'errors': [
|
||||||
\ {
|
\ {
|
||||||
\ "path": "' . b:tmp . '/Module.elm",
|
\ 'path': ale#util#Tempname() . '/Module.elm',
|
||||||
\ "problems": [
|
\ 'problems': [
|
||||||
\ {
|
\ {
|
||||||
\ "title": "TYPE MISMATCH",
|
\ 'title': 'TYPE MISMATCH',
|
||||||
\ "message": ["error details 1\n\n", { "string": "styled details" }],
|
\ 'message': ["error details 1\n\n", { 'string': 'styled details' }],
|
||||||
\ "region": { "start": { "line": 404, "column": 1 }, "end": { "line": 408, "column": 18 } }
|
\ 'region': { 'start': { 'line': 404, 'column': 1 }, 'end': { 'line': 408, 'column': 18 } }
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ "title": "TYPE MISMATCH",
|
\ 'title': 'TYPE MISMATCH',
|
||||||
\ "message": ["error details 2"],
|
\ 'message': ['error details 2'],
|
||||||
\ "region": { "start": {"line": 406, "column": 5}, "end": {"line": 407, "column": 17 } }
|
\ 'region': { 'start': {'line': 406, 'column': 5}, 'end': {'line': 407, 'column': 17 } }
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ "title": "TYPE MISMATCH",
|
\ 'title': 'TYPE MISMATCH',
|
||||||
\ "message": ["error details 3"],
|
\ 'message': ['error details 3'],
|
||||||
\ "region": { "start": { "line": 406, "column": 5}, "end": {"line": 406, "column": 93 } }
|
\ 'region': { 'start': { 'line': 406, 'column': 5}, 'end': {'line': 406, 'column': 93 } }
|
||||||
\ }
|
\ }
|
||||||
\ ]
|
\ ]
|
||||||
\ }
|
\ }
|
||||||
\ ]
|
\ ]
|
||||||
\ }'
|
\ }),
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
Execute(The elm-make handler should handle errors in Elm 0.19 imported modules):
|
Execute(The elm-make handler should handle errors in Elm 0.19 imported modules):
|
||||||
|
@ -109,33 +106,33 @@ Execute(The elm-make handler should handle errors in Elm 0.19 imported modules):
|
||||||
\ },
|
\ },
|
||||||
\ ],
|
\ ],
|
||||||
\ ale_linters#elm#make#Handle(347, [
|
\ ale_linters#elm#make#Handle(347, [
|
||||||
\ '{
|
\ json_encode({
|
||||||
\ "type": "error",
|
\ 'type': 'error',
|
||||||
\ "path": "src/Module.elm",
|
\ 'path': 'src/Module.elm',
|
||||||
\ "title": "UNKNOWN IMPORT",
|
\ 'title': 'UNKNOWN IMPORT',
|
||||||
\ "message": ["error details\n\n", { "string": "styled details" }]
|
\ 'message': ["error details\n\n", { 'string': 'styled details' }]
|
||||||
\ }',
|
\ }),
|
||||||
\ '{
|
\ json_encode({
|
||||||
\ "type": "error",
|
\ 'type': 'error',
|
||||||
\ "path": null,
|
\ 'path': v:null,
|
||||||
\ "title": "UNKNOWN IMPORT",
|
\ 'title': 'UNKNOWN IMPORT',
|
||||||
\ "message": ["error details\n\n", { "string": "styled details" }]
|
\ 'message': ["error details\n\n", { 'string': 'styled details' }]
|
||||||
\ }',
|
\ }),
|
||||||
\ '{
|
\ json_encode({
|
||||||
\ "type": "compile-errors",
|
\ 'type': 'compile-errors',
|
||||||
\ "errors": [
|
\ 'errors': [
|
||||||
\ {
|
\ {
|
||||||
\ "path": "src/Module.elm",
|
\ 'path': 'src/Module.elm',
|
||||||
\ "problems": [
|
\ 'problems': [
|
||||||
\ {
|
\ {
|
||||||
\ "title": "TYPE MISMATCH",
|
\ 'title': 'TYPE MISMATCH',
|
||||||
\ "message": ["error details\n\n", { "string": "styled details" }],
|
\ 'message': ["error details\n\n", { 'string': 'styled details' }],
|
||||||
\ "region": { "start": { "line": 404, "column": 1 }, "end": { "line": 408, "column": 18 } }
|
\ 'region': { 'start': { 'line': 404, 'column': 1 }, 'end': { 'line': 408, 'column': 18 } }
|
||||||
\ }
|
\ }
|
||||||
\ ]
|
\ ]
|
||||||
\ }
|
\ }
|
||||||
\ ]
|
\ ]
|
||||||
\ }'
|
\ }),
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
|
|
||||||
|
@ -182,45 +179,45 @@ Execute(The elm-make handler should parse Elm 0.18 compilation errors correctly)
|
||||||
\ },
|
\ },
|
||||||
\ ],
|
\ ],
|
||||||
\ ale_linters#elm#make#Handle(347, [
|
\ ale_linters#elm#make#Handle(347, [
|
||||||
\ '[
|
\ json_encode([
|
||||||
\ {
|
\ {
|
||||||
\ "tag": "unused import",
|
\ 'tag': 'unused import',
|
||||||
\ "overview": "warning overview",
|
\ 'overview': 'warning overview',
|
||||||
\ "details": "warning details",
|
\ 'details': 'warning details',
|
||||||
\ "region": {"start": { "line": 33, "column": 1 }, "end": { "line": 33, "column": 19 } },
|
\ 'region': {'start': { 'line': 33, 'column': 1 }, 'end': { 'line': 33, 'column': 19 } },
|
||||||
\ "type": "warning",
|
\ 'type': 'warning',
|
||||||
\ "file": "' . b:tmp . '/Module.elm"
|
\ 'file': ale#util#Tempname() . '/Module.elm',
|
||||||
\ }
|
\ }
|
||||||
\ ]',
|
\ ]),
|
||||||
\ '[
|
\ json_encode([
|
||||||
\ {
|
\ {
|
||||||
\ "tag": "TYPE MISMATCH",
|
\ 'tag': 'TYPE MISMATCH',
|
||||||
\ "overview": "error overview 1",
|
\ 'overview': 'error overview 1',
|
||||||
\ "subregion": { "start": { "line": 406, "column": 5 }, "end": { "line": 408, "column": 18 } },
|
\ 'subregion': { 'start': { 'line': 406, 'column': 5 }, 'end': { 'line': 408, 'column': 18 } },
|
||||||
\ "details": "error details 1",
|
\ 'details': 'error details 1',
|
||||||
\ "region": { "start": { "line": 404, "column": 1 }, "end": { "line": 408, "column": 18 } },
|
\ 'region': { 'start': { 'line': 404, 'column': 1 }, 'end': { 'line': 408, 'column': 18 } },
|
||||||
\ "type": "error",
|
\ 'type': 'error',
|
||||||
\ "file":"' . b:tmp . '/Module.elm"
|
\ 'file': ale#util#Tempname() . '/Module.elm',
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ "tag": "TYPE MISMATCH",
|
\ 'tag': 'TYPE MISMATCH',
|
||||||
\ "overview": "error overview 2",
|
\ 'overview': 'error overview 2',
|
||||||
\ "subregion": { "start": { "line": 407, "column": 12 }, "end": { "line": 407, "column": 17 } },
|
\ 'subregion': { 'start': { 'line': 407, 'column': 12 }, 'end': { 'line': 407, 'column': 17 } },
|
||||||
\ "details": "error details 2",
|
\ 'details': 'error details 2',
|
||||||
\ "region": { "start": { "line": 406, "column": 5}, "end": { "line": 407, "column": 17 } },
|
\ 'region': { 'start': { 'line': 406, 'column': 5}, 'end': { 'line': 407, 'column': 17 } },
|
||||||
\ "type":"error",
|
\ 'type':'error',
|
||||||
\ "file":"' . b:tmp . '/Module.elm"
|
\ 'file': ale#util#Tempname() . '/Module.elm',
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ "tag": "TYPE MISMATCH",
|
\ 'tag': 'TYPE MISMATCH',
|
||||||
\ "overview": "error overview 3",
|
\ 'overview': 'error overview 3',
|
||||||
\ "subregion": { "start": { "line": 406, "column": 88 }, "end": { "line": 406, "column": 93 } },
|
\ 'subregion': { 'start': { 'line': 406, 'column': 88 }, 'end': { 'line': 406, 'column': 93 } },
|
||||||
\ "details": "error details 3",
|
\ 'details': 'error details 3',
|
||||||
\ "region": { "start": { "line": 406, "column": 5 }, "end": { "line": 406, "column": 93 } },
|
\ 'region': { 'start': { 'line': 406, 'column': 5 }, 'end': { 'line': 406, 'column': 93 } },
|
||||||
\ "type":"error",
|
\ 'type':'error',
|
||||||
\ "file":"' . b:tmp . '/Module.elm"
|
\ 'file': ale#util#Tempname() . '/Module.elm',
|
||||||
\ }
|
\ }
|
||||||
\ ]'
|
\ ]),
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
Execute(The elm-make handler should handle errors in Elm 0.18 imported modules):
|
Execute(The elm-make handler should handle errors in Elm 0.18 imported modules):
|
||||||
|
@ -229,29 +226,29 @@ Execute(The elm-make handler should handle errors in Elm 0.18 imported modules):
|
||||||
\ {
|
\ {
|
||||||
\ 'lnum': 1,
|
\ 'lnum': 1,
|
||||||
\ 'type': 'E',
|
\ 'type': 'E',
|
||||||
\ 'text': "src/Module.elm:33 - error overview",
|
\ 'text': 'src/Module.elm:33 - error overview',
|
||||||
\ 'detail': "src/Module.elm:33 ----------\n\nerror overview\n\nerror details"
|
\ 'detail': "src/Module.elm:33 ----------\n\nerror overview\n\nerror details"
|
||||||
\ }
|
\ }
|
||||||
\ ],
|
\ ],
|
||||||
\ ale_linters#elm#make#Handle(347, [
|
\ ale_linters#elm#make#Handle(347, [
|
||||||
\ '[
|
\ json_encode([
|
||||||
\ {
|
\ {
|
||||||
\ "tag": "unused import",
|
\ 'tag': 'unused import',
|
||||||
\ "overview": "warning overview",
|
\ 'overview': 'warning overview',
|
||||||
\ "details": "warning details",
|
\ 'details': 'warning details',
|
||||||
\ "region": {"start": { "line": 33, "column": 1 }, "end": { "line": 33, "column": 19 } },
|
\ 'region': {'start': { 'line': 33, 'column': 1 }, 'end': { 'line': 33, 'column': 19 } },
|
||||||
\ "type": "warning",
|
\ 'type': 'warning',
|
||||||
\ "file": "src/Module.elm"
|
\ 'file': 'src/Module.elm',
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ "tag": "type error",
|
\ 'tag': 'type error',
|
||||||
\ "overview": "error overview",
|
\ 'overview': 'error overview',
|
||||||
\ "details": "error details",
|
\ 'details': 'error details',
|
||||||
\ "region": {"start": { "line": 33, "column": 1 }, "end": { "line": 33, "column": 19 } },
|
\ 'region': {'start': { 'line': 33, 'column': 1 }, 'end': { 'line': 33, 'column': 19 } },
|
||||||
\ "type": "error",
|
\ 'type': 'error',
|
||||||
\ "file": "src/Module.elm"
|
\ 'file': 'src/Module.elm',
|
||||||
\ }
|
\ }
|
||||||
\ ]',
|
\ ]),
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
" Generic
|
" Generic
|
||||||
|
@ -275,21 +272,21 @@ Execute(The elm-make handler should put an error on the first line if a line can
|
||||||
\ },
|
\ },
|
||||||
\ ],
|
\ ],
|
||||||
\ ale_linters#elm#make#Handle(347, [
|
\ ale_linters#elm#make#Handle(347, [
|
||||||
\ '{
|
\ json_encode({
|
||||||
\ "type": "compile-errors",
|
\ 'type': 'compile-errors',
|
||||||
\ "errors": [
|
\ 'errors': [
|
||||||
\ {
|
\ {
|
||||||
\ "path": "' . b:tmp . '/Module.elm",
|
\ 'path': ale#util#Tempname() . '/Module.elm',
|
||||||
\ "problems": [
|
\ 'problems': [
|
||||||
\ {
|
\ {
|
||||||
\ "title": "TYPE MISMATCH",
|
\ 'title': 'TYPE MISMATCH',
|
||||||
\ "message": ["error details 1\n\n", { "string": "styled details" }],
|
\ 'message': ["error details 1\n\n", { 'string': 'styled details' }],
|
||||||
\ "region": { "start": { "line": 404, "column": 1 }, "end": { "line": 408, "column": 18 } }
|
\ 'region': { 'start': { 'line': 404, 'column': 1 }, 'end': { 'line': 408, 'column': 18 } }
|
||||||
\ }
|
\ }
|
||||||
\ ]
|
\ ]
|
||||||
\ }
|
\ }
|
||||||
\ ]
|
\ ]
|
||||||
\ }',
|
\ }),
|
||||||
\ 'Not JSON',
|
\ 'Not JSON',
|
||||||
\ 'Also not JSON',
|
\ 'Also not JSON',
|
||||||
\ ])
|
\ ])
|
||||||
|
|
|
@ -63,3 +63,12 @@ Execute(Messages with tracebacks should be handled):
|
||||||
\ },
|
\ },
|
||||||
\ },
|
\ },
|
||||||
\})
|
\})
|
||||||
|
|
||||||
|
Execute(Messages with string data should be handled):
|
||||||
|
AssertEqual "xyz\nUncaught Exception", ale#lsp#response#GetErrorMessage({
|
||||||
|
\ 'error': {
|
||||||
|
\ 'code': -32602,
|
||||||
|
\ 'message': 'xyz',
|
||||||
|
\ 'data': 'Uncaught Exception',
|
||||||
|
\ },
|
||||||
|
\})
|
||||||
|
|
|
@ -87,6 +87,7 @@ check_errors $'\t' 'Use four spaces, not tabs'
|
||||||
check_errors 'let g:ale_\w\+_\w\+_args =' 'Name your option g:ale_<filetype>_<lintername>_options instead'
|
check_errors 'let g:ale_\w\+_\w\+_args =' 'Name your option g:ale_<filetype>_<lintername>_options instead'
|
||||||
check_errors 'shellescape(' 'Use ale#Escape instead of shellescape'
|
check_errors 'shellescape(' 'Use ale#Escape instead of shellescape'
|
||||||
check_errors 'simplify(' 'Use ale#path#Simplify instead of simplify'
|
check_errors 'simplify(' 'Use ale#path#Simplify instead of simplify'
|
||||||
|
check_errors 'tempname(' 'Use ale#util#Tempname instead of tempname'
|
||||||
check_errors "expand(['\"]%" "Use expand('#' . a:buffer . '...') instead. You might get a filename for the wrong buffer."
|
check_errors "expand(['\"]%" "Use expand('#' . a:buffer . '...') instead. You might get a filename for the wrong buffer."
|
||||||
check_errors 'getcwd()' "Do not use getcwd(), as it could run from the wrong buffer. Use expand('#' . a:buffer . ':p:h') instead."
|
check_errors 'getcwd()' "Do not use getcwd(), as it could run from the wrong buffer. Use expand('#' . a:buffer . ':p:h') instead."
|
||||||
check_errors '==#' "Use 'is#' instead of '==#'. 0 ==# 'foobar' is true"
|
check_errors '==#' "Use 'is#' instead of '==#'. 0 ==# 'foobar' is true"
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
Before:
|
Before:
|
||||||
Save g:ale_change_sign_column_color
|
Save g:ale_change_sign_column_color
|
||||||
|
Save &verbose
|
||||||
|
|
||||||
function! ParseHighlight(name) abort
|
function! ParseHighlight(name) abort
|
||||||
redir => l:output
|
redir => l:output
|
||||||
silent execute 'highlight ' . a:name
|
silent execute 'highlight ' . a:name
|
||||||
redir end
|
redir end
|
||||||
|
|
||||||
return join(split(l:output)[2:])
|
return substitute(join(split(l:output)[2:]), ' Last set.*', '', '')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! SetHighlight(name, syntax) abort
|
function! SetHighlight(name, syntax) abort
|
||||||
|
@ -53,3 +54,15 @@ Execute(The SignColumn highlight should be set and reset):
|
||||||
|
|
||||||
call ale#sign#SetSigns(bufnr(''), [])
|
call ale#sign#SetSigns(bufnr(''), [])
|
||||||
AssertEqual 'links to ALESignColumnWithoutErrors', ParseHighlight('SignColumn')
|
AssertEqual 'links to ALESignColumnWithoutErrors', ParseHighlight('SignColumn')
|
||||||
|
|
||||||
|
Execute(The SignColumn should be correctly parsed when verbose=1):
|
||||||
|
set verbose=1
|
||||||
|
highlight SignColumn ctermfg=246 ctermbg=7 guifg=#839496 guibg=Grey
|
||||||
|
|
||||||
|
call ale#sign#SetUpDefaultColumnWithoutErrorsHighlight()
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ has('nvim')
|
||||||
|
\ ? 'ctermfg=246 ctermbg=7 guifg=#839496 guibg=Grey'
|
||||||
|
\ : 'term=standout ctermfg=246 ctermbg=7 guifg=#839496 guibg=Grey',
|
||||||
|
\ ParseHighlight('ALESignColumnWithoutErrors')
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
Execute($TMPDIR should be set to a default value if unset):
|
|
||||||
if has('unix')
|
|
||||||
AssertEqual '/tmp', $TMPDIR
|
|
||||||
endif
|
|
32
test/test_tmpdir_wrapper.vader
Normal file
32
test/test_tmpdir_wrapper.vader
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
Before:
|
||||||
|
let g:exists = exists('$TMPDIR')
|
||||||
|
let g:old_value = $TMPDIR
|
||||||
|
|
||||||
|
After:
|
||||||
|
if g:exists
|
||||||
|
let $TMPDIR = g:old_value
|
||||||
|
else
|
||||||
|
silent! unlet! $TMPDIR
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! g:exists
|
||||||
|
unlet! g:old_value
|
||||||
|
|
||||||
|
Execute(ale#util#Tempname shouldn't set $TMPDIR to an empty string if it isn't set):
|
||||||
|
" You can't run this test twice on old Vim versions.
|
||||||
|
if has('unix')
|
||||||
|
Assert ale#util#Tempname() =~# '^/tmp'
|
||||||
|
Assert !exists('$TMPDIR'), '$TMPDIR exists where it shouldn''t'
|
||||||
|
endif
|
||||||
|
|
||||||
|
Execute(ale#util#Tempname shouldn't replace $TMPDIR and reset them to an empty string.):
|
||||||
|
if has('unix')
|
||||||
|
let $TMPDIR = ''
|
||||||
|
Assert ale#util#Tempname() =~# '^/tmp'
|
||||||
|
|
||||||
|
if !has('nvim')
|
||||||
|
Assert exists('$TMPDIR'), '$TMPDIR doesn''t exist where it should'
|
||||||
|
endif
|
||||||
|
|
||||||
|
AssertEqual '', $TMPDIR
|
||||||
|
endif
|
|
@ -35,7 +35,3 @@ set ttimeoutlen=0
|
||||||
execute 'set encoding=utf-8'
|
execute 'set encoding=utf-8'
|
||||||
|
|
||||||
let g:mapleader=','
|
let g:mapleader=','
|
||||||
|
|
||||||
" Clear the TMPDIR value for tests.
|
|
||||||
" The plugin should set this to /tmp by default, which we will test.
|
|
||||||
let $TMPDIR = ''
|
|
||||||
|
|
Reference in a new issue