summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoracio Sanson <hsanson@gmail.com>2020-07-29 22:08:46 +0900
committerGitHub <noreply@github.com>2020-07-29 22:08:46 +0900
commit5338dbf680f7095f86fb29a9a03f3ed243600439 (patch)
tree7b0532955829bcb2a3064807fc306707d9ff03bb
parent68b484a49fe2f5cc29ebccca0a3da48b31073ada (diff)
parentcef64424ceaede7093bb2837d572b8c5fc0de121 (diff)
downloadale-5338dbf680f7095f86fb29a9a03f3ed243600439.zip
Merge pull request #3231 from jhlink/add-astyle-for-c-formatting
Add astyle for C/C++ formatting
-rw-r--r--autoload/ale/fix/registry.vim5
-rw-r--r--autoload/ale/fixers/astyle.vim59
-rw-r--r--doc/ale-c.txt24
-rw-r--r--doc/ale-cpp.txt24
-rw-r--r--doc/ale-supported-languages-and-tools.txt2
-rw-r--r--doc/ale.txt2
-rw-r--r--supported-tools.md2
-rw-r--r--test/fixers/test_astyle_fixer_callback.vader78
-rw-r--r--test/test_c_projects/makefile_project/_astylerc0
9 files changed, 196 insertions, 0 deletions
diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim
index 1b3ca1a8..02b02699 100644
--- a/autoload/ale/fix/registry.vim
+++ b/autoload/ale/fix/registry.vim
@@ -160,6 +160,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['php'],
\ 'description': 'Fix PHP files with php-cs-fixer.',
\ },
+\ 'astyle': {
+\ 'function': 'ale#fixers#astyle#Fix',
+\ 'suggested_filetypes': ['c', 'cpp'],
+\ 'description': 'Fix C/C++ with astyle.',
+\ },
\ 'clangtidy': {
\ 'function': 'ale#fixers#clangtidy#Fix',
\ 'suggested_filetypes': ['c', 'cpp', 'objc'],
diff --git a/autoload/ale/fixers/astyle.vim b/autoload/ale/fixers/astyle.vim
new file mode 100644
index 00000000..04e4b69a
--- /dev/null
+++ b/autoload/ale/fixers/astyle.vim
@@ -0,0 +1,59 @@
+" Author: James Kim <jhlink@users.noreply.github.com>
+" Description: Fix C/C++ files with astyle.
+
+function! s:set_variables() abort
+ for l:ft in ['c', 'cpp']
+ call ale#Set(l:ft . '_astyle_executable', 'astyle')
+ call ale#Set(l:ft . '_astyle_project_options', '')
+ endfor
+endfunction
+
+call s:set_variables()
+
+
+function! ale#fixers#astyle#Var(buffer, name) abort
+ let l:ft = getbufvar(str2nr(a:buffer), '&filetype')
+ let l:ft = l:ft =~# 'cpp' ? 'cpp' : 'c'
+
+ 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:proj_options = ale#fixers#astyle#FindProjectOptions(a:buffer)
+ let l:command = ' --stdin='
+
+ return {
+ \ 'command': ale#Escape(l:executable)
+ \ . (empty(l:proj_options) ? '' : ' --project=' . l:proj_options)
+ \ . l:command
+ \}
+endfunction
diff --git a/doc/ale-c.txt b/doc/ale-c.txt
index c9eb79db..efc26f93 100644
--- a/doc/ale-c.txt
+++ b/doc/ale-c.txt
@@ -60,6 +60,30 @@ g:ale_c_parse_makefile *g:ale_c_parse_makefile*
===============================================================================
+astyle *ale-c-astyle*
+
+g:ale_c_astyle_executable *g:ale_c_astyle_executable*
+ *b:ale_c_astyle_executable*
+ Type: |String|
+ Default: `'astyle'`
+
+ This variable can be changed to use a different executable for astyle.
+
+
+g:ale_c_astyle_project_options *g:ale_c_astyle_project_options*
+ *b:ale_c_astyle_project_options*
+ Type: |String|
+ Default: `''`
+
+ This variable can be changed to use an option file for project level
+ configurations. Provide only the filename of the option file that should be
+ present at the project's root directory.
+
+ For example, if .astylrc is specified, the file is searched in the parent
+ directories of the source file's directory.
+
+
+===============================================================================
clang *ale-c-clang*
g:ale_c_clang_executable *g:ale_c_clang_executable*
diff --git a/doc/ale-cpp.txt b/doc/ale-cpp.txt
index ead3be28..fbe31370 100644
--- a/doc/ale-cpp.txt
+++ b/doc/ale-cpp.txt
@@ -14,6 +14,30 @@ The following C options also apply to some C++ linters too.
===============================================================================
+astyle *ale-cpp-astyle*
+
+g:ale_cpp_astyle_executable *g:ale_cpp_astyle_executable*
+ *b:ale_cpp_astyle_executable*
+ Type: |String|
+ Default: `'astyle'`
+
+ This variable can be changed to use a different executable for astyle.
+
+
+g:ale_cpp_astyle_project_options *g:ale_cpp_astyle_project_options*
+ *b:ale_cpp_astyle_project_options*
+ Type: |String|
+ Default: `''`
+
+ This variable can be changed to use an option file for project level
+ configurations. Provide only the filename of the option file that should be
+ present at the project's root directory.
+
+ For example, if .astylrc is specified, the file is searched in the parent
+ directories of the source file's directory.
+
+
+===============================================================================
clang *ale-cpp-clang*
g:ale_cpp_clang_executable *g:ale_cpp_clang_executable*
diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt
index ee8be378..3e9b4c1e 100644
--- a/doc/ale-supported-languages-and-tools.txt
+++ b/doc/ale-supported-languages-and-tools.txt
@@ -45,6 +45,7 @@ Notes:
* `shellcheck`
* `shfmt`
* C
+ * `astyle`
* `ccls`
* `clang`
* `clangd`
@@ -62,6 +63,7 @@ Notes:
* `mcsc`!!
* `uncrustify`
* C++ (filetype cpp)
+ * `astyle`
* `ccls`
* `clang`
* `clangcheck`!!
diff --git a/doc/ale.txt b/doc/ale.txt
index 38c1f353..8c6f5e61 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -2284,6 +2284,7 @@ documented in additional help files.
bib.....................................|ale-bib-options|
bibclean..............................|ale-bib-bibclean|
c.......................................|ale-c-options|
+ astyle................................|ale-c-astyle|
clang.................................|ale-c-clang|
clangd................................|ale-c-clangd|
clang-format..........................|ale-c-clangformat|
@@ -2306,6 +2307,7 @@ documented in additional help files.
cmakelint.............................|ale-cmake-cmakelint|
cmake-format..........................|ale-cmake-cmakeformat|
cpp.....................................|ale-cpp-options|
+ astyle................................|ale-cpp-astyle|
clang.................................|ale-cpp-clang|
clangd................................|ale-cpp-clangd|
clangcheck............................|ale-cpp-clangcheck|
diff --git a/supported-tools.md b/supported-tools.md
index 03c2a2d7..1f1eb1ac 100644
--- a/supported-tools.md
+++ b/supported-tools.md
@@ -54,6 +54,7 @@ formatting.
* [shellcheck](https://www.shellcheck.net/)
* [shfmt](https://github.com/mvdan/sh)
* C
+ * [astyle](http://astyle.sourceforge.net/)
* [ccls](https://github.com/MaskRay/ccls)
* [clang](http://clang.llvm.org/)
* [clangd](https://clang.llvm.org/extra/clangd.html)
@@ -71,6 +72,7 @@ formatting.
* [mcsc](http://www.mono-project.com/docs/about-mono/languages/csharp/) :floppy_disk: see:`help ale-cs-mcsc` for details and configuration
* [uncrustify](https://github.com/uncrustify/uncrustify)
* C++ (filetype cpp)
+ * [astyle](http://astyle.sourceforge.net/)
* [ccls](https://github.com/MaskRay/ccls)
* [clang](http://clang.llvm.org/)
* [clangcheck](http://clang.llvm.org/docs/ClangCheck.html) :floppy_disk:
diff --git a/test/fixers/test_astyle_fixer_callback.vader b/test/fixers/test_astyle_fixer_callback.vader
new file mode 100644
index 00000000..cbec4493
--- /dev/null
+++ b/test/fixers/test_astyle_fixer_callback.vader
@@ -0,0 +1,78 @@
+Before:
+ Save g:ale_c_astyle_executable
+ Save g:ale_c_astyle_project_options
+ Save g:ale_cpp_astyle_project_options
+
+ " Use an invalid global executable, so we don't match it.
+ let g:ale_c_astyle_executable = 'xxxinvalid'
+ let g:ale_cpp_astyle_executable = 'invalidpp'
+ let g:ale_c_astyle_project_options = ''
+ let g:ale_cpp_astyle_project_options = ''
+
+ call ale#test#SetDirectory('/testplugin/test/fixers')
+
+After:
+ Restore
+
+ call ale#test#RestoreDirectory()
+
+Execute(The astyle callback should return the correct default values):
+ " Because this file doesn't exist, no astylrc config
+ " exists near it. Therefore, project_options is empty.
+ call ale#test#SetFilename('../c_files/testfile.c')
+
+ AssertEqual
+ \ {
+ \ 'command': ale#Escape(g:ale_c_astyle_executable)
+ \ . ' --stdin='
+ \ },
+ \ ale#fixers#astyle#Fix(bufnr(''))
+
+Execute(The astyle callback should support cpp files):
+ " Because this file doesn't exist, no astylrc config
+ " exists near it. Therefore, project_options is empty.
+ call ale#test#SetFilename('../cpp_files/dummy.cpp')
+ set filetype=cpp " The test fails without this
+
+ AssertEqual
+ \ {
+ \ 'command': ale#Escape(g:ale_cpp_astyle_executable)
+ \ . ' --stdin='
+ \ },
+ \ ale#fixers#astyle#Fix(bufnr(''))
+
+Execute(The astyle callback should support cpp files with option file set):
+ call ale#test#SetFilename('../cpp_files/dummy.cpp')
+ let g:ale_cpp_astyle_project_options = '.astylerc_cpp'
+ set filetype=cpp " The test fails without this
+
+ AssertEqual
+ \ {
+ \ 'command': ale#Escape('invalidpp')
+ \ . ' --project=' . g:ale_cpp_astyle_project_options
+ \ . ' --stdin='
+ \ },
+ \ ale#fixers#astyle#Fix(bufnr(''))
+
+Execute(The astyle callback should return the correct default values with an option file set):
+ call ale#test#SetFilename('../c_files/testfile.c')
+ let g:ale_c_astyle_project_options = '.astylerc_c'
+
+ AssertEqual
+ \ {
+ \ 'command': ale#Escape('xxxinvalid')
+ \ . ' --project=' . g:ale_c_astyle_project_options
+ \ . ' --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
--- /dev/null
+++ b/test/test_c_projects/makefile_project/_astylerc