v0.31.0: 9 June 2026
Highlights
- Added support for Elixir 1.20 (and OTP 29 on 1.20)
Improvements
- Completion subsystem ported wholesale onto the 1.20 engine with more accurate block keyword (
do,else,rescue,catch,after,end) completions - Go to definition now resolves functions and macros defined inside
__using__macros Paweł Świątkowski - Added OTP 28 nominal types support
Code.ensure_compiledcalls eradicated from the codebase and from elixir_sense module store building, reducing compilation-related hangs and improving startup performance Steve Cohen- Ecto query completion now includes bindings from join associations
requiredis preserved in typespec suggestions
Fixes
- Fixed call hierarchy ranges for calls in the current file
- Match arity when naming call hierarchy items
- Parse Erlang module names in call hierarchy
- Only rewrite the diagnostic module's call in the "replace remote function" code action
- Fixed struct field completion in record update syntax
- Fixed keyword option completion text edit position
- Guard against unknown association in Ecto query completion
- Pass binding to scope resolution for route action completion
- Do not get stuck when build is skipped on cwd change
- Do not transfer nil PLT after failed dialyzer analysis
- Fixed whitespace regex in
function_def_on_line? - Do not treat
#inside literals as a trailing comment - Fixed
path_in_dir?for filesystem root - Handle error responses to server-initiated requests
- Fixed mise shell detection when using nushell Bryan Iotti
- Debug adapter: fixed off-by-one in hit count breakpoints
- Debug adapter: plain breakpoints no longer consume conditional breakpoint slots
- Debug adapter: fixed breakpoint condition unregister on removal
- Debug adapter: fixed off-by-one in stackTrace levels paging
- Debug adapter: fixed inverted
singleThreadhandling in continue/step - MCP: fixed invalid response to the
initializednotification - MCP: fixed location key for
file:line:columninget_environment - Do not overwrite target dir on release
Breaking changes
- Elixir 1.15 reached end of life and is no longer supported. Consider updating to 1.16+
- OTP versions below 26 are no longer supported. Consider updating to OTP 26+
- Legacy dialyzer support dropped — OTP's incremental Dialyzer is now the only engine, so the
elixirLS.incrementalDialyzersetting has been removed