summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/ocaml/ocamllsp.vim13
-rw-r--r--autoload/ale/handlers/ocamllsp.vim23
-rw-r--r--doc/ale-ocaml.txt15
-rw-r--r--doc/ale-supported-languages-and-tools.txt1
-rw-r--r--doc/ale.txt1
-rw-r--r--supported-tools.md1
-rw-r--r--test/command_callback/ocamllsp_paths/dune-project0
-rw-r--r--test/command_callback/test_ocaml_ocamllsp_callbacks.vader29
8 files changed, 83 insertions, 0 deletions
diff --git a/ale_linters/ocaml/ocamllsp.vim b/ale_linters/ocaml/ocamllsp.vim
new file mode 100644
index 00000000..4ff7419c
--- /dev/null
+++ b/ale_linters/ocaml/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('ocaml', {
+\ '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/handlers/ocamllsp.vim b/autoload/ale/handlers/ocamllsp.vim
new file mode 100644
index 00000000..07d9b0cf
--- /dev/null
+++ b/autoload/ale/handlers/ocamllsp.vim
@@ -0,0 +1,23 @@
+" Author: Risto Stevcev <me@risto.codes>
+" Description: Handlers for the official OCaml language server
+
+function! ale#handlers#ocamllsp#GetExecutable(buffer) abort
+ return 'ocamllsp'
+endfunction
+
+function! ale#handlers#ocamllsp#GetCommand(buffer) abort
+ let l:executable = ale#handlers#ocamllsp#GetExecutable(a:buffer)
+ let l:ocaml_ocamllsp_use_opam = ale#Var(a:buffer, 'ocaml_ocamllsp_use_opam')
+
+ return l:ocaml_ocamllsp_use_opam ? 'opam config exec -- ' . l:executable : l:executable
+endfunction
+
+function! ale#handlers#ocamllsp#GetLanguage(buffer) abort
+ return getbufvar(a:buffer, '&filetype')
+endfunction
+
+function! ale#handlers#ocamllsp#GetProjectRoot(buffer) abort
+ let l:dune_project_file = ale#path#FindNearestFile(a:buffer, 'dune-project')
+
+ return !empty(l:dune_project_file) ? fnamemodify(l:dune_project_file, ':h') : ''
+endfunction
diff --git a/doc/ale-ocaml.txt b/doc/ale-ocaml.txt
index 8b644c17..afbc2386 100644
--- a/doc/ale-ocaml.txt
+++ b/doc/ale-ocaml.txt
@@ -11,6 +11,21 @@ merlin *ale-ocaml-merlin*
(https://github.com/the-lambda-church/merlin/wiki/vim-from-scratch).
===============================================================================
+ocamllsp *ale-ocaml-ocamllsp*
+
+ The `ocaml-lsp-server` is the official OCaml implementation of the Language
+ Server Protocol. See the installation instructions:
+ https://github.com/ocaml/ocaml-lsp#installation
+
+g:ale_ocaml_ocamllsp_use_opam *g:ale_ocaml_ocamllsp_use_opam*
+ *b:ale_ocaml_ocamllsp_use_opam*
+ Type: |Number|
+ Default: `get(g:, 'ale_ocaml_ocamllsp_use_opam', 1)`
+
+ This variable can be set to change whether or not opam is used to execute
+ the language server.
+
+===============================================================================
ols *ale-ocaml-ols*
The `ocaml-language-server` is the engine that powers OCaml and ReasonML
diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt
index cd99aaf4..71abb0a1 100644
--- a/doc/ale-supported-languages-and-tools.txt
+++ b/doc/ale-supported-languages-and-tools.txt
@@ -329,6 +329,7 @@ Notes:
* OCaml
* `merlin` (see |ale-ocaml-merlin|)
* `ocamlformat`
+ * `ocamllsp`
* `ocp-indent`
* `ols`
* OpenApi
diff --git a/doc/ale.txt b/doc/ale.txt
index 247228a7..3031cd1b 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -2843,6 +2843,7 @@ documented in additional help files.
uncrustify............................|ale-objcpp-uncrustify|
ocaml...................................|ale-ocaml-options|
merlin................................|ale-ocaml-merlin|
+ ocamllsp..............................|ale-ocaml-ocamllsp|
ols...................................|ale-ocaml-ols|
ocamlformat...........................|ale-ocaml-ocamlformat|
ocp-indent............................|ale-ocaml-ocp-indent|
diff --git a/supported-tools.md b/supported-tools.md
index 1779845d..7e74372d 100644
--- a/supported-tools.md
+++ b/supported-tools.md
@@ -338,6 +338,7 @@ formatting.
* OCaml
* [merlin](https://github.com/the-lambda-church/merlin) see `:help ale-ocaml-merlin` for configuration instructions
* [ocamlformat](https://github.com/ocaml-ppx/ocamlformat)
+ * [ocamllsp](https://github.com/ocaml/ocaml-lsp)
* [ocp-indent](https://github.com/OCamlPro/ocp-indent)
* [ols](https://github.com/freebroccolo/ocaml-language-server)
* OpenApi
diff --git a/test/command_callback/ocamllsp_paths/dune-project b/test/command_callback/ocamllsp_paths/dune-project
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/ocamllsp_paths/dune-project
diff --git a/test/command_callback/test_ocaml_ocamllsp_callbacks.vader b/test/command_callback/test_ocaml_ocamllsp_callbacks.vader
new file mode 100644
index 00000000..90a7e1a1
--- /dev/null
+++ b/test/command_callback/test_ocaml_ocamllsp_callbacks.vader
@@ -0,0 +1,29 @@
+Before:
+ call ale#assert#SetUpLinterTest('ocaml', 'ocamllsp')
+
+ Save &filetype
+ let &filetype = 'ocaml'
+
+After:
+ call ale#assert#TearDownLinterTest()
+
+Execute(The language string should be correct):
+ AssertLSPLanguage 'ocaml'
+
+Execute(The project root should be detected correctly):
+ AssertLSPProject ''
+
+ call ale#test#SetFilename('ocamllsp_paths/file.ml')
+
+ AssertLSPProject ale#path#Simplify(g:dir . '/ocamllsp_paths')
+
+Execute(The executable should be run using opam exec by default):
+ call ale#test#SetFilename('ocamllsp_paths/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('ocamllsp_paths/file.ml')
+
+ AssertLinter 'ocamllsp', 'ocamllsp'