summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/fix.vim11
-rw-r--r--doc/ale.txt9
-rw-r--r--test/fix/test_ale_fix.vader30
3 files changed, 50 insertions, 0 deletions
diff --git a/autoload/ale/fix.vim b/autoload/ale/fix.vim
index cbca68e9..4d94f7bc 100644
--- a/autoload/ale/fix.vim
+++ b/autoload/ale/fix.vim
@@ -109,6 +109,15 @@ function! s:HandleExit(job_id, exit_code) abort
endif
let l:chain_callback = get(l:job_info, 'chain_with', v:null)
+ let l:ProcessWith = get(l:job_info, 'process_with', v:null)
+
+ " Post-process the output with a function if we have one.
+ if l:ProcessWith isnot v:null
+ let l:job_info.output = call(
+ \ ale#util#GetFunction(l:ProcessWith),
+ \ [l:buffer, l:job_info.output]
+ \)
+ endif
" Use the output of the job for changing the file if it isn't empty,
" otherwise skip this job and use the input from before.
@@ -226,6 +235,7 @@ function! s:RunJob(options) abort
\ 'chain_with': l:chain_with,
\ 'callback_index': a:options.callback_index,
\ 'callback_list': a:options.callback_list,
+ \ 'process_with': a:options.process_with,
\}
if l:read_temporary_file
@@ -329,6 +339,7 @@ function! s:RunFixer(options) abort
\ 'chain_with': l:Chain_with,
\ 'callback_list': a:options.callback_list,
\ 'callback_index': l:index,
+ \ 'process_with': get(l:result, 'process_with', v:null),
\})
if !l:job_ran
diff --git a/doc/ale.txt b/doc/ale.txt
index f7141cf9..12a8b860 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -459,6 +459,15 @@ are supported for running the commands.
for commands which need to modify some file on disk in
order to fix files.
+ `process_with` An optional callback for post-processing.
+
+ The callback must accept two arguments,
+ `(buffer, output)`, which can be used for converting
+ the output from a command into lines to replace the
+ buffer's contents with.
+
+ A |List| of |String|s must be returned.
+
`chain_with` An optional key for defining a callback to call next.
The callback must accept two or three arguments,
diff --git a/test/fix/test_ale_fix.vader b/test/fix/test_ale_fix.vader
index 47932930..0987416b 100644
--- a/test/fix/test_ale_fix.vader
+++ b/test/fix/test_ale_fix.vader
@@ -133,6 +133,25 @@ Before:
return empty(l:lines) ? '' : l:lines[-1]
endfunction
+ function! FixWithJSONPostProcessing(buffer) abort
+ let l:ProcessWith = 'JSONPostProcessor'
+
+ " Test with lambdas where support is available.
+ if has('lambda')
+ let l:ProcessWith = {buffer, output -> JSONPostProcessor(buffer, output)}
+ endif
+
+ return {
+ \ 'command': 'echo ' . ale#Escape('{"output": ["x", "y", "z"]}'),
+ \ 'read_buffer': 0,
+ \ 'process_with': l:ProcessWith,
+ \}
+ endfunction
+
+ function! JSONPostProcessor(buffer, output) abort
+ return json_decode(a:output[0]).output
+ endfunction
+
After:
Restore
unlet! g:ale_run_synchronously
@@ -160,6 +179,8 @@ After:
delfunction GetLastMessage
delfunction IgnoredEmptyOutput
delfunction EchoLineNoPipe
+ delfunction FixWithJSONPostProcessing
+ delfunction JSONPostProcessor
call ale#test#RestoreDirectory()
@@ -612,3 +633,12 @@ Execute(A temporary file shouldn't be piped into the command when disabled):
Expect(The new line should be used):
new line
+
+Execute(Post-processing should work):
+ let g:ale_fixers.testft = ['FixWithJSONPostProcessing']
+ ALEFix
+
+Expect(The lines in the JSON should be used):
+ x
+ y
+ z