diff --git a/autoload/ale/fix.vim b/autoload/ale/fix.vim index d8a50a2..7513a7c 100644 --- a/autoload/ale/fix.vim +++ b/autoload/ale/fix.vim @@ -232,7 +232,10 @@ function! s:RunFixer(options) abort let l:index = a:options.callback_index while len(a:options.callback_list) > l:index - let l:result = call(a:options.callback_list[l:index], [l:buffer, copy(l:input)]) + let l:Function = a:options.callback_list[l:index] + let l:result = ale#util#FunctionArgCount(l:Function) == 1 + \ ? call(l:Function, [l:buffer]) + \ : call(l:Function, [l:buffer, copy(l:input)]) if type(l:result) == type(0) && l:result == 0 " When `0` is returned, skip this item. diff --git a/doc/ale.txt b/doc/ale.txt index 955e387..dcba2fe 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -770,10 +770,16 @@ The values for `g:ale_fixers` can be a list of |String|, |Funcref|, or |lambda| values. String values must either name a function, or a short name for a function set in the ALE fixer registry. -Each function for fixing errors must accept two arguments `(buffer, lines)`, -representing the buffer being fixed and the lines to fix. The functions must -return either `0`, for changing nothing, a |List| for new lines to set, or a -|Dictionary| for describing a command to be run in the background. +Each function for fixing errors must accept either one argument `(buffer)` or +two arguments `(buffer, lines)`, representing the buffer being fixed and the +lines to fix. The functions must return either `0`, for changing nothing, a +|List| for new lines to set, or a |Dictionary| for describing a command to be +run in the background. + +Functions receiving a variable number of arguments will not receive the second +argument `lines`. Functions should name two arguments if the `lines` argument +is desired. This is required to avoid unnecessary copying of the lines of +the buffers being checked. When a |Dictionary| is returned for an |ALEFix| callback, the following keys are supported for running the commands. diff --git a/test/test_ale_fix.vader b/test/test_ale_fix.vader index 5421dcf..0974d10 100644 --- a/test/test_ale_fix.vader +++ b/test/test_ale_fix.vader @@ -35,6 +35,10 @@ Before: return {'command': 'cat - <(echo d)'} endfunction + function CatLineOneArg(buffer) abort + return {'command': 'cat - <(echo d)'} + endfunction + function ReplaceWithTempFile(buffer, lines) abort return {'command': 'echo x > %t', 'read_temporary_file': 1} endfunction @@ -43,6 +47,10 @@ Before: return ['a', 'b'] endfunction + function RemoveLastLineOneArg(buffer) abort + return ['a', 'b'] + endfunction + function! TestCallback(buffer, output) return [{'lnum': 1, 'col': 1, 'text': 'xxx'}] endfunction @@ -65,8 +73,10 @@ After: delfunction AddDollars delfunction DoNothing delfunction CatLine + delfunction CatLineOneArg delfunction ReplaceWithTempFile delfunction RemoveLastLine + delfunction RemoveLastLineOneArg delfunction TestCallback delfunction SetUpLinters call ale#fix#registry#ResetToDefaults() @@ -315,3 +325,21 @@ Execute(ale#fix#InitBufferData() should set up the correct data): \ 'should_save': 1, \ }, \}, g:ale_fix_buffer_data + +Execute(ALEFix simple functions should be able to accept one argument, the buffer): + let g:ale_fixers.testft = ['RemoveLastLineOneArg'] + ALEFix + +Expect(There should be only two lines): + a + b + +Execute(ALEFix functions returning jobs should be able to accept one argument): + let g:ale_fixers.testft = ['CatLine'] + ALEFix + +Expect(An extra line should be added): + a + b + c + d