summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/elm/elm_lsp.vim22
-rw-r--r--ale_linters/json/jsonlint.vim23
-rw-r--r--ale_linters/php/langserver.vim6
-rw-r--r--ale_linters/powershell/psscriptanalyzer.vim105
-rw-r--r--autoload/ale/handlers/redpen.vim4
-rw-r--r--autoload/ale/linter.vim2
-rw-r--r--autoload/ale/references.vim16
-rw-r--r--doc/ale-elm.txt18
-rw-r--r--doc/ale-json.txt16
-rw-r--r--doc/ale-powershell.txt62
-rw-r--r--doc/ale-supported-languages-and-tools.txt3
-rw-r--r--doc/ale.txt362
-rw-r--r--supported-tools.md5
-rw-r--r--test/command_callback/php-langserver-project/with-composer/composer.json0
-rwxr-xr-xtest/command_callback/php-langserver-project/with-composer/vendor/bin/php-language-server.php0
-rwxr-xr-xtest/command_callback/php-langserver-project/with-git/vendor/bin/php-language-server.php0
-rw-r--r--test/command_callback/test_elm_lsp_command_callbacks.vader29
-rw-r--r--test/command_callback/test_php_langserver_callbacks.vader15
-rw-r--r--test/command_callback/test_psalm_command_callbacks.vader7
-rw-r--r--test/handler/test_psscriptanalyzer_handler.vader42
-rw-r--r--test/handler/test_redpen_handler.vader7
-rw-r--r--test/jsonlint-test-files/app-without-jsonlint/src/app.json0
-rw-r--r--test/jsonlint-test-files/app/node_modules/.bin/jsonlint0
-rw-r--r--test/jsonlint-test-files/app/src/app.json0
-rw-r--r--test/jsonlint-test-files/node_modules/jsonlint/lib/cli.js0
-rw-r--r--test/test_find_references.vader17
-rw-r--r--test/test_jsonlint_executable_detection.vader46
27 files changed, 416 insertions, 391 deletions
diff --git a/ale_linters/elm/elm_lsp.vim b/ale_linters/elm/elm_lsp.vim
new file mode 100644
index 00000000..2259286f
--- /dev/null
+++ b/ale_linters/elm/elm_lsp.vim
@@ -0,0 +1,22 @@
+" 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/json/jsonlint.vim b/ale_linters/json/jsonlint.vim
index f01553d6..f677b488 100644
--- a/ale_linters/json/jsonlint.vim
+++ b/ale_linters/json/jsonlint.vim
@@ -1,4 +1,21 @@
-" Author: KabbAmine <amine.kabb@gmail.com>
+" Author: KabbAmine <amine.kabb@gmail.com>, David Sierra <https://github.com/davidsierradz>
+
+call ale#Set('json_jsonlint_executable', 'jsonlint')
+call ale#Set('json_jsonlint_use_global', get(g:, 'ale_use_global_executables', 0))
+
+function! ale_linters#json#jsonlint#GetExecutable(buffer) abort
+ return ale#node#FindExecutable(a:buffer, 'json_jsonlint', [
+ \ 'node_modules/.bin/jsonlint',
+ \ 'node_modules/jsonlint/lib/cli.js',
+ \])
+endfunction
+
+function! ale_linters#json#jsonlint#GetCommand(buffer) abort
+ let l:executable = ale_linters#json#jsonlint#GetExecutable(a:buffer)
+
+ return ale#node#Executable(a:buffer, l:executable)
+ \ . ' --compact -'
+endfunction
function! ale_linters#json#jsonlint#Handle(buffer, lines) abort
" Matches patterns like the following:
@@ -19,8 +36,8 @@ endfunction
call ale#linter#Define('json', {
\ 'name': 'jsonlint',
-\ 'executable': 'jsonlint',
+\ 'executable': function('ale_linters#json#jsonlint#GetExecutable'),
\ 'output_stream': 'stderr',
-\ 'command': 'jsonlint --compact -',
+\ 'command': function('ale_linters#json#jsonlint#GetCommand'),
\ 'callback': 'ale_linters#json#jsonlint#Handle',
\})
diff --git a/ale_linters/php/langserver.vim b/ale_linters/php/langserver.vim
index c88281c4..fdd1bf2b 100644
--- a/ale_linters/php/langserver.vim
+++ b/ale_linters/php/langserver.vim
@@ -5,6 +5,12 @@ call ale#Set('php_langserver_executable', 'php-language-server.php')
call ale#Set('php_langserver_use_global', get(g:, 'ale_use_global_executables', 0))
function! ale_linters#php#langserver#GetProjectRoot(buffer) abort
+ let l:composer_path = ale#path#FindNearestFile(a:buffer, 'composer.json')
+
+ if (!empty(l:composer_path))
+ return fnamemodify(l:composer_path, ':h')
+ endif
+
let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git')
return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : ''
diff --git a/ale_linters/powershell/psscriptanalyzer.vim b/ale_linters/powershell/psscriptanalyzer.vim
new file mode 100644
index 00000000..8d1804f8
--- /dev/null
+++ b/ale_linters/powershell/psscriptanalyzer.vim
@@ -0,0 +1,105 @@
+" Author: Jesse Harris - https://github.com/zigford
+" Description: This file adds support for lintng powershell scripts
+" using the PSScriptAnalyzer module.
+
+" let g:ale_powershell_psscriptanalyzer_exclusions =
+" \ 'PSAvoidUsingWriteHost,PSAvoidGlobalVars'
+call ale#Set('powershell_psscriptanalyzer_exclusions', '')
+call ale#Set('powershell_psscriptanalyzer_executable', 'pwsh')
+call ale#Set('powershell_psscriptanalyzer_module',
+\ 'psscriptanalyzer')
+
+function! ale_linters#powershell#psscriptanalyzer#GetExecutable(buffer) abort
+ return ale#Var(a:buffer, 'powershell_psscriptanalyzer_executable')
+endfunction
+
+" Write a powershell script to a temp file for execution
+" return the command used to execute it
+function! s:TemporaryPSScript(buffer, input) abort
+ let l:filename = 'script.ps1'
+ " Create a temp dir to house our temp .ps1 script
+ " a temp dir is needed as powershell needs the .ps1
+ " extension
+ let l:tempdir = ale#util#Tempname() . (has('win32') ? '\' : '/')
+ let l:tempscript = l:tempdir . l:filename
+ " Create the temporary directory for the file, unreadable by 'other'
+ " users.
+ call mkdir(l:tempdir, '', 0750)
+ " Automatically delete the directory later.
+ call ale#command#ManageDirectory(a:buffer, l:tempdir)
+ " Write the script input out to a file.
+ call ale#util#Writefile(a:buffer, a:input, l:tempscript)
+
+ return l:tempscript
+endfunction
+
+function! ale_linters#powershell#psscriptanalyzer#RunPowerShell(buffer, command) abort
+ let l:executable = ale_linters#powershell#psscriptanalyzer#GetExecutable(
+ \ a:buffer)
+ let l:tempscript = s:TemporaryPSScript(a:buffer, a:command)
+
+ return ale#Escape(l:executable)
+ \ . ' -Exe Bypass -NoProfile -File '
+ \ . ale#Escape(l:tempscript)
+ \ . ' %t'
+endfunction
+
+" Run Invoke-ScriptAnalyzer and output each linting message as 4 seperate lines
+" for each parsing
+function! ale_linters#powershell#psscriptanalyzer#GetCommand(buffer) abort
+ let l:exclude_option = ale#Var(
+ \ a:buffer, 'powershell_psscriptanalyzer_exclusions')
+ let l:module = ale#Var(
+ \ a:buffer, 'powershell_psscriptanalyzer_module')
+ let l:script = ['Param($Script);
+ \ Invoke-ScriptAnalyzer "$Script" '
+ \ . (!empty(l:exclude_option) ? '-Exclude ' . l:exclude_option : '')
+ \ . '| ForEach-Object {
+ \ $_.Line;
+ \ $_.Severity;
+ \ $_.Message;
+ \ $_.RuleName}']
+
+ return ale_linters#powershell#psscriptanalyzer#RunPowerShell(
+ \ a:buffer, l:script)
+endfunction
+
+" add every 4 lines to an item(Dict) and every item to a list
+" return the list
+function! ale_linters#powershell#psscriptanalyzer#Handle(buffer, lines) abort
+ let l:output = []
+ let l:lcount = 0
+
+ for l:line in a:lines
+ if l:lcount is# 0
+ " the very first line
+ let l:item = {'lnum': str2nr(l:line)}
+ elseif l:lcount is# 1
+ if l:line is# 'Error'
+ let l:item['type'] = 'E'
+ elseif l:line is# 'Information'
+ let l:item['type'] = 'I'
+ else
+ let l:item['type'] = 'W'
+ endif
+ elseif l:lcount is# 2
+ let l:item['text'] = l:line
+ elseif l:lcount is# 3
+ let l:item['code'] = l:line
+ call add(l:output, l:item)
+ let l:lcount = -1
+ endif
+
+ let l:lcount = l:lcount + 1
+ endfor
+
+ return l:output
+endfunction
+
+call ale#linter#Define('powershell', {
+\ 'name': 'psscriptanalyzer',
+\ 'executable_callback': 'ale_linters#powershell#psscriptanalyzer#GetExecutable',
+\ 'command_callback': 'ale_linters#powershell#psscriptanalyzer#GetCommand',
+\ 'output_stream': 'stdout',
+\ 'callback': 'ale_linters#powershell#psscriptanalyzer#Handle',
+\})
diff --git a/autoload/ale/handlers/redpen.vim b/autoload/ale/handlers/redpen.vim
index 84e331ed..195057ca 100644
--- a/autoload/ale/handlers/redpen.vim
+++ b/autoload/ale/handlers/redpen.vim
@@ -4,10 +4,10 @@
function! ale#handlers#redpen#HandleRedpenOutput(buffer, lines) abort
" Only one file was passed to redpen. So response array has only one
" element.
- let l:res = json_decode(join(a:lines))[0]
+ let l:res = get(ale#util#FuzzyJSONDecode(a:lines, []), 0, {})
let l:output = []
- for l:err in l:res.errors
+ for l:err in get(l:res, 'errors', [])
let l:item = {
\ 'text': l:err.message,
\ 'type': 'W',
diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim
index 4937a6d7..d680391d 100644
--- a/autoload/ale/linter.vim
+++ b/autoload/ale/linter.vim
@@ -32,7 +32,7 @@ let s:default_ale_linter_aliases = {
" NOTE: Update the g:ale_linters documentation when modifying this.
let s:default_ale_linters = {
\ 'csh': ['shell'],
-\ 'elixir': ['credo', 'dialyxir', 'dogma', 'elixir-ls'],
+\ 'elixir': ['credo', 'dialyxir', 'dogma'],
\ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'],
\ 'help': [],
diff --git a/autoload/ale/references.vim b/autoload/ale/references.vim
index 0e88afe2..b9725e1e 100644
--- a/autoload/ale/references.vim
+++ b/autoload/ale/references.vim
@@ -49,13 +49,15 @@ function! ale#references#HandleLSPResponse(conn_id, response) abort
let l:result = get(a:response, 'result', [])
let l:item_list = []
- for l:response_item in l:result
- call add(l:item_list, {
- \ 'filename': ale#path#FromURI(l:response_item.uri),
- \ 'line': l:response_item.range.start.line + 1,
- \ 'column': l:response_item.range.start.character + 1,
- \})
- endfor
+ if type(l:result) is v:t_list
+ for l:response_item in l:result
+ call add(l:item_list, {
+ \ 'filename': ale#path#FromURI(l:response_item.uri),
+ \ 'line': l:response_item.range.start.line + 1,
+ \ 'column': l:response_item.range.start.character + 1,
+ \})
+ endfor
+ endif
if empty(l:item_list)
call ale#util#Execute('echom ''No references found.''')
diff --git a/doc/ale-elm.txt b/doc/ale-elm.txt
index de7d8939..bb7a6132 100644
--- a/doc/ale-elm.txt
+++ b/doc/ale-elm.txt
@@ -29,6 +29,24 @@ g:ale_elm_format_options *g:ale_elm_format_options*
This variable can be set to pass additional options to elm-format.
===============================================================================
+elm-lsp *ale-elm-elm-lsp*
+
+g:ale_elm_lsp_executable *g:ale_elm_lsp_executable*
+ *b:ale_elm_lsp_executable*
+ Type: |String|
+ Default: `'elm-lsp'`
+
+ See |ale-integrations-local-executables|
+
+
+g:ale_elm_lsp_use_global *g:ale_elm_lsp_use_global*
+ *b:ale_elm_lsp_use_global*
+ Type: |Number|
+ Default: `get(g:, 'ale_use_global_executables', 0)`
+
+ See |ale-integrations-local-executables|
+
+===============================================================================
elm-make *ale-elm-elm-make*
g:ale_elm_make_executable *g:ale_elm_make_executable*
diff --git a/doc/ale-json.txt b/doc/ale-json.txt
index 6a0a9fae..96499a04 100644
--- a/doc/ale-json.txt
+++ b/doc/ale-json.txt
@@ -52,7 +52,21 @@ g:ale_json_fixjson_use_global *g:ale_json_fixjson_use_global*
===============================================================================
jsonlint *ale-json-jsonlint*
-There are no options available.
+g:ale_json_jsonlint_executable *g:ale_json_jsonlint_executable*
+ *b:ale_json_jsonlint_executable*
+
+ Type: |String|
+ Default: `'jsonlint'`
+
+ The executable that will be run for jsonlint.
+
+g:ale_json_jsonlint_use_global *g:ale_json_jsonlint_use_global*
+ *b:ale_json_jsonlint_use_global*
+
+ Type: |Number|
+ Default: `get(g:, 'ale_use_global_executables', 0)`
+
+ See |ale-integrations-local-executables|
===============================================================================
diff --git a/doc/ale-powershell.txt b/doc/ale-powershell.txt
new file mode 100644
index 00000000..743b5ae3
--- /dev/null
+++ b/doc/ale-powershell.txt
@@ -0,0 +1,62 @@
+===============================================================================
+ALE PowerShell Integration *ale-powershell-options*
+
+
+===============================================================================
+psscriptanalyzer *ale-powershell-psscriptanalyzer*
+
+Installation
+-------------------------------------------------------------------------------
+
+Install PSScriptAnalyzer by any means, so long as it can be automatically
+imported in PowerShell.
+Some PowerShell plugins set the filetype of files to `ps1`. To continue using
+these plugins, use the ale_linter_aliases global to alias `ps1` to `powershell`
+
+>
+ " Allow ps1 filetype to work with powershell linters
+ let g:ale_linter_aliases = {'ps1': 'powershell'}
+<
+
+g:ale_powershell_psscriptanalyzer_executable
+*g:ale_powershell_psscriptanalyzer_executable*
+ *b:ale_powershell_psscriptanalyzer_executable*
+ Type: |String|
+ Default: `'pwsh'`
+
+ This variable sets executable used for powershell.
+
+ For example, on Windows you could set powershell to be Windows Powershell:
+>
+ let g:ale_powershell_psscriptanalyzer_executable = 'powershell.exe'
+<
+
+g:ale_powershell_psscriptanalyzer_module
+*g:ale_powershell_psscriptanalyzer_module*
+ *b:ale_powershell_psscriptanalyzer_module*
+ Type: |String
+ Default: `'psscriptanalyzer'`
+
+ This variable sets the name of the psscriptanalyzer module.
+ for psscriptanalyzer invocation.
+
+
+g:ale_powershell_psscriptanalyzer_exclusions
+*g:ale_powershell_psscriptanalyzer_exclusions*
+ *b:ale_powershell_psscriptanalyzer_exclusions*
+ Type: |String|
+ Default: `''`
+
+ Set this variable to exclude test(s) for psscriptanalyzer
+ (-ExcludeRule option). To exclude more than one option, separate them with
+ commas.
+
+>
+ " Suppress Write-Host and Global vars warnings
+ let g:ale_powershell_psscriptanalyzer_exclusions =
+ \ 'PSAvoidUsingWriteHost,PSAvoidGlobalVars'
+<
+
+
+===============================================================================
+ vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt
index d3409384..5ca66ace 100644
--- a/doc/ale-supported-languages-and-tools.txt
+++ b/doc/ale-supported-languages-and-tools.txt
@@ -118,6 +118,7 @@ Notes:
* `mix`!!
* Elm
* `elm-format`
+ * `elm-lsp`
* `elm-make`
* Erb
* `erb`
@@ -314,6 +315,8 @@ Notes:
* `write-good`
* Pony
* `ponyc`
+* PowerShell
+ * `psscriptanalyzer`
* Prolog
* `swipl`
* proto
diff --git a/doc/ale.txt b/doc/ale.txt
index 3812c92d..5f96095a 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -48,363 +48,6 @@ ALE supports the following key features for linting:
5. Setting |signs| with warnings and errors for error markers.
6. Using |echo| to show error messages when the cursor moves.
7. Setting syntax highlights for errors.
- ada...................................|ale-ada-options|
- gcc.................................|ale-ada-gcc|
- ansible...............................|ale-ansible-options|
- ansible-lint........................|ale-ansible-ansible-lint|
- asciidoc..............................|ale-asciidoc-options|
- write-good..........................|ale-asciidoc-write-good|
- textlint............................|ale-asciidoc-textlint|
- asm...................................|ale-asm-options|
- gcc.................................|ale-asm-gcc|
- awk...................................|ale-awk-options|
- gawk................................|ale-awk-gawk|
- bib...................................|ale-bib-options|
- bibclean............................|ale-bib-bibclean|
- c.....................................|ale-c-options|
- clang...............................|ale-c-clang|
- clangd..............................|ale-c-clangd|
- clang-format........................|ale-c-clangformat|
- clangtidy...........................|ale-c-clangtidy|
- cppcheck............................|ale-c-cppcheck|
- cquery..............................|ale-c-cquery|
- flawfinder..........................|ale-c-flawfinder|
- gcc.................................|ale-c-gcc|
- uncrustify..........................|ale-c-uncrustify|
- ccls................................|ale-c-ccls|
- chef..................................|ale-chef-options|
- foodcritic..........................|ale-chef-foodcritic|
- clojure...............................|ale-clojure-options|
- joker...............................|ale-clojure-joker|
- cloudformation........................|ale-cloudformation-options|
- cfn-python-lint.....................|ale-cloudformation-cfn-python-lint|
- cmake.................................|ale-cmake-options|
- cmakelint...........................|ale-cmake-cmakelint|
- cmake-format........................|ale-cmake-cmakeformat|
- cpp...................................|ale-cpp-options|
- clang...............................|ale-cpp-clang|
- clangd..............................|ale-cpp-clangd|
- clangcheck..........................|ale-cpp-clangcheck|
- clang-format........................|ale-cpp-clangformat|
- clangtidy...........................|ale-cpp-clangtidy|
- clazy...............................|ale-cpp-clazy|
- cppcheck............................|ale-cpp-cppcheck|
- cpplint.............................|ale-cpp-cpplint|
- cquery..............................|ale-cpp-cquery|
- flawfinder..........................|ale-cpp-flawfinder|
- gcc.................................|ale-cpp-gcc|
- uncrustify..........................|ale-cpp-uncrustify|
- ccls................................|ale-cpp-ccls|
- c#....................................|ale-cs-options|
- mcs.................................|ale-cs-mcs|
- mcsc................................|ale-cs-mcsc|
- uncrustify..........................|ale-cs-uncrustify|
- css...................................|ale-css-options|
- prettier............................|ale-css-prettier|
- stylelint...........................|ale-css-stylelint|
- cuda..................................|ale-cuda-options|
- nvcc................................|ale-cuda-nvcc|
- clang-format........................|ale-cuda-clangformat|
- d.....................................|ale-d-options|
- dls.................................|ale-d-dls|
- uncrustify..........................|ale-d-uncrustify|
- dart..................................|ale-dart-options|
- dartanalyzer........................|ale-dart-dartanalyzer|
- dartfmt.............................|ale-dart-dartfmt|
- dockerfile............................|ale-dockerfile-options|
- dockerfile_lint.....................|ale-dockerfile-dockerfile_lint|
- hadolint............................|ale-dockerfile-hadolint|
- elixir................................|ale-elixir-options|
- mix.................................|ale-elixir-mix|
- mix_format..........................|ale-elixir-mix-format|
- dialyxir............................|ale-elixir-dialyxir|
- elixir-ls...........................|ale-elixir-elixir-ls|
- credo...............................|ale-elixir-credo|
- elm...................................|ale-elm-options|
- elm-format..........................|ale-elm-elm-format|
- elm-make............................|ale-elm-elm-make|
- erlang................................|ale-erlang-options|
- erlc................................|ale-erlang-erlc|
- syntaxerl...........................|ale-erlang-syntaxerl|
- eruby.................................|ale-eruby-options|
- ruumba..............................|ale-eruby-ruumba|
- fish..................................|ale-fish-options|
- fortran...............................|ale-fortran-options|
- gcc.................................|ale-fortran-gcc|
- language_server.....................|ale-fortran-language-server|
- fountain..............................|ale-fountain-options|
- fusionscript..........................|ale-fuse-options|
- fusion-lint.........................|ale-fuse-fusionlint|
- git commit............................|ale-gitcommit-options|
- gitlint.............................|ale-gitcommit-gitlint|
- glsl..................................|ale-glsl-options|
- glslang.............................|ale-glsl-glslang|
- glslls..............................|ale-glsl-glslls|
- go....................................|ale-go-options|
- gobuild.............................|ale-go-gobuild|
- gofmt...............................|ale-go-gofmt|
- golint..............................|ale-go-golint|
- govet...............................|ale-go-govet|
- gometalinter........................|ale-go-gometalinter|
- staticcheck.........................|ale-go-staticcheck|
- golangserver........................|ale-go-golangserver|
- golangci-lint.......................|ale-go-golangci-lint|
- bingo...............................|ale-go-bingo|
- graphql...............................|ale-graphql-options|
- eslint..............................|ale-graphql-eslint|
- gqlint..............................|ale-graphql-gqlint|
- prettier............................|ale-graphql-prettier|
- hack..................................|ale-hack-options|
- hack................................|ale-hack-hack|
- hackfmt.............................|ale-hack-hackfmt|
- hhast...............................|ale-hack-hhast|
- handlebars............................|ale-handlebars-options|
- ember-template-lint.................|ale-handlebars-embertemplatelint|
- haskell...............................|ale-haskell-options|
- brittany............................|ale-haskell-brittany|
- ghc.................................|ale-haskell-ghc|
- ghc-mod.............................|ale-haskell-ghc-mod|
- cabal-ghc...........................|ale-haskell-cabal-ghc|
- hdevtools...........................|ale-haskell-hdevtools|
- hfmt................................|ale-haskell-hfmt|
- hlint...............................|ale-haskell-hlint|
- stack-build.........................|ale-haskell-stack-build|
- stack-ghc...........................|ale-haskell-stack-ghc|
- stylish-haskell.....................|ale-haskell-stylish-haskell|
- hie.................................|ale-haskell-hie|
- hcl...................................|ale-hcl-options|
- terraform-fmt.......................|ale-hcl-terraform-fmt|
- html..................................|ale-html-options|
- htmlhint............................|ale-html-htmlhint|
- tidy................................|ale-html-tidy|
- prettier............................|ale-html-prettier|
- stylelint...........................|ale-html-stylelint|
- write-good..........................|ale-html-write-good|
- idris.................................|ale-idris-options|
- idris...............................|ale-idris-idris|
- ispc..................................|ale-ispc-options|
- ispc................................|ale-ispc-ispc|
- java..................................|ale-java-options|
- checkstyle..........................|ale-java-checkstyle|
- javac...............................|ale-java-javac|
- google-java-format..................|ale-java-google-java-format|
- pmd.................................|ale-java-pmd|
- javalsp.............................|ale-java-javalsp|
- uncrustify..........................|ale-java-uncrustify|
- javascript............................|ale-javascript-options|
- eslint..............................|ale-javascript-eslint|
- flow................................|ale-javascript-flow|
- importjs............................|ale-javascript-importjs|
- jscs................................|ale-javascript-jscs|
- jshint..............................|ale-javascript-jshint|
- prettier............................|ale-javascript-prettier|
- prettier-eslint.....................|ale-javascript-prettier-eslint|
- prettier-standard...................|ale-javascript-prettier-standard|
- standard............................|ale-javascript-standard|
- xo..................................|ale-javascript-xo|
- json..................................|ale-json-options|
- fixjson.............................|ale-json-fixjson|
- jsonlint............................|ale-json-jsonlint|
- jq..................................|ale-json-jq|
- prettier............................|ale-json-prettier|
- julia.................................|ale-julia-options|
- languageserver......................|ale-julia-languageserver|
- kotlin................................|ale-kotlin-options|
- kotlinc.............................|ale-kotlin-kotlinc|
- ktlint..............................|ale-kotlin-ktlint|
- languageserver......................|ale-kotlin-languageserver|
- latex.................................|ale-latex-options|
- write-good..........................|ale-latex-write-good|
- textlint............................|ale-latex-textlint|
- less..................................|ale-less-options|
- lessc...............................|ale-less-lessc|
- prettier............................|ale-less-prettier|
- stylelint...........................|ale-less-stylelint|
- llvm..................................|ale-llvm-options|
- llc.................................|ale-llvm-llc|
- lua...................................|ale-lua-options|
- luac................................|ale-lua-luac|
- luacheck............................|ale-lua-luacheck|
- markdown..............................|ale-markdown-options|
- mdl.................................|ale-markdown-mdl|
- prettier............................|ale-markdown-prettier|
- remark-lint.........................|ale-markdown-remark-lint|
- textlint............................|ale-markdown-textlint|
- write-good..........................|ale-markdown-write-good|
- mercury...............................|ale-mercury-options|
- mmc.................................|ale-mercury-mmc|
- nasm..................................|ale-nasm-options|
- nasm................................|ale-nasm-nasm|
- nroff.................................|ale-nroff-options|
- write-good..........................|ale-nroff-write-good|
- objc..................................|ale-objc-options|
- clang...............................|ale-objc-clang|
- clangd..............................|ale-objc-clangd|
- uncrustify..........................|ale-objc-uncrustify|
- ccls................................|ale-objc-ccls|
- objcpp................................|ale-objcpp-options|
- clang...............................|ale-objcpp-clang|
- clangd..............................|ale-objcpp-clangd|
- uncrustify..........................|ale-objcpp-uncrustify|
- ocaml.................................|ale-ocaml-options|
- merlin..............................|ale-ocaml-merlin|
- ols.................................|ale-ocaml-ols|
- ocamlformat.........................|ale-ocaml-ocamlformat|
- pawn..................................|ale-pawn-options|
- uncrustify..........................|ale-pawn-uncrustify|
- perl..................................|ale-perl-options|
- perl................................|ale-perl-perl|
- perlcritic..........................|ale-perl-perlcritic|
- perltidy............................|ale-perl-perltidy|
- perl6.................................|ale-perl6-options|
- perl6...............................|ale-perl6-perl6|
- php...................................|ale-php-options|
- langserver..........................|ale-php-langserver|
- phan................................|ale-php-phan|
- phpcbf..............................|ale-php-phpcbf|
- phpcs...............................|ale-php-phpcs|
- phpmd...............................|ale-php-phpmd|
- phpstan.............................|ale-php-phpstan|
- psalm...............................|ale-php-psalm|
- php-cs-fixer........................|ale-php-php-cs-fixer|
- php.................................|ale-php-php|
- po....................................|ale-po-options|
- write-good..........................|ale-po-write-good|
- pod...................................|ale-pod-options|
- write-good..........................|ale-pod-write-good|
- pony..................................|ale-pony-options|
- ponyc...............................|ale-pony-ponyc|
- prolog................................|ale-prolog-options|
- swipl...............................|ale-prolog-swipl|
- proto.................................|ale-proto-options|
- protoc-gen-lint.....................|ale-proto-protoc-gen-lint|
- pug...................................|ale-pug-options|
- puglint.............................|ale-pug-puglint|
- puppet................................|ale-puppet-options|
- puppet..............................|ale-puppet-puppet|
- puppetlint..........................|ale-puppet-puppetlint|
- puppet-languageserver...............|ale-puppet-languageserver|
- pyrex (cython)........................|ale-pyrex-options|
- cython..............................|ale-pyrex-cython|
- python................................|ale-python-options|
- autopep8............................|ale-python-autopep8|
- bandit..............................|ale-python-bandit|
- black...............................|ale-python-black|
- flake8..............................|ale-python-flake8|
- isort...............................|ale-python-isort|
- mypy................................|ale-python-mypy|
- prospector..........................|ale-python-prospector|
- pycodestyle.........................|ale-python-pycodestyle|
- pydocstyle..........................|ale-python-pydocstyle|
- pyflakes............................|ale-python-pyflakes|
- pylama..............................|ale-python-pylama|
- pylint..............................|ale-python-pylint|
- pyls................................|ale-python-pyls|
- pyre................................|ale-python-pyre|
- vulture.............................|ale-python-vulture|
- yapf................................|ale-python-yapf|
- qml...................................|ale-qml-options|
- qmlfmt..............................|ale-qml-qmlfmt|
- r.....................................|ale-r-options|
- lintr...............................|ale-r-lintr|
- reasonml..............................|ale-reasonml-options|
- merlin..............................|ale-reasonml-merlin|
- ols.................................|ale-reasonml-ols|
- refmt...............................|ale-reasonml-refmt|
- restructuredtext......................|ale-restructuredtext-options|
- textlint............................|ale-restructuredtext-textlint|
- write-good..........................|ale-restructuredtext-write-good|
- ruby..................................|ale-ruby-options|
- brakeman............................|ale-ruby-brakeman|
- rails_best_practices................|ale-ruby-rails_best_practices|
- reek................................|ale-ruby-reek|
- rubocop.............................|ale-ruby-rubocop|
- ruby................................|ale-ruby-ruby|
- rufo................................|ale-ruby-rufo|
- solargraph..........................|ale-ruby-solargraph|
- standardrb..........................|ale-ruby-standardrb|
- rust..................................|ale-rust-options|
- cargo...............................|ale-rust-cargo|
- rls.................................|ale-rust-rls|
- rustc...............................|ale-rust-rustc|
- rustfmt.............................|ale-rust-rustfmt|
- sass..................................|ale-sass-options|
- sasslint............................|ale-sass-sasslint|
- stylelint...........................|ale-sass-stylelint|
- scala.................................|ale-scala-options|
- sbtserver...........................|ale-scala-sbtserver|
- scalafmt............................|ale-scala-scalafmt|
- scalastyle..........................|ale-scala-scalastyle|
- scss..................................|ale-scss-options|
- prettier............................|ale-scss-prettier|
- sasslint............................|ale-scss-sasslint|
- stylelint...........................|ale-scss-stylelint|
- sh....................................|ale-sh-options|
- sh-language-server..................|ale-sh-language-server|
- shell...............................|ale-sh-shell|
- shellcheck..........................|ale-sh-shellcheck|
- shfmt...............................|ale-sh-shfmt|
- sml...................................|ale-sml-options|
- smlnj...............................|ale-sml-smlnj|
- solidity..............................|ale-solidity-options|
- solhint.............................|ale-solidity-solhint|
- solium..............................|ale-solidity-solium|
- spec..................................|ale-spec-options|
- rpmlint.............................|ale-spec-rpmlint|
- sql...................................|ale-sql-options|
- sqlfmt..............................|ale-sql-sqlfmt|
- stylus................................|ale-stylus-options|
- stylelint...........................|ale-stylus-stylelint|
- sugarss...............................|ale-sugarss-options|
- stylelint...........................|ale-sugarss-stylelint|
- tcl...................................|ale-tcl-options|
- nagelfar............................|ale-tcl-nagelfar|
- terraform.............................|ale-terraform-options|
- fmt.................................|ale-terraform-fmt|
- tflint..............................|ale-terraform-tflint|
- tex...................................|ale-tex-options|
- chktex..............................|ale-tex-chktex|
- lacheck.............................|ale-tex-lacheck|
- texinfo...............................|ale-texinfo-options|
- write-good..........................|ale-texinfo-write-good|
- text..................................|ale-text-options|
- textlint............................|ale-text-textlint|
- write-good..........................|ale-text-write-good|
- thrift................................|ale-thrift-options|
- thrift..............................|ale-thrift-thrift|
- typescript............................|ale-typescript-options|
- eslint..............................|ale-typescript-eslint|
- prettier............................|ale-typescript-prettier|
- tslint..............................|ale-typescript-tslint|
- tsserver............................|ale-typescript-tsserver|
- vala..................................|ale-vala-options|
- uncrustify..........................|ale-vala-uncrustify|
- verilog/systemverilog.................|ale-verilog-options|
- iverilog............................|ale-verilog-iverilog|
- verilator...........................|ale-verilog-verilator|
- vlog................................|ale-verilog-vlog|
- xvlog...............................|ale-verilog-xvlog|
- vhdl..................................|ale-vhdl-options|
- ghdl................................|ale-vhdl-ghdl|
- vcom................................|ale-vhdl-vcom|
- xvhdl...............................|ale-vhdl-xvhdl|
- vim...................................|ale-vim-options|
- vint................................|ale-vim-vint|
- vim help..............................|ale-vim-help-options|
- write-good..........................|ale-vim-help-write-good|
- vue...................................|ale-vue-options|
- prettier............................|ale-vue-prettier|
- vls.................................|ale-vue-vls|
- xhtml.................................|ale-xhtml-options|
- write-good..........................|ale-xhtml-write-good|
- xml...................................|ale-xml-options|
- xmllint.............................|ale-xml-xmllint|
- yaml..................................|ale-yaml-options|
- prettier............................|ale-yaml-prettier|
- swaglint............................|ale-yaml-swaglint|
- yamllint............................|ale-yaml-yamllint|
- yang..................................|ale-yang-options|
- yang-lsp............................|ale-yang-lsp|
ALE can fix problems with files with the |ALEFix| command, using the same job
control functionality used for checking for problems. Try using the
@@ -1341,7 +984,7 @@ g:ale_linters *g:ale_linters*
{
\ 'csh': ['shell'],
- \ 'elixir': ['credo', 'dialyxir', 'dogma', 'elixir-ls'],
+ \ 'elixir': ['credo', 'dialyxir', 'dogma'],
\ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'],
\ 'help': [],
@@ -2260,6 +1903,7 @@ documented in additional help files.
credo.................................|ale-elixir-credo|
elm.....................................|ale-elm-options|
elm-format............................|ale-elm-elm-format|
+ elm-lsp...............................|ale-elm-elm-lsp|
elm-make..............................|ale-elm-elm-make|
erlang..................................|ale-erlang-options|
erlc..................................|ale-erlang-erlc|
@@ -2412,6 +2056,8 @@ documented in additional help files.
write-good............................|ale-pod-write-good|
pony....................................|ale-pony-options|
ponyc.................................|ale-pony-ponyc|
+ powershell............................|ale-powershell-options|
+ psscriptanalyzer....................|ale-powershell-psscriptanalyzer|
prolog..................................|ale-prolog-options|
swipl.................................|ale-prolog-swipl|
proto...................................|ale-proto-options|
diff --git a/supported-tools.md b/supported-tools.md
index 0c3b2ca6..0f60c4ce 100644
--- a/supported-tools.md
+++ b/supported-tools.md
@@ -123,10 +123,11 @@ formatting.
* [credo](https://github.com/rrrene/credo)
* [dialyxir](https://github.com/jeremyjh/dialyxir)
* [dogma](https://github.com/lpil/dogma)
- * [elixir-ls](https://github.com/JakeBecker/elixir-ls)
+ * [elixir-ls](https://github.com/JakeBecker/elixir-ls) :warning:
* [mix](https://hexdocs.pm/mix/Mix.html) :warning: :floppy_disk:
* Elm
* [elm-format](https://github.com/avh4/elm-format)
+ * [elm-lsp](https://github.com/antew/elm-lsp)
* [elm-make](https://github.com/elm-lang/elm-make)
* Erb
* [erb](https://apidock.com/ruby/ERB)
@@ -323,6 +324,8 @@ formatting.
* [write-good](https://github.com/btford/write-good)
* Pony
* [ponyc](https://github.com/ponylang/ponyc)
+* PowerShell
+ * [psscriptanalyzer](https://github.com/PowerShell/PSScriptAnalyzer) :floppy_disk
* Prolog
* [swipl](https://github.com/SWI-Prolog/swipl-devel)
* proto
diff --git a/test/command_callback/php-langserver-project/with-composer/composer.json b/test/command_callback/php-langserver-project/with-composer/composer.json
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/php-langserver-project/with-composer/composer.json
diff --git a/test/command_callback/php-langserver-project/with-composer/vendor/bin/php-language-server.php b/test/command_callback/php-langserver-project/with-composer/vendor/bin/php-language-server.php
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/php-langserver-project/with-composer/vendor/bin/php-language-server.php
diff --git a/test/command_callback/php-langserver-project/with-git/vendor/bin/php-language-server.php b/test/command_callback/php-langserver-project/with-git/vendor/bin/php-language-server.php
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/php-langserver-project/with-git/vendor/bin/php-language-server.php
diff --git a/test/command_callback/test_elm_lsp_command_callbacks.vader b/test/command_callback/test_elm_lsp_command_callbacks.vader
new file mode 100644
index 00000000..d06ef134
--- /dev/null
+++ b/test/command_callback/test_elm_lsp_command_callbacks.vader
@@ -0,0 +1,29 @@
+Before:
+ call ale#assert#SetUpLinterTest('elm', 'elm_lsp')
+
+After:
+ call ale#assert#TearDownLinterTest()
+
+Execute(The default executable path should be correct):
+ call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm')
+
+ AssertLinter 'elm-lsp', ale#Escape('elm-lsp') . ' --stdio'
+
+Execute(The project root should be detected correctly):
+ AssertLSPProject ''
+
+ call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm')
+
+ AssertLSPProject ale#path#Simplify(g:dir . '/../elm-test-files/newapp')
+
+Execute(Should let users configure a global executable and override local paths):
+ call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm')
+
+ let g:ale_elm_lsp_executable = '/path/to/custom/elm-lsp'
+ let g:ale_elm_lsp_use_global = 1
+
+ AssertLinter '/path/to/custom/elm-lsp',
+ \ ale#Escape('/path/to/custom/elm-lsp') . ' --stdio'
+
+Execute(The language should be correct):
+ AssertLSPLanguage 'elm'
diff --git a/test/command_callback/test_php_langserver_callbacks.vader b/test/command_callback/test_php_langserver_callbacks.vader
index 3b0a427e..59c3fe6c 100644
--- a/test/command_callback/test_php_langserver_callbacks.vader
+++ b/test/command_callback/test_php_langserver_callbacks.vader
@@ -2,10 +2,6 @@ Before:
call ale#assert#SetUpLinterTest('php', 'langserver')
After:
- if isdirectory(g:dir . '/.git')
- call delete(g:dir . '/.git', 'd')
- endif
-
call ale#assert#TearDownLinterTest()
Execute(The default executable path should be correct):
@@ -23,7 +19,12 @@ Execute(Vendor executables should be detected):
\ ))
Execute(The project path should be correct for .git directories):
- call ale#test#SetFilename('php-langserver-project/test.php')
- call mkdir(g:dir . '/.git')
+ call ale#test#SetFilename('php-langserver-project/with-git/test.php')
+ silent! call mkdir('php-langserver-project/with-git/.git')
+
+ AssertLSPProject ale#path#Simplify(g:dir . '/php-langserver-project/with-git')
+
+Execute(The project path should be correct for composer.json file):
+ call ale#test#SetFilename('php-langserver-project/with-composer/test.php')
- AssertLSPProject g:dir
+ AssertLSPProject ale#path#Simplify(g:dir . '/php-langserver-project/with-composer')
diff --git a/test/command_callback/test_psalm_command_callbacks.vader b/test/command_callback/test_psalm_command_callbacks.vader
index d731054f..33d770c2 100644
--- a/test/command_callback/test_psalm_command_callbacks.vader
+++ b/test/command_callback/test_psalm_command_callbacks.vader
@@ -24,6 +24,9 @@ Execute(Vendor executables should be detected):
Execute(The project path should be correct for .git directories):
call ale#test#SetFilename('psalm-project/test.php')
- call mkdir(g:dir . '/.git')
- AssertLSPProject g:dir \ No newline at end of file
+ if !isdirectory(g:dir . '/.git')
+ call mkdir(g:dir . '/.git')
+ endif
+
+ AssertLSPProject g:dir
diff --git a/test/handler/test_psscriptanalyzer_handler.vader b/test/handler/test_psscriptanalyzer_handler.vader
new file mode 100644
index 00000000..060d5941
--- /dev/null
+++ b/test/handler/test_psscriptanalyzer_handler.vader
@@ -0,0 +1,42 @@
+Before:
+ runtime ale_linters/powershell/psscriptanalyzer.vim
+
+After:
+ call ale#linter#Reset()
+
+Execute(The psscriptanalyzer handler should handle basic information or warnings):
+ AssertEqual
+ \ [
+ \ {
+ \ 'lnum': 1,
+ \ 'type': 'I',
+ \ 'text': 'The cmdlet ''Get-GithubRepo'' does not have a help comment.',
+ \ 'code': 'PSProvideCommentHelp',
+ \ },
+ \ {
+ \ 'lnum': 9,
+ \ 'type': 'W',
+ \ 'text': '''%'' is an alias of ''ForEach-Object''. Alias can introduce possible problems and make scripts hard to maintain. Please consider changing alias to its full content.',
+ \ 'code': 'PSAvoidUsingCmdletAliases',
+ \ },
+ \ {
+ \ 'lnum': 23,
+ \ 'type': 'E',
+ \ 'text': 'The ComputerName parameter of a cmdlet should not be hardcoded as this will expose sensitive information about the system.',
+ \ 'code': 'PSAvoidUsingComputerNameHardcoded',
+ \ },
+ \ ],
+ \ ale_linters#powershell#psscriptanalyzer#Handle(bufnr(''), [
+ \ '1',
+ \ 'Information',
+ \ 'The cmdlet ''Get-GithubRepo'' does not have a help comment.',
+ \ 'PSProvideCommentHelp',
+ \ '9',
+ \ 'Warning',
+ \ '''%'' is an alias of ''ForEach-Object''. Alias can introduce possible problems and make scripts hard to maintain. Please consider changing alias to its full content.',
+ \ 'PSAvoidUsingCmdletAliases',
+ \ '23',
+ \ 'Error',
+ \ 'The ComputerName parameter of a cmdlet should not be hardcoded as this will expose sensitive information about the system.',
+ \ 'PSAvoidUsingComputerNameHardcoded',
+ \ ])
diff --git a/test/handler/test_redpen_handler.vader b/test/handler/test_redpen_handler.vader
index 4490bcba..0b030e2d 100644
--- a/test/handler/test_redpen_handler.vader
+++ b/test/handler/test_redpen_handler.vader
@@ -80,7 +80,7 @@ Execute(redpen handler should handle errors output):
\ ']',
\ ])
-Execute(redpen handler should no error output):
+Execute(The redpen handler should handle an empty error list):
AssertEqual
\ [],
\ ale#handlers#redpen#HandleRedpenOutput(bufnr(''), [
@@ -91,3 +91,8 @@ Execute(redpen handler should no error output):
\ ' }',
\ ']',
\ ])
+
+Execute(The redpen handler should handle totally empty output):
+ AssertEqual
+ \ [],
+ \ ale#handlers#redpen#HandleRedpenOutput(bufnr(''), [])
diff --git a/test/jsonlint-test-files/app-without-jsonlint/src/app.json b/test/jsonlint-test-files/app-without-jsonlint/src/app.json
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/jsonlint-test-files/app-without-jsonlint/src/app.json
diff --git a/test/jsonlint-test-files/app/node_modules/.bin/jsonlint b/test/jsonlint-test-files/app/node_modules/.bin/jsonlint
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/jsonlint-test-files/app/node_modules/.bin/jsonlint
diff --git a/test/jsonlint-test-files/app/src/app.json b/test/jsonlint-test-files/app/src/app.json
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/jsonlint-test-files/app/src/app.json
diff --git a/test/jsonlint-test-files/node_modules/jsonlint/lib/cli.js b/test/jsonlint-test-files/node_modules/jsonlint/lib/cli.js
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/jsonlint-test-files/node_modules/jsonlint/lib/cli.js
diff --git a/test/test_find_references.vader b/test/test_find_references.vader
index eb06e3bc..1a147849 100644
--- a/test/test_find_references.vader
+++ b/test/test_find_references.vader
@@ -253,14 +253,15 @@ Execute(LSP reference responses should be handled):
Execute(Preview windows should not be opened for empty LSP reference responses):
call ale#references#SetMap({3: {}})
- call ale#references#HandleLSPResponse(
- \ 1,
- \ {
- \ 'id': 3,
- \ 'result': [
- \ ],
- \ }
- \)
+ call ale#references#HandleLSPResponse(1, {'id': 3, 'result': []})
+
+ Assert !g:preview_called
+ AssertEqual {}, ale#references#GetMap()
+ AssertEqual ['echom ''No references found.'''], g:expr_list
+
+Execute(LSP reference responses with a null result should be handled):
+ call ale#references#SetMap({3: {}})
+ call ale#references#HandleLSPResponse(1, {'id': 3, 'result': v:null})
Assert !g:preview_called
AssertEqual {}, ale#references#GetMap()
diff --git a/test/test_jsonlint_executable_detection.vader b/test/test_jsonlint_executable_detection.vader
new file mode 100644
index 00000000..bd391b47
--- /dev/null
+++ b/test/test_jsonlint_executable_detection.vader
@@ -0,0 +1,46 @@
+Before:
+ call ale#test#SetDirectory('/testplugin/test')
+
+ runtime ale_linters/json/jsonlint.vim
+
+After:
+ let g:ale_has_override = {}
+ let g:ale_json_jsonlint_executable = 'jsonlint'
+ let g:ale_json_jsonlint_use_global = 0
+
+ call ale#test#RestoreDirectory()
+ call ale#linter#Reset()
+
+Execute(local executable should be detected correctly):
+ call ale#test#SetFilename('jsonlint-test-files/app/src/app.json')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/jsonlint-test-files/app/node_modules/.bin/jsonlint'),
+ \ ale_linters#json#jsonlint#GetExecutable(bufnr(''))
+
+Execute(recursively executable should be detected correctly):
+ call ale#test#SetFilename('jsonlint-test-files/app-without-jsonlint/src/app.json')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/jsonlint-test-files/node_modules/jsonlint/lib/cli.js'),
+ \ ale_linters#json#jsonlint#GetExecutable(bufnr(''))
+
+Execute(use_global should override project executable):
+ let g:ale_json_jsonlint_use_global = 1
+
+ call ale#test#SetFilename('jsonlint-test-files/app/src/app.json')
+
+ AssertEqual
+ \ 'jsonlint',
+ \ ale_linters#json#jsonlint#GetExecutable(bufnr(''))
+
+Execute(manually defined should override default executable):
+ let g:ale_json_jsonlint_use_global = 1
+ let g:ale_json_jsonlint_executable = 'custom_jsonlint'
+
+ call ale#test#SetFilename('jsonlint-test-files/app/src/app.json')
+
+ AssertEqual
+ \ 'custom_jsonlint',
+ \ ale_linters#json#jsonlint#GetExecutable(bufnr(''))
+