summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw0rp <w0rp@users.noreply.github.com>2017-10-24 22:20:03 +0100
committerGitHub <noreply@github.com>2017-10-24 22:20:03 +0100
commitc248885e5790ce81018ddc8f8afbc3c173051059 (patch)
tree8fb8fcfc71ee025c2785f3fc86dad3b0d59ac43c
parent0e4dd95e5dac4ef5ac7877b1885f1c8300a53bd3 (diff)
parent35031a0b8a384766277a8b38f84c28ae89a17430 (diff)
downloadale-c248885e5790ce81018ddc8f8afbc3c173051059.zip
Merge pull request #1025 from kfox/add-rustfmt-fixer
add rustfmt fixer
-rw-r--r--README.md2
-rw-r--r--autoload/ale/fix/registry.vim5
-rw-r--r--autoload/ale/fixers/rustfmt.vim17
-rw-r--r--doc/ale-rust.txt13
-rw-r--r--doc/ale.txt3
-rw-r--r--test/fixers/test_rustfmt_fixer_callback.vader38
-rw-r--r--test/rust_files/testfile.rs0
7 files changed, 76 insertions, 2 deletions
diff --git a/README.md b/README.md
index 89fd3809..813b429f 100644
--- a/README.md
+++ b/README.md
@@ -128,7 +128,7 @@ formatting.
| reStructuredText | [proselint](http://proselint.com/) |
| RPM spec | [rpmlint](https://github.com/rpm-software-management/rpmlint) (disabled by default; see `:help ale-integration-spec`) |
| Ruby | [brakeman](http://brakemanscanner.org/) !!, [rails_best_practices](https://github.com/flyerhzm/rails_best_practices) !!, [reek](https://github.com/troessner/reek), [rubocop](https://github.com/bbatsov/rubocop), [ruby](https://www.ruby-lang.org) |
-| Rust | cargo !! (see `:help ale-integration-rust` for configuration instructions), [rls](https://github.com/rust-lang-nursery/rls), [rustc](https://www.rust-lang.org/) |
+| Rust | cargo !! (see `:help ale-integration-rust` for configuration instructions), [rls](https://github.com/rust-lang-nursery/rls), [rustc](https://www.rust-lang.org/), [rustfmt](https://github.com/rust-lang-nursery/rustfmt) |
| SASS | [sass-lint](https://www.npmjs.com/package/sass-lint), [stylelint](https://github.com/stylelint/stylelint) |
| SCSS | [sass-lint](https://www.npmjs.com/package/sass-lint), [scss-lint](https://github.com/brigade/scss-lint), [stylelint](https://github.com/stylelint/stylelint), [prettier](https://github.com/prettier/prettier) |
| Scala | [scalac](http://scala-lang.org), [scalastyle](http://www.scalastyle.org) |
diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim
index 598be6d0..e17521f4 100644
--- a/autoload/ale/fix/registry.vim
+++ b/autoload/ale/fix/registry.vim
@@ -112,6 +112,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['typescript'],
\ 'description': 'Fix typescript files with tslint --fix.',
\ },
+\ 'rustfmt': {
+\ 'function': 'ale#fixers#rustfmt#Fix',
+\ 'suggested_filetypes': ['rust'],
+\ 'description': 'Fix Rust files with Rustfmt.',
+\ },
\}
" Reset the function registry to the default entries.
diff --git a/autoload/ale/fixers/rustfmt.vim b/autoload/ale/fixers/rustfmt.vim
new file mode 100644
index 00000000..fb5ac61c
--- /dev/null
+++ b/autoload/ale/fixers/rustfmt.vim
@@ -0,0 +1,17 @@
+" Author: Kelly Fox <kelly@bumfuddled.com>
+" Description: Integration of rustfmt with ALE.
+
+call ale#Set('rust_rustfmt_executable', 'rustfmt')
+call ale#Set('rust_rustfmt_options', '')
+
+function! ale#fixers#rustfmt#Fix(buffer) abort
+ let l:executable = ale#Var(a:buffer, 'rust_rustfmt_executable')
+ let l:options = ale#Var(a:buffer, 'rust_rustfmt_options')
+
+ return {
+ \ 'command': ale#Escape(l:executable)
+ \ . (empty(l:options) ? '' : ' ' . l:options)
+ \ . ' %t',
+ \ 'read_temporary_file': 1,
+ \}
+endfunction
diff --git a/doc/ale-rust.txt b/doc/ale-rust.txt
index 52dc3d61..e20aea2c 100644
--- a/doc/ale-rust.txt
+++ b/doc/ale-rust.txt
@@ -22,6 +22,8 @@ Integration Information
over cargo. rls implements the Language Server Protocol for incremental
compilation of Rust code, and can check Rust files while you type. `rls`
requires Rust files to contained in Cargo projects.
+ 4. rustfmt -- If you have `rustfmt` installed, you can use it as a fixer to
+ consistently reformat your Rust code.
Only cargo is enabled by default. To switch to using rustc instead of cargo,
configure |g:ale_linters| appropriately: >
@@ -71,4 +73,15 @@ g:ale_rust_ignore_error_codes *g:ale_rust_ignore_error_codes*
===============================================================================
+rustfmt *ale-rust-rustfmt*
+
+g:ale_rust_rustfmt_options *g:ale_rust_rustfmt_options*
+ *b:ale_rust_rustfmt_options*
+ Type: |String|
+ Default: `''`
+
+ This variable can be set to pass additional options to the rustfmt fixer.
+
+
+===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
diff --git a/doc/ale.txt b/doc/ale.txt
index b764fe6b..47b95438 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -144,6 +144,7 @@ CONTENTS *ale-contents*
cargo...............................|ale-rust-cargo|
rls.................................|ale-rust-rls|
rustc...............................|ale-rust-rustc|
+ rustfmt.............................|ale-rust-rustfmt|
sass..................................|ale-sass-options|
stylelint...........................|ale-sass-stylelint|
scala.................................|ale-scala-options|
@@ -282,7 +283,7 @@ Notes:
* reStructuredText: `proselint`
* RPM spec: `rpmlint`
* Ruby: `brakeman`, `rails_best_practices`!!, `reek`, `rubocop`, `ruby`
-* Rust: `cargo`!!, `rls`, `rustc` (see |ale-integration-rust|)
+* Rust: `cargo`!!, `rls`, `rustc` (see |ale-integration-rust|), `rustfmt`
* SASS: `sass-lint`, `stylelint`
* SCSS: `sass-lint`, `scss-lint`, `stylelint`, `prettier`
* Scala: `scalac`, `scalastyle`
diff --git a/test/fixers/test_rustfmt_fixer_callback.vader b/test/fixers/test_rustfmt_fixer_callback.vader
new file mode 100644
index 00000000..36dd58a1
--- /dev/null
+++ b/test/fixers/test_rustfmt_fixer_callback.vader
@@ -0,0 +1,38 @@
+Before:
+ Save g:ale_rust_rustfmt_executable
+ Save g:ale_rust_rustfmt_options
+
+ " Use an invalid global executable, so we don't match it.
+ let g:ale_rust_rustfmt_executable = 'xxxinvalid'
+ let g:ale_rust_rustfmt_options = ''
+
+ call ale#test#SetDirectory('/testplugin/test/fixers')
+
+After:
+ Restore
+
+ call ale#test#RestoreDirectory()
+
+Execute(The rustfmt callback should return the correct default values):
+ call ale#test#SetFilename('../rust_files/testfile.rs')
+
+ AssertEqual
+ \ {
+ \ 'read_temporary_file': 1,
+ \ 'command': ale#Escape('xxxinvalid')
+ \ . ' %t',
+ \ },
+ \ ale#fixers#rustfmt#Fix(bufnr(''))
+
+Execute(The rustfmt callback should include custom rustfmt options):
+ let g:ale_rust_rustfmt_options = "--skip-children"
+ call ale#test#SetFilename('../rust_files/testfile.rs')
+
+ AssertEqual
+ \ {
+ \ 'read_temporary_file': 1,
+ \ 'command': ale#Escape('xxxinvalid')
+ \ . ' ' . g:ale_rust_rustfmt_options
+ \ . ' %t',
+ \ },
+ \ ale#fixers#rustfmt#Fix(bufnr(''))
diff --git a/test/rust_files/testfile.rs b/test/rust_files/testfile.rs
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/rust_files/testfile.rs