summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/ocamlinterface/merlin.vim17
-rw-r--r--ale_linters/ocamlinterface/ocamllsp.vim13
-rw-r--r--autoload/ale/fix/registry.vim4
-rw-r--r--autoload/ale/handlers/ocamllsp.vim9
-rw-r--r--test/linter/test_ocamlinterface_ocamllsp.vader29
5 files changed, 69 insertions, 3 deletions
diff --git a/ale_linters/ocamlinterface/merlin.vim b/ale_linters/ocamlinterface/merlin.vim
new file mode 100644
index 00000000..799490f7
--- /dev/null
+++ b/ale_linters/ocamlinterface/merlin.vim
@@ -0,0 +1,17 @@
+" Author: Andrey Popp -- @andreypopp
+" Description: Report errors in OCaml code with Merlin
+
+if !exists('g:merlin')
+ finish
+endif
+
+function! ale_linters#ocamlinterface#merlin#Handle(buffer, lines) abort
+ return merlin#ErrorLocList()
+endfunction
+
+call ale#linter#Define('ocamlinterface', {
+\ 'name': 'merlin',
+\ 'executable': 'ocamlmerlin',
+\ 'command': 'true',
+\ 'callback': 'ale_linters#ocamlinterface#merlin#Handle',
+\})
diff --git a/ale_linters/ocamlinterface/ocamllsp.vim b/ale_linters/ocamlinterface/ocamllsp.vim
new file mode 100644
index 00000000..cd4bea80
--- /dev/null
+++ b/ale_linters/ocamlinterface/ocamllsp.vim
@@ -0,0 +1,13 @@
+" Author: Risto Stevcev <me@risto.codes>
+" Description: The official language server for OCaml
+
+call ale#Set('ocaml_ocamllsp_use_opam', 1)
+
+call ale#linter#Define('ocamlinterface', {
+\ 'name': 'ocamllsp',
+\ 'lsp': 'stdio',
+\ 'executable': function('ale#handlers#ocamllsp#GetExecutable'),
+\ 'command': function('ale#handlers#ocamllsp#GetCommand'),
+\ 'language': function('ale#handlers#ocamllsp#GetLanguage'),
+\ 'project_root': function('ale#handlers#ocamllsp#GetProjectRoot'),
+\})
diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim
index efc9ebe0..1cd5b6ef 100644
--- a/autoload/ale/fix/registry.vim
+++ b/autoload/ale/fix/registry.vim
@@ -303,12 +303,12 @@ let s:default_registry = {
\ },
\ 'ocamlformat': {
\ 'function': 'ale#fixers#ocamlformat#Fix',
-\ 'suggested_filetypes': ['ocaml'],
+\ 'suggested_filetypes': ['ocaml', 'ocamlinterface'],
\ 'description': 'Fix OCaml files with ocamlformat.',
\ },
\ 'ocp-indent': {
\ 'function': 'ale#fixers#ocp_indent#Fix',
-\ 'suggested_filetypes': ['ocaml'],
+\ 'suggested_filetypes': ['ocaml', 'ocamlinterface'],
\ 'description': 'Fix OCaml files with ocp-indent.',
\ },
\ 'refmt': {
diff --git a/autoload/ale/handlers/ocamllsp.vim b/autoload/ale/handlers/ocamllsp.vim
index 07d9b0cf..2738ea2b 100644
--- a/autoload/ale/handlers/ocamllsp.vim
+++ b/autoload/ale/handlers/ocamllsp.vim
@@ -1,6 +1,13 @@
" Author: Risto Stevcev <me@risto.codes>
" Description: Handlers for the official OCaml language server
+let s:language_id_of_filetype = {
+\ 'menhir': 'ocaml.menhir',
+\ 'ocaml': 'ocaml',
+\ 'ocamlinterface': 'ocaml.interface',
+\ 'ocamllex': 'ocaml.lex'
+\}
+
function! ale#handlers#ocamllsp#GetExecutable(buffer) abort
return 'ocamllsp'
endfunction
@@ -13,7 +20,7 @@ function! ale#handlers#ocamllsp#GetCommand(buffer) abort
endfunction
function! ale#handlers#ocamllsp#GetLanguage(buffer) abort
- return getbufvar(a:buffer, '&filetype')
+ return s:language_id_of_filetype[getbufvar(a:buffer, '&filetype')]
endfunction
function! ale#handlers#ocamllsp#GetProjectRoot(buffer) abort
diff --git a/test/linter/test_ocamlinterface_ocamllsp.vader b/test/linter/test_ocamlinterface_ocamllsp.vader
new file mode 100644
index 00000000..aa0b2100
--- /dev/null
+++ b/test/linter/test_ocamlinterface_ocamllsp.vader
@@ -0,0 +1,29 @@
+Before:
+ call ale#assert#SetUpLinterTest('ocamlinterface', 'ocamllsp')
+
+ Save &filetype
+ let &filetype = 'ocamlinterface'
+
+After:
+ call ale#assert#TearDownLinterTest()
+
+Execute(The language string should be correct):
+ AssertLSPLanguage 'ocaml.interface'
+
+Execute(The project root should be detected correctly):
+ AssertLSPProject ''
+
+ call ale#test#SetFilename('../test-files/ocamllsp/file.ml')
+
+ AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/ocamllsp')
+
+Execute(The executable should be run using opam exec by default):
+ call ale#test#SetFilename('../test-files/ocamllsp/file.ml')
+
+ AssertLinter 'ocamllsp', 'opam config exec -- ocamllsp'
+
+Execute(The executable should be run directly if use_opam flag is disabled):
+ let g:ale_ocaml_ocamllsp_use_opam = 0
+ call ale#test#SetFilename('../test-files/ocamllsp/file.ml')
+
+ AssertLinter 'ocamllsp', 'ocamllsp'