OCaml Changelog
Read the latest releases and updates from the OCaml ecosystem.
Note: The OCaml Changelog is experimental and is not yet endorsed by the maintainers of the Compiler, OCaml Platform and other featured projects.
We'll work with the maintainers of the projects to agree on the format of the Changelog and the release process as we roll out a stable version.
On behalf of the ocaml-lsp team, I’m pleased to announce ocaml-lsp-server versions 1.15.0-4.14
and 1.15.0-5.0
for OCaml 4.14 and 5.0, respectively. This is the first time we release ocaml-lsp supporting two compiler versions. We look forward to your feedback.
See full changelog
Features
-
Enable semantic highlighting support by default (#933)
-
Support connecting over pipes and socket. Pipes on Windows aren't yet supported (#946)
More about communication channels in LSP specification.
-
Re-enable
ocamlformat-rpc
for formatting code snippets (but not files and not on Windows) (#920, #939)One needs to have installed either
ocamlformat
package version > 0.21.0 or, otherwise,ocamlformat-rpc
package. Note that previouslyocamlformat-rpc
came in a standalone OPAM package, but sinceocamlformat
version > 0.21.0, it comes withinocamlformat
package. -
Add custom
ocamllsp/hoverExtended
request (#561) -
Support utf-8 position encoding clients (#919)
More about position encoding in LSP specification.
-
Show unwrapped module alias types on hovering over module names. This is due to upgrading to merlin 4.7 and using merlin's
verbosity=smart
by default (#942)
Fixes
-
Respect the client's completion item resolve and preSelect capabilities (#925, #936)
-
Disable polling for dune's watch mode on Windows and OCaml 4.14.0 (#935)
-
Fix semantic highlighting of "long identifiers," e.g.,
Foo.Bar.x
(#932) -
Fix syncing of document contents:
- For ranges that span an entire line (#927)
- Previously, whole line edits would incorrectly eat the newline characters (#971)
See full changelog
Oops, we went looking but didn't find the changelog for this release 🙈
See full changelog
Fixes
-
Fix random requests failing after switching documents (#904, fixes #898)
-
Do not offer related diagnostic information unless the user enables in client capabilities (#905)
-
Do not offer diagnostic tags unless the client supports them (#909)
-
Do not attach extra data to diagnostics unless the client supports this (#910)
-
Use /bin/sh instead of /bin/bash. This fixes ocamllsp on NixOS
See full changelog
Fixes
-
Fix various server crashes when opening non OCaml/Reason files. Files such as dune, cram, etc. would cause the server to crash. (#884, fixes #871)
-
Ignore unknown tags in merlin configuration to improve forward compatibility with Dune. (#883)
On behalf of the ocamllsp team, I'm pleased to announce version 1.14.0. This release contains a new code action to help you inline definitions thanks to @jfeser. We look forward to your feedback.
See full changelog
Features
-
Code action for inlining let bindings within a module or expression. (#847)
-
Tag "unused code" and "deprecated" warnings, allowing clients to better display them. (#848)
-
Refresh merlin configuration after every dune build in watch mode (#853)
Fixes
-
Respect
showDocument
capabilities. Do not offer commands or code actions that rely on this request without client support. (#836) -
Fix signatureHelp on .mll files: avoid "Document.dune" exceptions
See full changelog
Features
- Code actions for jumping to related files (
.ml
,.mli
, etc.) (#795)
See full changelog
Fixes
- Fix cwd when executing ppx (#805)
See full changelog
Oops, we went looking but didn't find the changelog for this release 🙈
See full changelog
-
Allow cancellation of workspace symbols requests (#777)
-
Fix unintentionally interleaved jsonrpc IO that would corrupt the session (#786)
-
Ignore
SIGPIPE
. (#788)
See full changelog
Fixes
-
Fix a bad interaction between inferred interfaces and promotion code actions in watch mode (#753)
-
Fix URI parsing (#739 fixes #471 and #459)
See full changelog
Fixes
- Fix shutting down an already closed socket (#740)
See full changelog
Features
-
Fix cancellation mechanism for all requests (#707)
-
Allow cancellation of formatting requests (#707)
-
Add
--fallback-read-dot-merlin
to the LSP Server (#705). Ifocamllsp
is started with this new flag, it will fall back to looking for Merlin configuration in.merlin
files rather than callingdune ocaml-merlin
. (#705) -
Support folding more ranges (#692)
See full changelog
Fixes
-
Fix preprocessing, ppx, and reason support (#735 fixes #696, #706)
-
Support
include
in folding ranges (#730)
See full changelog
Fixes
- Stop leaking file descriptors like a sieve (#701)
See full changelog
-
Fix process termination. Once the lsp server is stepped, the process will gracefully terminate (#697, fixes #694)
-
Forward stderr from dune's merlin configuration to the lsp server's stderr (#697)
See full changelog
-
Fix bug with large buffers being resized incorrectly in Lev
-
Add folding ranges for more AST types (#680)
See full changelog
Fixes
- Enable dune rpc integration by default (#691, fixes #690)
See full changelog
Fixes
- Fix running external processes on Windows
See full changelog
Fixes
-
Fix Uri handling on Windows
-
Fix build on MSVC 2015
On behalf of the ocamllsp team, I’m excited to announce the availability of version 1.11.0. This release is an important milestone for the project because it introduces integration with our favorite build system. When you run dune in watch mode, you will now be able to see build errors in the diagnostics panel of your editor. It’s all rather experimental for now, so your feedback and bug reports are appreciated.
As usual, the full change log is below.
Happy hacking.
See full changelog
Features
-
Add support for dune in watch mode. The lsp server will now display build errors in the diagnostics and offer promotion code actions.
-
Re-introduce ocamlformat-rpc (#599, fixes #495)
Fixes
- Fix workspace symbols that could have a wrong path in some cases (#675)
See full changelog
Fixes
- Compatiblity with OCaml 4.14.0
See full changelog
Fixes
- Patch merlin to remove the result module
See full changelog
Fixes
- Fix more debouncing bugs (#629)
See full changelog
Fixes
-
Catch merlin desturct exceptions (#626)
-
Fix broken debouncing (#627)
See full changelog
Fixes
- Fix executing ppx executables
On behalf of the ocamllsp team, I’m pleased to announce version 1.10.0. The only new feature this release offers is better code folding, but there are some important bug fixes and performance improvements. If you encounter any sluggishness with our server, do not hesitate to report it.
Unless there are serious bugs with this release, this will be the last release for OCaml 4.13.
Happy Hacking.
See full changelog
Features
- Add better support for code folding: more folds and more precise folds
Fixes
-
Fix infer interface code action crash when implementation source does not exist (#597)
-
Improve error message when the reason plugin for merlin is absent (#608)
-
Fix
chdir
races when running ppx (#550) -
More accurate completion kinds. New completion kinds for variants and fields. Removed inaccurate completion kinds for constructors and types. (#510)
-
Fix handling request cancellation (#616)
See full changelog
Fixes
-
Disable functionality reliant on ocamlformat-rpc for now (#555)
-
4.13 compatiblity
See full changelog
Fixes
- Ppx processes are now executed correctly (#513)
Breaking Change
- ocamllsp drops support for
.merlin
files, and as a consequence no longer depends on dot-merlin-reader. (#523)
Features
- New code action to automatically remove values, types, opens (#502)
See full changelog
-
Fix debouncing of document updates. It was essentially completely broken in all but the most trivial cases. (#509 fixes #504)
-
Fix completion when passing named and functional arguments (#512)
See full changelog
- Disable experimental dune support. It was accidentally left enabled.
On behalf of the ocaml-lsp team, I’m pleased to announce version 1.8.0. This release contains some quality of life bug fixes, better diagnostics locations, and a few new code actions. Happy hacking.
See full changelog
Features
-
Add a new code action
Add missing rec keyword
, which is available when adding arec
keyword can fixUnbound value ...
error, e.g.,let fact n = if n = 0 then 1 else n * fact (n - 1) (* ^^^^ Unbound value fact *)
Adding
rec
to the definition offact
will fix the problem. The new code action offers addingrec
. -
Use ocamlformat to properly format type snippets. This feature requires the
ocamlformat-rpc
opam package to be installed. (#386) -
Add completion support for polymorphic variants, when it is possible to pin down the precise type. Examples (
<|>
stands for the cursor) when completion will work (#473)Function application:
let foo (a: [`Alpha | `Beta]) = () foo `A<|>
Type explicitly shown:
let a : [`Alpha | `Beta] = `B<|>
Note: this is actually a bug fix, since we were ignoring the backtick when constructing the prefix for completion.
-
Parse merlin errors (best effort) into a more structured form. This allows reporting all locations as "related information" (#475)
-
Add support for Merlin
Construct
command as completion suggestions, i.e., show complex expressions that could complete the typed hole. (#472) -
Add a code action
Construct an expression
that is shown when the cursor is at the end of the typed hole, i.e.,_|
, where|
is the cursor. The code action simply triggers the client (currently only VS Code is supported) to show completion suggestions. (#472) -
Change the formatting-on-save error notification to a warning notification (#472)
-
Code action to qualify ("put module name in identifiers") and unqualify ("remove module name from identifiers") module names in identifiers (#399)
Starting from:
open Unix let times = Unix.times () let f x = x.Unix.tms_stime, x.Unix.tms_utime
Calling "remove module name from identifiers" with the cursor on the open statement will produce:
open Unix let times = times () let f x = x.tms_stime, x.tms_utime
Calling "put module name in identifiers" will restore:
open Unix let times = Unix.times () let f x = x.Unix.tms_stime, x.Unix.tms_utime
Fixes
-
Handle workspace change notifications. Previously, the server would only use the set of workspaces given at startup to search for workspace symbols. After this change, workspace folders that are added later will also be considered. (#498)
-
Do not show "random" documentation on hover
- fixed by merlin#1364
- fixes duplicate:
-
Correctly rename a variable used as a named/optional argument (#478)
-
When reporting an error at the beginning of the file, use the first line not the second (#489)
See full changelog
Features
-
Add sub-errors as "related" information in diagnostics (#457)
-
Add support for navigating to a symbol inside a workspace (#398)
-
Show typed holes as errors
Merlin has a concept of "typed holes" that are syntactically represented as
_
. Files that incorporate typed holes are not considered valid OCaml, but Merlin and OCaml-LSP support them. One example when such typed holes can occur is when on "destructs" a value, e.g., destructing(Some 1)
will generate codematch Some 1 with Some _ -> _ | None -> _
. While the first underscore is a valid "match-all"/wildcard pattern, the rest of underscores are typed holes.
See full changelog
Fixes
-
Switch
verbosity
from 1 to 0. This is the same default that merlin uses. The old value for verbosity (#433) -
Get fresh diagnostics (warning and error messages) on a file save (#438)
Note: If you want the fresh diagnostics to take into account changes in other files, you likely need to rebuild your project. An easy way to get automatic rebuilds is to run
dune
in a watching mode, e.g.,[dune build --watch].
On behalf of the ocaml-lsp team, I'd like to announce version 1.6.0 of ocaml-lsp-server. The highlight of this release is the updated version of merlin which brings lots of new bug fixes.
See full changelog
Features
- Code action to annotate a value with its type (#397)
Fixes
-
Fix interface/implementation switching on Windows (#427)
-
Correctly parse project paths with spaces and other special characters that must be escaped.
-
Print types with
-short-paths
even if the project wasn't built yet
See full changelog
-
Support 4.12 and drop support for all earlier versions
-
Update to the latest version of merlin
See full changelog
Fixes
-
Backport fixes from merlin (#382, #383)
-
Encode request & notification
params
in a list. This is required by the spec. (#351)
On behalf of the ocaml-lsp team, it is my pleasure to announce version 1.4.0. This release introduces support for automatic signature help. Signature help is not yet present in all possible contexts. We intend to improve to support as many relevant language constructs as possible in the future. Many thanks to @mnxn for implementing this feature.
The full change log is replicated at the end of this post for your convenience.
Happy Holidays!
See full changelog
Features
-
Support cancellation notifications when possible. (#323)
-
Implement signature help request for functions (#324)
-
Server LSP requests & notifications concurrently. Requests that require merlin are still serialized. (#330)
On behalf of the ocaml-lsp team, I’d like to announce version 1.3.0.
This release an improvement in keyword completion and a new code action. Keywords are now filtered by the context the user requested the completion, and there’s a new code action to quickly populate .mli files with the the inferred types from the .ml file.
See full changelog
Features
-
Code action to insert inferred module interface (#308)
-
Filter keywords by context (#307)
On behalf of the ocaml-lsp team, I’d like to announce version 1.2.0.
This version contains many bug fixes and some performance improvements A couple of interesting features made it in as well:
- Auto-completion of OCaml keywords (not available for reason)
- The ability to jump to the declaration of a value in the .mli.
See full changelog
Features
-
Add keyword completion
-
Add go to declaration functionality to jump to a value's specification in a .mli file (#294)
Fixes
-
#245: correctly use mutexes on OpenBSD (#264)
-
#268: Do not use vendored libraries when building the lsp package (#260)
-
#271: Clear diagnostics when files are closed
-
Disable non-prefix completion. There's no reliably way to trigger it and it can be slow.
Initial Release