summaryrefslogtreecommitdiff
path: root/ale_linters
diff options
context:
space:
mode:
Diffstat (limited to 'ale_linters')
-rw-r--r--ale_linters/cs/csc.vim95
-rw-r--r--ale_linters/cs/mcsc.vim34
-rw-r--r--ale_linters/elm/elm_ls.vim37
-rw-r--r--ale_linters/elm/elm_lsp.vim22
-rw-r--r--ale_linters/ruby/sorbet.vim23
-rw-r--r--ale_linters/rust/cargo.vim19
6 files changed, 191 insertions, 39 deletions
diff --git a/ale_linters/cs/csc.vim b/ale_linters/cs/csc.vim
new file mode 100644
index 00000000..308abc77
--- /dev/null
+++ b/ale_linters/cs/csc.vim
@@ -0,0 +1,95 @@
+call ale#Set('cs_csc_options', '')
+call ale#Set('cs_csc_source', '')
+call ale#Set('cs_csc_assembly_path', [])
+call ale#Set('cs_csc_assemblies', [])
+
+function! s:GetWorkingDirectory(buffer) abort
+ let l:working_directory = ale#Var(a:buffer, 'cs_csc_source')
+
+ if !empty(l:working_directory)
+ return l:working_directory
+ endif
+
+ return expand('#' . a:buffer . ':p:h')
+endfunction
+
+function! ale_linters#cs#csc#GetCommand(buffer) abort
+ " Pass assembly paths via the -lib: parameter.
+ let l:path_list = ale#Var(a:buffer, 'cs_csc_assembly_path')
+
+ let l:lib_option = !empty(l:path_list)
+ \ ? '/lib:' . join(map(copy(l:path_list), 'ale#Escape(v:val)'), ',')
+ \ : ''
+
+ " Pass paths to DLL files via the -r: parameter.
+ let l:assembly_list = ale#Var(a:buffer, 'cs_csc_assemblies')
+
+ let l:r_option = !empty(l:assembly_list)
+ \ ? '/r:' . join(map(copy(l:assembly_list), 'ale#Escape(v:val)'), ',')
+ \ : ''
+
+ " register temporary module target file with ale
+ " register temporary module target file with ALE.
+ let l:out = ale#command#CreateFile(a:buffer)
+
+ " The code is compiled as a module and the output is redirected to a
+ " temporary file.
+ return ale#path#CdString(s:GetWorkingDirectory(a:buffer))
+ \ . 'csc /unsafe'
+ \ . ale#Pad(ale#Var(a:buffer, 'cs_csc_options'))
+ \ . ale#Pad(l:lib_option)
+ \ . ale#Pad(l:r_option)
+ \ . ' /out:' . l:out
+ \ . ' /t:module'
+ \ . ' /recurse:' . ale#Escape('*.cs')
+endfunction
+
+function! ale_linters#cs#csc#Handle(buffer, lines) abort
+ " Look for lines like the following.
+ "
+ " Tests.cs(12,29): error CSXXXX: ; expected
+ "
+ " NOTE: pattern also captures file name as linter compiles all
+ " files within the source tree rooted at the specified source
+ " path and not just the file loaded in the buffer
+ let l:patterns = [
+ \ '^\v(.+\.cs)\((\d+),(\d+)\)\:\s+([^ ]+)\s+([cC][sS][^ ]+):\s(.+)$',
+ \ '^\v([^ ]+)\s+([Cc][sS][^ ]+):\s+(.+)$',
+ \]
+ let l:output = []
+
+ let l:dir = s:GetWorkingDirectory(a:buffer)
+
+ for l:match in ale#util#GetMatches(a:lines, l:patterns)
+ if len(l:match) > 6 && strlen(l:match[5]) > 2 && l:match[5][:1] is? 'CS'
+ call add(l:output, {
+ \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]),
+ \ 'lnum': l:match[2] + 0,
+ \ 'col': l:match[3] + 0,
+ \ 'type': l:match[4] is# 'error' ? 'E' : 'W',
+ \ 'code': l:match[5],
+ \ 'text': l:match[6] ,
+ \})
+ elseif strlen(l:match[2]) > 2 && l:match[2][:1] is? 'CS'
+ call add(l:output, {
+ \ 'filename':'<csc>',
+ \ 'lnum': -1,
+ \ 'col': -1,
+ \ 'type': l:match[1] is# 'error' ? 'E' : 'W',
+ \ 'code': l:match[2],
+ \ 'text': l:match[3],
+ \})
+ endif
+ endfor
+
+ return l:output
+endfunction
+
+call ale#linter#Define('cs',{
+\ 'name': 'csc',
+\ 'output_stream': 'stdout',
+\ 'executable': 'csc',
+\ 'command': function('ale_linters#cs#csc#GetCommand'),
+\ 'callback': 'ale_linters#cs#csc#Handle',
+\ 'lint_file': 1
+\})
diff --git a/ale_linters/cs/mcsc.vim b/ale_linters/cs/mcsc.vim
index dd067eba..0e4e5667 100644
--- a/ale_linters/cs/mcsc.vim
+++ b/ale_linters/cs/mcsc.vim
@@ -52,20 +52,34 @@ function! ale_linters#cs#mcsc#Handle(buffer, lines) abort
" NOTE: pattern also captures file name as linter compiles all
" files within the source tree rooted at the specified source
" path and not just the file loaded in the buffer
- let l:pattern = '^\v(.+\.cs)\((\d+),(\d+)\)\: ([^ ]+) ([^ ]+): (.+)$'
+ let l:patterns = [
+ \ '^\v(.+\.cs)\((\d+),(\d+)\)\:\s+([^ ]+)\s+([cC][sS][^ ]+):\s(.+)$',
+ \ '^\v([^ ]+)\s+([Cc][sS][^ ]+):\s+(.+)$',
+ \]
let l:output = []
let l:dir = s:GetWorkingDirectory(a:buffer)
- for l:match in ale#util#GetMatches(a:lines, l:pattern)
- call add(l:output, {
- \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]),
- \ 'lnum': l:match[2] + 0,
- \ 'col': l:match[3] + 0,
- \ 'type': l:match[4] is# 'error' ? 'E' : 'W',
- \ 'code': l:match[5],
- \ 'text': l:match[6],
- \})
+ for l:match in ale#util#GetMatches(a:lines, l:patterns)
+ if len(l:match) > 6 && strlen(l:match[5]) > 2 && l:match[5][:1] is? 'CS'
+ call add(l:output, {
+ \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]),
+ \ 'lnum': l:match[2] + 0,
+ \ 'col': l:match[3] + 0,
+ \ 'type': l:match[4] is# 'error' ? 'E' : 'W',
+ \ 'code': l:match[5],
+ \ 'text': l:match[6] ,
+ \})
+ elseif strlen(l:match[2]) > 2 && l:match[2][:1] is? 'CS'
+ call add(l:output, {
+ \ 'filename':'<mcs>',
+ \ 'lnum': -1,
+ \ 'col': -1,
+ \ 'type': l:match[1] is# 'error' ? 'E' : 'W',
+ \ 'code': l:match[2],
+ \ 'text': l:match[3],
+ \})
+ endif
endfor
return l:output
diff --git a/ale_linters/elm/elm_ls.vim b/ale_linters/elm/elm_ls.vim
new file mode 100644
index 00000000..374ef8de
--- /dev/null
+++ b/ale_linters/elm/elm_ls.vim
@@ -0,0 +1,37 @@
+" Author: antew - https://github.com/antew
+" Description: elm-language-server integration for elm (diagnostics, formatting, and more)
+
+call ale#Set('elm_ls_executable', 'elm-language-server')
+call ale#Set('elm_ls_use_global', get(g:, 'ale_use_global_executables', 1))
+call ale#Set('elm_ls_elm_path', 'elm')
+call ale#Set('elm_ls_elm_format_path', 'elm-format')
+call ale#Set('elm_ls_elm_test_path', 'elm-test')
+
+function! elm_ls#GetRootDir(buffer) abort
+ let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json')
+
+ return !empty(l:elm_json) ? fnamemodify(l:elm_json, ':p:h') : ''
+endfunction
+
+function! elm_ls#GetOptions(buffer) abort
+ return {
+ \ 'runtime': 'node',
+ \ 'elmPath': ale#Var(a:buffer, 'elm_ls_elm_path'),
+ \ 'elmFormatPath': ale#Var(a:buffer, 'elm_ls_elm_format_path'),
+ \ 'elmTestPath': ale#Var(a:buffer, 'elm_ls_elm_test_path'),
+ \}
+endfunction
+
+call ale#linter#Define('elm', {
+\ 'name': 'elm_ls',
+\ 'lsp': 'stdio',
+\ 'executable': {b -> ale#node#FindExecutable(b, 'elm_ls', [
+\ 'node_modules/.bin/elm-language-server',
+\ 'node_modules/.bin/elm-lsp',
+\ 'elm-lsp'
+\ ])},
+\ 'command': '%e --stdio',
+\ 'project_root': function('elm_ls#GetRootDir'),
+\ 'language': 'elm',
+\ 'initialization_options': function('elm_ls#GetOptions')
+\})
diff --git a/ale_linters/elm/elm_lsp.vim b/ale_linters/elm/elm_lsp.vim
deleted file mode 100644
index 2259286f..00000000
--- a/ale_linters/elm/elm_lsp.vim
+++ /dev/null
@@ -1,22 +0,0 @@
-" Author: antew - https://github.com/antew
-" Description: LSP integration for elm, currently supports diagnostics (linting)
-
-call ale#Set('elm_lsp_executable', 'elm-lsp')
-call ale#Set('elm_lsp_use_global', get(g:, 'ale_use_global_executables', 0))
-
-function! elm_lsp#GetRootDir(buffer) abort
- let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json')
-
- return !empty(l:elm_json) ? fnamemodify(l:elm_json, ':p:h') : ''
-endfunction
-
-call ale#linter#Define('elm', {
-\ 'name': 'elm_lsp',
-\ 'lsp': 'stdio',
-\ 'executable': {b -> ale#node#FindExecutable(b, 'elm_lsp', [
-\ 'node_modules/.bin/elm-lsp',
-\ ])},
-\ 'command': '%e --stdio',
-\ 'project_root': function('elm_lsp#GetRootDir'),
-\ 'language': 'elm'
-\})
diff --git a/ale_linters/ruby/sorbet.vim b/ale_linters/ruby/sorbet.vim
new file mode 100644
index 00000000..ee765a6e
--- /dev/null
+++ b/ale_linters/ruby/sorbet.vim
@@ -0,0 +1,23 @@
+call ale#Set('ruby_sorbet_executable', 'srb')
+call ale#Set('ruby_sorbet_options', '')
+
+function! ale_linters#ruby#sorbet#GetCommand(buffer) abort
+ let l:executable = ale#Var(a:buffer, 'ruby_sorbet_executable')
+ let l:options = ale#Var(a:buffer, 'ruby_sorbet_options')
+
+ return ale#handlers#ruby#EscapeExecutable(l:executable, 'srb')
+ \ . ' tc'
+ \ . (!empty(l:options) ? ' ' . l:options : '')
+ \ . ' --lsp --disable-watchman'
+endfunction
+
+call ale#linter#Define('ruby', {
+\ 'name': 'sorbet',
+\ 'aliases': ['srb'],
+\ 'lsp': 'stdio',
+\ 'language': 'ruby',
+\ 'executable': {b -> ale#Var(b, 'ruby_sorbet_executable')},
+\ 'command': function('ale_linters#ruby#sorbet#GetCommand'),
+\ 'project_root': function('ale#ruby#FindProjectRoot')
+\})
+
diff --git a/ale_linters/rust/cargo.vim b/ale_linters/rust/cargo.vim
index f98dee9b..99178585 100644
--- a/ale_linters/rust/cargo.vim
+++ b/ale_linters/rust/cargo.vim
@@ -25,14 +25,11 @@ endfunction
function! ale_linters#rust#cargo#GetCommand(buffer, version) abort
let l:use_check = ale#Var(a:buffer, 'rust_cargo_use_check')
\ && ale#semver#GTE(a:version, [0, 17, 0])
- let l:use_all_targets = l:use_check
- \ && ale#Var(a:buffer, 'rust_cargo_check_all_targets')
+ let l:use_all_targets = ale#Var(a:buffer, 'rust_cargo_check_all_targets')
\ && ale#semver#GTE(a:version, [0, 22, 0])
- let l:use_examples = l:use_check
- \ && ale#Var(a:buffer, 'rust_cargo_check_examples')
+ let l:use_examples = ale#Var(a:buffer, 'rust_cargo_check_examples')
\ && ale#semver#GTE(a:version, [0, 22, 0])
- let l:use_tests = l:use_check
- \ && ale#Var(a:buffer, 'rust_cargo_check_tests')
+ let l:use_tests = ale#Var(a:buffer, 'rust_cargo_check_tests')
\ && ale#semver#GTE(a:version, [0, 22, 0])
let l:include_features = ale#Var(a:buffer, 'rust_cargo_include_features')
@@ -69,7 +66,15 @@ function! ale_linters#rust#cargo#GetCommand(buffer, version) abort
if ale#Var(a:buffer, 'rust_cargo_use_clippy')
let l:subcommand = 'clippy'
- let l:clippy_options = ' ' . ale#Var(a:buffer, 'rust_cargo_clippy_options')
+ let l:clippy_options = ale#Var(a:buffer, 'rust_cargo_clippy_options')
+
+ if l:clippy_options =~# '^-- '
+ let l:clippy_options = join(split(l:clippy_options, '-- '))
+ endif
+
+ if l:clippy_options isnot# ''
+ let l:clippy_options = ' -- ' . l:clippy_options
+ endif
endif
return l:nearest_cargo_prefix . 'cargo '