summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--autoload/ale/fix/registry.vim5
-rw-r--r--autoload/ale/fixers/scalafmt.vim26
-rw-r--r--doc/ale-scala.txt31
-rw-r--r--doc/ale.txt3
-rw-r--r--test/command_callback/scala_paths/dummy.scala0
-rw-r--r--test/fixers/test_scalafmt_fixer_callback.vader69
7 files changed, 134 insertions, 2 deletions
diff --git a/README.md b/README.md
index 54fdc2b2..9eaa2ce9 100644
--- a/README.md
+++ b/README.md
@@ -164,7 +164,7 @@ formatting.
| 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 | [prettier](https://github.com/prettier/prettier), [sass-lint](https://www.npmjs.com/package/sass-lint), [scss-lint](https://github.com/brigade/scss-lint), [stylelint](https://github.com/stylelint/stylelint) |
-| Scala | [fsc](https://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/tools/fsc.html), [scalac](http://scala-lang.org), [scalastyle](http://www.scalastyle.org) |
+| Scala | [fsc](https://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/tools/fsc.html), [scalac](http://scala-lang.org), [scalafmt](https://scalameta.org/scalafmt/), [scalastyle](http://www.scalastyle.org) |
| Slim | [slim-lint](https://github.com/sds/slim-lint) |
| SML | [smlnj](http://www.smlnj.org/) |
| Solidity | [solhint](https://github.com/protofire/solhint), [solium](https://github.com/duaraghav8/Solium) |
diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim
index 17532b3b..72a9a5f8 100644
--- a/autoload/ale/fix/registry.vim
+++ b/autoload/ale/fix/registry.vim
@@ -95,6 +95,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['ruby'],
\ 'description': 'Fix ruby files with rufo',
\ },
+\ 'scalafmt': {
+\ 'function': 'ale#fixers#scalafmt#Fix',
+\ 'suggested_filetypes': ['scala'],
+\ 'description': 'Fix Scala files using scalafmt',
+\ },
\ 'standard': {
\ 'function': 'ale#fixers#standard#Fix',
\ 'suggested_filetypes': ['javascript'],
diff --git a/autoload/ale/fixers/scalafmt.vim b/autoload/ale/fixers/scalafmt.vim
new file mode 100644
index 00000000..07d28275
--- /dev/null
+++ b/autoload/ale/fixers/scalafmt.vim
@@ -0,0 +1,26 @@
+" Author: Jeffrey Lau https://github.com/zoonfafer
+" Description: Integration of Scalafmt with ALE.
+
+call ale#Set('scala_scalafmt_executable', 'scalafmt')
+call ale#Set('scala_scalafmt_use_global', get(g:, 'ale_use_global_executables', 0))
+call ale#Set('scala_scalafmt_options', '')
+
+function! ale#fixers#scalafmt#GetCommand(buffer) abort
+ let l:executable = ale#Var(a:buffer, 'scala_scalafmt_executable')
+ let l:options = ale#Var(a:buffer, 'scala_scalafmt_options')
+ let l:exec_args = l:executable =~? 'ng$'
+ \ ? ' scalafmt'
+ \ : ''
+
+ return ale#Escape(l:executable) . l:exec_args
+ \ . (empty(l:options) ? '' : ' ' . l:options)
+ \ . ' %t'
+
+endfunction
+
+function! ale#fixers#scalafmt#Fix(buffer) abort
+ return {
+ \ 'command': ale#fixers#scalafmt#GetCommand(a:buffer),
+ \ 'read_temporary_file': 1,
+ \}
+endfunction
diff --git a/doc/ale-scala.txt b/doc/ale-scala.txt
index 9c9472f6..15add7db 100644
--- a/doc/ale-scala.txt
+++ b/doc/ale-scala.txt
@@ -3,6 +3,37 @@ ALE Scala Integration *ale-scala-options*
===============================================================================
+scalafmt *ale-scala-scalafmt*
+
+If Nailgun is used, override `g:ale_scala_scalafmt_executable` like so: >
+ let g:ale_scala_scalafmt_executable = 'ng'
+
+To disable `scalafmt` globally, use |g:ale_fixers| like so: >
+ let g:ale_fixers = {'scala': []}
+<
+
+See |g:ale_fixers| for more information on disabling fixers.
+
+
+g:ale_scala_scalafmt_executable *g:ale_scala_scalafmt_executable*
+ *b:ale_scala_scalafmt_executable*
+ Type: |String|
+ Default: `'scalafmt'`
+
+ Override the invoked `scalafmt` binary. This is useful for running `scalafmt`
+ with Nailgun.
+
+
+g:ale_scala_scalafmt_options *g:ale_scala_scalafmt_options*
+ *b:ale_scala_scalafmt_options*
+ Type: |String|
+ Default: `''`
+
+ A string containing additional options to pass to `'scalafmt'`, or
+ `'ng scalafmt'` if Nailgun is used.
+
+
+===============================================================================
scalastyle *ale-scala-scalastyle*
`scalastyle` requires a configuration file for a project to run. When no
diff --git a/doc/ale.txt b/doc/ale.txt
index 2b4452d9..2d7a5935 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -218,6 +218,7 @@ CONTENTS *ale-contents*
sass..................................|ale-sass-options|
stylelint...........................|ale-sass-stylelint|
scala.................................|ale-scala-options|
+ scalafmt............................|ale-scala-scalafmt|
scalastyle..........................|ale-scala-scalastyle|
scss..................................|ale-scss-options|
prettier............................|ale-scss-prettier|
@@ -388,7 +389,7 @@ Notes:
* Rust: `cargo`!!, `rls`, `rustc` (see |ale-integration-rust|), `rustfmt`
* SASS: `sass-lint`, `stylelint`
* SCSS: `prettier`, `sass-lint`, `scss-lint`, `stylelint`
-* Scala: `fsc`, `scalac`, `scalastyle`
+* Scala: `fsc`, `scalac`, `scalafmt`, `scalastyle`
* Slim: `slim-lint`
* SML: `smlnj`
* Solidity: `solhint`, `solium`
diff --git a/test/command_callback/scala_paths/dummy.scala b/test/command_callback/scala_paths/dummy.scala
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/scala_paths/dummy.scala
diff --git a/test/fixers/test_scalafmt_fixer_callback.vader b/test/fixers/test_scalafmt_fixer_callback.vader
new file mode 100644
index 00000000..d82fda43
--- /dev/null
+++ b/test/fixers/test_scalafmt_fixer_callback.vader
@@ -0,0 +1,69 @@
+Before:
+ Save g:ale_scala_scalafmt_executable
+ Save g:ale_scala_scalafmt_options
+
+ " Use an invalid global executable, so we don't match it.
+ let g:ale_scala_scalafmt_executable = 'xxxinvalid'
+ let g:ale_scala_scalafmt_options = ''
+
+ call ale#test#SetDirectory('/testplugin/test/fixers')
+ silent cd ..
+ silent cd command_callback
+ let g:dir = getcwd()
+
+After:
+ Restore
+
+ call ale#test#RestoreDirectory()
+
+Execute(The scalafmt callback should return the correct default values):
+ call ale#test#SetFilename('scala_paths/dummy.scala')
+
+ AssertEqual
+ \ {
+ \ 'read_temporary_file': 1,
+ \ 'command': ale#Escape(g:ale_scala_scalafmt_executable)
+ \ . ' %t',
+ \ },
+ \ ale#fixers#scalafmt#Fix(bufnr(''))
+
+Execute(The scalafmt callback should use ng with scalafmt automatically):
+ let g:ale_scala_scalafmt_executable = 'ng'
+ call ale#test#SetFilename('scala_paths/dummy.scala')
+
+ AssertEqual
+ \ {
+ \ 'read_temporary_file': 1,
+ \ 'command': ale#Escape('ng')
+ \ . ' scalafmt'
+ \ . ' %t',
+ \ },
+ \ ale#fixers#scalafmt#Fix(bufnr(''))
+
+Execute(The scalafmt callback should include custom scalafmt options):
+ let g:ale_scala_scalafmt_options = '--diff'
+ call ale#test#SetFilename('scala_paths/dummy.scala')
+
+ AssertEqual
+ \ {
+ \ 'read_temporary_file': 1,
+ \ 'command': ale#Escape(g:ale_scala_scalafmt_executable)
+ \ . ' --diff'
+ \ . ' %t',
+ \ },
+ \ ale#fixers#scalafmt#Fix(bufnr(''))
+
+Execute(The scalafmt callback should include custom scalafmt options and use ng with scalafmt):
+ let g:ale_scala_scalafmt_options = '--diff'
+ let g:ale_scala_scalafmt_executable = 'ng'
+ call ale#test#SetFilename('scala_paths/dummy.scala')
+
+ AssertEqual
+ \ {
+ \ 'read_temporary_file': 1,
+ \ 'command': ale#Escape('ng')
+ \ . ' scalafmt'
+ \ . ' --diff'
+ \ . ' %t',
+ \ },
+ \ ale#fixers#scalafmt#Fix(bufnr(''))