From ba38688dffd846a633ae2c076441927c864ffd5f Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Tue, 1 Jan 2019 20:42:06 +0200 Subject: support tests/ with elm 0.19.0 With earlier elm versions, a separate package file is maintained for tests, which when properly configured enabled the compiler to find what it needed to compile the tests. Under elm 0.19, test dependencies are managed in the top-level package file, so `elm make` will fail on the tests. `elm-test make` is required in this case. See https://github.com/elm-explorations/test/issues/64 --- ale_linters/elm/make.vim | 66 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 7 deletions(-) (limited to 'ale_linters/elm/make.vim') diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index ddea983f..a6884750 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -137,9 +137,7 @@ function! ale_linters#elm#make#ParseMessageItem(item) abort endif endfunction -" Return the command to execute the linter in the projects directory. -" If it doesn't, then this will fail when imports are needed. -function! ale_linters#elm#make#GetCommand(buffer) abort +function! ale_linters#elm#make#GetPackageFile(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json') if empty(l:elm_json) @@ -147,10 +145,55 @@ function! ale_linters#elm#make#GetCommand(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm-package.json') endif + return l:elm_json +endfunction + +function! ale_linters#elm#make#IsVersionGte19(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + + if l:elm_json =~# '-package' + return 0 + else + return 1 + endif +endfunction + +function! ale_linters#elm#make#GetRootDir(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + if empty(l:elm_json) + return '' + else + return fnamemodify(l:elm_json, ':p:h') + endif +endfunction + +function! ale_linters#elm#make#IsTest(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) + return 0 + endif + + let l:tests_dir = join([l:root_dir, 'tests', ''], has('win32') ? '\' : '/') + + let l:buffer_path = fnamemodify(bufname(a:buffer), ':p') + + if match(l:buffer_path, l:tests_dir) == 0 + return 1 + else + return 0 + endif +endfunction + +" Return the command to execute the linter in the projects directory. +" If it doesn't, then this will fail when imports are needed. +function! ale_linters#elm#make#GetCommand(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) let l:dir_set_cmd = '' else - let l:root_dir = fnamemodify(l:elm_json, ':p:h') let l:dir_set_cmd = 'cd ' . ale#Escape(l:root_dir) . ' && ' endif @@ -161,11 +204,20 @@ function! ale_linters#elm#make#GetCommand(buffer) abort return l:dir_set_cmd . '%e make --report=json --output=/dev/null %t' endfunction +function! ale_linters#elm#make#GetExecutable(buffer) abort + let l:is_test = ale_linters#elm#make#IsTest(a:buffer) + let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) + + if l:is_test && l:is_v19 + return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm-test']) + else + return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) + endif +endfunction + call ale#linter#Define('elm', { \ 'name': 'make', -\ 'executable_callback': ale#node#FindExecutableFunc('elm_make', [ -\ 'node_modules/.bin/elm', -\ ]), +\ 'executable_callback': 'ale_linters#elm#make#GetExecutable', \ 'output_stream': 'both', \ 'command_callback': 'ale_linters#elm#make#GetCommand', \ 'callback': 'ale_linters#elm#make#Handle' -- cgit v1.2.3 From 4a11a6337e37a1e3b5ad28f77f15979ccd47d587 Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Thu, 3 Jan 2019 21:45:25 +0200 Subject: =?UTF-8?q?fix:=20don=E2=80=99t=20use=20regex=20match?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit windows paths have backslashes, which are special in regex patterns --- ale_linters/elm/make.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ale_linters/elm/make.vim') diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index a6884750..37b8d07c 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -179,7 +179,7 @@ function! ale_linters#elm#make#IsTest(buffer) abort let l:buffer_path = fnamemodify(bufname(a:buffer), ':p') - if match(l:buffer_path, l:tests_dir) == 0 + if stridx(l:buffer_path, l:tests_dir) == 0 return 1 else return 0 -- cgit v1.2.3 From 1f21eb0c422e8ae351981544a7e0da4f369e6144 Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Fri, 4 Jan 2019 08:57:14 +0200 Subject: =?UTF-8?q?fallback=20to=20elm=20if=20elm-tests=20isn=E2=80=99t=20?= =?UTF-8?q?available?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ale_linters/elm/make.vim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'ale_linters/elm/make.vim') diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index 37b8d07c..76622028 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -209,7 +209,11 @@ function! ale_linters#elm#make#GetExecutable(buffer) abort let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) if l:is_test && l:is_v19 - return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm-test']) + return ale#node#FindExecutable( +\ a:buffer, +\ 'elm_make', +\ ['node_modules/.bin/elm-test', 'node_modules/.bin/elm'] +\ ) else return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) endif -- cgit v1.2.3