From 2381b7afe8e384fee833e543a24e74469aba622e Mon Sep 17 00:00:00 2001 From: w0rp Date: Tue, 2 Jan 2018 13:36:20 +0000 Subject: [PATCH 1/4] Merge pull request #1254 from bkhl/master Don't use temporary file for rustfmt fixer --- autoload/ale/fixers/rustfmt.vim | 4 +--- test/fixers/test_rustfmt_fixer_callback.vader | 8 ++------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/autoload/ale/fixers/rustfmt.vim b/autoload/ale/fixers/rustfmt.vim index fb5ac61..38882fb 100644 --- a/autoload/ale/fixers/rustfmt.vim +++ b/autoload/ale/fixers/rustfmt.vim @@ -10,8 +10,6 @@ function! ale#fixers#rustfmt#Fix(buffer) abort return { \ 'command': ale#Escape(l:executable) - \ . (empty(l:options) ? '' : ' ' . l:options) - \ . ' %t', - \ 'read_temporary_file': 1, + \ . (empty(l:options) ? '' : ' ' . l:options), \} endfunction diff --git a/test/fixers/test_rustfmt_fixer_callback.vader b/test/fixers/test_rustfmt_fixer_callback.vader index 36dd58a..95c78de 100644 --- a/test/fixers/test_rustfmt_fixer_callback.vader +++ b/test/fixers/test_rustfmt_fixer_callback.vader @@ -18,9 +18,7 @@ Execute(The rustfmt callback should return the correct default values): AssertEqual \ { - \ 'read_temporary_file': 1, - \ 'command': ale#Escape('xxxinvalid') - \ . ' %t', + \ 'command': ale#Escape('xxxinvalid'), \ }, \ ale#fixers#rustfmt#Fix(bufnr('')) @@ -30,9 +28,7 @@ Execute(The rustfmt callback should include custom rustfmt options): AssertEqual \ { - \ 'read_temporary_file': 1, \ 'command': ale#Escape('xxxinvalid') - \ . ' ' . g:ale_rust_rustfmt_options - \ . ' %t', + \ . ' ' . g:ale_rust_rustfmt_options, \ }, \ ale#fixers#rustfmt#Fix(bufnr('')) From 80e973a29e930b894b5841ae24568e32bcc8a795 Mon Sep 17 00:00:00 2001 From: w0rp Date: Fri, 12 Jan 2018 12:09:30 +0000 Subject: [PATCH 2/4] Merge pull request #1256 from jonatanolofsson/master Fix #1255: Move extra clang-check args to before user options --- ale_linters/cpp/clangcheck.vim | 2 +- .../test_cpp_clangcheck_command_callbacks.vader | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ale_linters/cpp/clangcheck.vim b/ale_linters/cpp/clangcheck.vim index 4b6169c..a109d5d 100644 --- a/ale_linters/cpp/clangcheck.vim +++ b/ale_linters/cpp/clangcheck.vim @@ -24,9 +24,9 @@ function! ale_linters#cpp#clangcheck#GetCommand(buffer) abort " detected. return ale#Escape(ale_linters#cpp#clangcheck#GetExecutable(a:buffer)) \ . ' -analyze %s' + \ . (empty(l:build_dir) ? ' -extra-arg -Xclang -extra-arg -analyzer-output=text' : '') \ . (!empty(l:user_options) ? ' ' . l:user_options : '') \ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') - \ . (empty(l:build_dir) ? ' -extra-arg -Xanalyzer -extra-arg -analyzer-output=text' : '') endfunction call ale#linter#Define('cpp', { diff --git a/test/command_callback/test_cpp_clangcheck_command_callbacks.vader b/test/command_callback/test_cpp_clangcheck_command_callbacks.vader index 34b87fc..f708c52 100644 --- a/test/command_callback/test_cpp_clangcheck_command_callbacks.vader +++ b/test/command_callback/test_cpp_clangcheck_command_callbacks.vader @@ -28,7 +28,7 @@ Execute(The executable should be used in the command): AssertEqual \ ale#Escape('clang-check') \ . ' -analyze %s' - \ . ' -extra-arg -Xanalyzer -extra-arg -analyzer-output=text', + \ . ' -extra-arg -Xclang -extra-arg -analyzer-output=text', \ ale_linters#cpp#clangcheck#GetCommand(bufnr('')) let b:ale_cpp_clangcheck_executable = 'foobar' @@ -38,7 +38,7 @@ Execute(The executable should be used in the command): AssertEqual \ ale#Escape('foobar') \ . ' -analyze %s' - \ . ' -extra-arg -Xanalyzer -extra-arg -analyzer-output=text', + \ . ' -extra-arg -Xclang -extra-arg -analyzer-output=text', \ ale_linters#cpp#clangcheck#GetCommand(bufnr('')) Execute(The options should be configurable): @@ -46,8 +46,9 @@ Execute(The options should be configurable): AssertEqual \ ale#Escape('clang-check') - \ . ' -analyze %s --something' - \ . ' -extra-arg -Xanalyzer -extra-arg -analyzer-output=text', + \ . ' -analyze %s' + \ . ' -extra-arg -Xclang -extra-arg -analyzer-output=text' + \ . ' --something', \ ale_linters#cpp#clangcheck#GetCommand(bufnr('')) Execute(The build directory should be used when set): From af1b881c8bb886d6161f92edb69e52487bb448d2 Mon Sep 17 00:00:00 2001 From: w0rp Date: Mon, 29 Jan 2018 13:54:50 +0000 Subject: [PATCH 3/4] Merge pull request #1322 from datanoise/master fixed rust errors parsing --- autoload/ale/handlers/rust.vim | 4 ++-- test/handler/test_rust_handler.vader | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/autoload/ale/handlers/rust.vim b/autoload/ale/handlers/rust.vim index 395b915..537bc73 100644 --- a/autoload/ale/handlers/rust.vim +++ b/autoload/ale/handlers/rust.vim @@ -51,8 +51,8 @@ function! ale#handlers#rust#HandleRustErrors(buffer, lines) abort call add(l:output, { \ 'lnum': l:span.line_start, \ 'end_lnum': l:span.line_end, - \ 'col': l:span.byte_start, - \ 'end_col': l:span.byte_end, + \ 'col': l:span.column_start, + \ 'end_col': l:span.column_end, \ 'text': empty(l:span.label) ? l:error.message : printf('%s: %s', l:error.message, l:span.label), \ 'type': toupper(l:error.level[0]), \}) diff --git a/test/handler/test_rust_handler.vader b/test/handler/test_rust_handler.vader index 05bd1e9..e3ab3e8 100644 --- a/test/handler/test_rust_handler.vader +++ b/test/handler/test_rust_handler.vader @@ -7,16 +7,16 @@ Execute(The Rust handler should handle rustc output): \ 'lnum': 15, \ 'end_lnum': 15, \ 'type': 'E', - \ 'col': 418, - \ 'end_col': 421, + \ 'col': 5, + \ 'end_col': 8, \ 'text': 'expected one of `.`, `;`, `?`, `}`, or an operator, found `for`', \ }, \ { \ 'lnum': 13, \ 'end_lnum': 13, \ 'type': 'E', - \ 'col': 407, - \ 'end_col': 410, + \ 'col': 7, + \ 'end_col': 10, \ 'text': 'no method named `wat` found for type `std::string::String` in the current scope', \ }, \ ], @@ -83,16 +83,16 @@ Execute(The Rust handler should handle cargo output): \ 'lnum': 15, \ 'end_lnum': 15, \ 'type': 'E', - \ 'col': 11505, - \ 'end_col': 11508, + \ 'col': 5, + \ 'end_col': 8, \ 'text': 'expected one of `.`, `;`, `?`, `}`, or an operator, found `for`', \ }, \ { \ 'lnum': 13, \ 'end_lnum': 13, \ 'type': 'E', - \ 'col': 11494, - \ 'end_col': 11497, + \ 'col': 7, + \ 'end_col': 10, \ 'text': 'no method named `wat` found for type `std::string::String` in the current scope', \ }, \ ], @@ -157,8 +157,8 @@ Execute(The Rust handler should should errors from expansion spans): \ 'lnum': 4, \ 'end_lnum': 4, \ 'type': 'E', - \ 'col': 52, - \ 'end_col': 54, + \ 'col': 21, + \ 'end_col': 23, \ 'text': 'mismatched types: expected bool, found integral variable', \ }, \ ], @@ -207,8 +207,8 @@ Execute(The Rust handler should show detailed errors): \ 'lnum': 4, \ 'end_lnum': 4, \ 'type': 'E', - \ 'col': 52, - \ 'end_col': 54, + \ 'col': 21, + \ 'end_col': 23, \ 'text': 'mismatched types: expected bool, found integral variable', \ }, \ ], From c7a9ffcb9ca9c179d30af0dd27d817ec48c58a5a Mon Sep 17 00:00:00 2001 From: w0rp Date: Wed, 17 Jan 2018 18:08:17 +0000 Subject: [PATCH 4/4] Fix #1298 - Escape commands for PowerShell --- autoload/ale/job.vim | 2 +- test/smoke_test.vader | 62 +++++++++++++++++++++++++++++++++ test/test_history_saving.vader | 4 +-- test/test_prepare_command.vader | 2 +- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/autoload/ale/job.vim b/autoload/ale/job.vim index e6a75c8..cad7530 100644 --- a/autoload/ale/job.vim +++ b/autoload/ale/job.vim @@ -174,7 +174,7 @@ function! ale#job#PrepareCommand(command) abort " but we'll do this explicitly, so we use thes same exact command for both " versions. if ale#Has('win32') - return 'cmd /c ' . a:command + return 'cmd /s/c "' . a:command . '"' endif if &shell =~? 'fish$' diff --git a/test/smoke_test.vader b/test/smoke_test.vader index 7635cbd..f6d0be5 100644 --- a/test/smoke_test.vader +++ b/test/smoke_test.vader @@ -1,6 +1,7 @@ Before: Save g:ale_set_lists_synchronously Save g:ale_buffer_info + Save &shell let g:ale_buffer_info = {} let g:ale_set_lists_synchronously = 1 @@ -59,6 +60,67 @@ Execute(Linters should run with the default options): \ 'valid': 1, \ }], getloclist(0) +Execute(Linters should run in PowerShell too): + if has('win32') + set shell=powershell + + AssertEqual 'foobar', &filetype + + " Replace the callback to handle two lines. + function! TestCallback(buffer, output) + " Windows adds extra spaces to the text from echo. + return [ + \ { + \ 'lnum': 1, + \ 'col': 3, + \ 'text': substitute(a:output[0], ' *$', '', ''), + \ }, + \ { + \ 'lnum': 2, + \ 'col': 3, + \ 'text': substitute(a:output[1], ' *$', '', ''), + \ }, + \] + endfunction + + " Recreate the command string to use &&, which PowerShell does not support. + call ale#linter#Reset() + call ale#linter#Define('foobar', { + \ 'name': 'testlinter', + \ 'callback': 'TestCallback', + \ 'executable': 'cmd', + \ 'command': 'echo foo && echo bar', + \}) + + call ale#Lint() + call ale#engine#WaitForJobs(2000) + + AssertEqual [ + \ { + \ 'bufnr': bufnr('%'), + \ 'lnum': 1, + \ 'vcol': 0, + \ 'col': 3, + \ 'text': 'foo', + \ 'type': 'E', + \ 'nr': -1, + \ 'pattern': '', + \ 'valid': 1, + \ }, + \ { + \ 'bufnr': bufnr('%'), + \ 'lnum': 2, + \ 'vcol': 0, + \ 'col': 3, + \ 'text': 'bar', + \ 'type': 'E', + \ 'nr': -1, + \ 'pattern': '', + \ 'valid': 1, + \ }, + \], getloclist(0) + endif + Execute(Previous errors should be removed when linters change): call ale#Lint() call ale#engine#WaitForJobs(2000) diff --git a/test/test_history_saving.vader b/test/test_history_saving.vader index 020ceb5..7dabcd9 100644 --- a/test/test_history_saving.vader +++ b/test/test_history_saving.vader @@ -76,7 +76,7 @@ Execute(History should be set when commands are run): AssertEqual sort(['status', 'exit_code', 'job_id', 'command']), sort(keys(g:history[0])) if has('win32') - AssertEqual 'cmd /c echo command history test', g:history[0].command + AssertEqual 'cmd /s/c "echo command history test"', g:history[0].command else AssertEqual ['/bin/sh', '-c', '/bin/sh -c ''echo command history test'''], g:history[0].command endif @@ -151,7 +151,7 @@ Execute(The history should be updated when fixers are run): AssertEqual ['finished'], map(copy(b:ale_history), 'v:val.status') if has('win32') - AssertEqual 'cmd /c echo foo ', split(b:ale_history[0].command, '<')[0] + AssertEqual 'cmd /s/c "echo foo ', split(b:ale_history[0].command, '<')[0] else AssertEqual '/bin/sh -c echo foo ', split(join(b:ale_history[0].command), '<')[0] endif diff --git a/test/test_prepare_command.vader b/test/test_prepare_command.vader index ebb9998..4f88b1d 100644 --- a/test/test_prepare_command.vader +++ b/test/test_prepare_command.vader @@ -35,4 +35,4 @@ Execute(cmd /c as a string should be used on Windows): let &shellcmdflag = 'whatever' let g:ale_has_override = {'win32': 1} - AssertEqual 'cmd /c foobar', ale#job#PrepareCommand('foobar') + AssertEqual 'cmd /s/c "foobar"', ale#job#PrepareCommand('foobar')