summaryrefslogtreecommitdiff
path: root/ale_linters/scala/scalastyle.vim
diff options
context:
space:
mode:
authorKevin Kays <kkays@raybeam.com>2017-07-13 18:41:01 -0400
committerw0rp <w0rp@users.noreply.github.com>2017-07-13 23:41:01 +0100
commit4c50aec79c158a61de27f273e1d338fb1d817021 (patch)
treed37c582252ac0655e732545f85930b97567a1eb5 /ale_linters/scala/scalastyle.vim
parent4c6c5bf84fa31ab18ff83122c12b7e8edb18bd1e (diff)
downloadale-4c50aec79c158a61de27f273e1d338fb1d817021.zip
Add scalastyle linter (#766)
* Add support for scalastyle * Add scalastyle docs * scalastyle support for column numbers * off by one column * Add tests for scalastyle command and handler * update readme for scalastyle * allow full scalastyle options instead of just config file * fix indentation * allow scalastyle config file in parent directories by a couple names. * check for missing match args with empty * remove echo * use a for loop
Diffstat (limited to 'ale_linters/scala/scalastyle.vim')
-rw-r--r--ale_linters/scala/scalastyle.vim83
1 files changed, 83 insertions, 0 deletions
diff --git a/ale_linters/scala/scalastyle.vim b/ale_linters/scala/scalastyle.vim
new file mode 100644
index 00000000..ea56c0e4
--- /dev/null
+++ b/ale_linters/scala/scalastyle.vim
@@ -0,0 +1,83 @@
+" Author: Kevin Kays - https://github.com/okkays
+" Description: Support for the scalastyle checker.
+
+let g:ale_scala_scalastyle_options =
+\ get(g:, 'ale_scala_scalastyle_options', '')
+
+let g:ale_scalastyle_config_loc =
+\ get(g:, 'ale_scalastyle_config_loc', '')
+
+function! ale_linters#scala#scalastyle#Handle(buffer, lines) abort
+ " Matches patterns like the following:
+ "
+ " warning file=/home/blurble/Doop.scala message=Missing or badly formed ScalaDoc: Extra @param foobles line=190
+
+ let l:patterns = [
+ \ '^\(.\+\) .\+ message=\(.\+\) line=\(\d\+\)$',
+ \ '^\(.\+\) .\+ message=\(.\+\) line=\(\d\+\) column=\(\d\+\)$',
+ \]
+ let l:output = []
+
+ for l:match in ale#util#GetMatches(a:lines, l:patterns)
+ let l:args = {
+ \ 'lnum': l:match[3] + 0,
+ \ 'type': l:match[1] =~? 'error' ? 'E' : 'W',
+ \ 'text': l:match[2]
+ \}
+
+ if !empty(l:match[4])
+ let l:args['col'] = l:match[4] + 1
+ endif
+
+ call add(l:output, l:args)
+ endfor
+
+ return l:output
+endfunction
+
+function! ale_linters#scala#scalastyle#GetCommand(buffer) abort
+ " Search for scalastyle config in parent directories.
+ let l:scalastyle_config = ''
+ let l:potential_configs = [
+ \ 'scalastyle_config.xml',
+ \ 'scalastyle-config.xml'
+ \]
+ for l:config in l:potential_configs
+ let l:scalastyle_config = ale#path#ResolveLocalPath(
+ \ a:buffer,
+ \ l:config,
+ \ ''
+ \)
+ if !empty(l:scalastyle_config)
+ break
+ endif
+ endfor
+
+ " If all else fails, try the global config.
+ if empty(l:scalastyle_config)
+ let l:scalastyle_config = get(g:, 'ale_scalastyle_config_loc', '')
+ endif
+
+ " Build the command using the config file and additional options.
+ let l:command = 'scalastyle'
+
+ if !empty(l:scalastyle_config)
+ let l:command .= ' --config ' . ale#Escape(l:scalastyle_config)
+ endif
+
+ if !empty(g:ale_scala_scalastyle_options)
+ let l:command .= ' ' . g:ale_scala_scalastyle_options
+ endif
+
+ let l:command .= ' %t'
+
+ return l:command
+endfunction
+
+call ale#linter#Define('scala', {
+\ 'name': 'scalastyle',
+\ 'executable': 'scalastyle',
+\ 'output_stream': 'stdout',
+\ 'command_callback': 'ale_linters#scala#scalastyle#GetCommand',
+\ 'callback': 'ale_linters#scala#scalastyle#Handle',
+\})