diff --git a/autoload/ale/fixers/astyle.vim b/autoload/ale/fixers/astyle.vim index ba4ddceb..0abceb10 100644 --- a/autoload/ale/fixers/astyle.vim +++ b/autoload/ale/fixers/astyle.vim @@ -18,15 +18,42 @@ function! ale#fixers#astyle#Var(buffer, name) abort return ale#Var(a:buffer, l:ft . '_astyle_' . a:name) endfunction +" Try to find a project options file. +function! ale#fixers#astyle#FindProjectOptions(buffer) abort + let l:proj_options = ale#fixers#astyle#Var(a:buffer, 'project_options') + + " If user has set project options variable then use it and skip any searching. + " This would allow users to use project files named differently than .astylerc. + if !empty(l:proj_options) + return l:proj_options + endif + + " Try to find nearest .astylerc file. + let l:proj_options = fnamemodify(ale#path#FindNearestFile(a:buffer, '.astylerc'), ':t') + + if !empty(l:proj_options) + return l:proj_options + endif + + " Try to find nearest _astylerc file. + let l:proj_options = fnamemodify(ale#path#FindNearestFile(a:buffer, '_astylerc'), ':t') + + if !empty(l:proj_options) + return l:proj_options + endif + + " If no project options file is found return an empty string. + return '' +endfunction + function! ale#fixers#astyle#Fix(buffer) abort let l:executable = ale#fixers#astyle#Var(a:buffer, 'executable') - let l:filename = ale#Escape(bufname(a:buffer)) - let l:options = ale#fixers#astyle#Var(a:buffer, 'project_options') + let l:proj_options = ale#fixers#astyle#FindProjectOptions(a:buffer) let l:command = ' --stdin=' return { \ 'command': ale#Escape(l:executable) - \ . (empty(l:options) ? '' : ' --project=' . l:options) + \ . (empty(l:proj_options) ? '' : ' --project=' . l:proj_options) \ . l:command \} endfunction diff --git a/test/fixers/test_astyle_fixer_callback.vader b/test/fixers/test_astyle_fixer_callback.vader index 60a18213..cbec4493 100644 --- a/test/fixers/test_astyle_fixer_callback.vader +++ b/test/fixers/test_astyle_fixer_callback.vader @@ -65,3 +65,14 @@ Execute(The astyle callback should return the correct default values with an opt \ . ' --stdin=' \ }, \ ale#fixers#astyle#Fix(bufnr('')) + +Execute(The astyle callback should find nearest default option file _astylrc): + call ale#test#SetFilename('../test_c_projects/makefile_project/subdir/file.c') + + AssertEqual + \ { + \ 'command': ale#Escape('xxxinvalid') + \ . ' --project=_astylerc' + \ . ' --stdin=' + \ }, + \ ale#fixers#astyle#Fix(bufnr('')) diff --git a/test/test_c_projects/makefile_project/_astylerc b/test/test_c_projects/makefile_project/_astylerc new file mode 100644 index 00000000..e69de29b