Releases: aviatesk/JETLS.jl
2026-04-14
- Commit:
d1ebbb2 - Diff:
c954d83...d1ebbb2 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-04-14")'
Announcement
Warning
JETLS requires Julia 1.12.2 or later.
It does not support Julia 1.12.1 or earlier, nor Julia 1.13+/nightly.
Warning
JETLS currently has a known memory leak issue where memory usage grows with each re-analysis (#357).
As a temporary workaround, you can disable full-analysis for specific files using the analysis_overrides initialization option:
This disables analysis for matched files. Basic features like completion still might work, but most LSP features will be unfunctional.
Note that analysis_overrides is provided as a temporary workaround and may be removed or changed at any time. A proper fix is being worked on.
Added
- Added
inference/non-boolean-conddiagnostic that detects non-boolean values used in boolean context (e.g.if,while, ternary?:,&&,||).function find_zero(xs::Vector{Union{Missing,Int}}) for i in eachindex(xs) xs[i] == 0 && return i # non-boolean `Missing` found in boolean context end end
Changed
-
The release script now sets
Project.tomlversion toYYYY.MM.DD(converted from theYYYY-MM-DDrelease date), sopkg> app statusdisplays a meaningful version (#629). -
Updated JuliaSyntax.jl and JuliaLowering.jl dependencies.
Fixed
-
Unreachable code after assignment with noreturn RHS (e.g.
y = error(x)) is now correctly detected. -
Fixed errors when opening unsaved buffers in Sublime Text, which uses the
buffer:URI scheme instead of VSCode'suntitled:scheme convention (#626). -
Fixed false "macro name not found" diagnostics on macros like
@enumxthat internally generate baremodules
(Closed #628).
2026-04-06
- Commit:
c954d83 - Diff:
8deefa8...c954d83 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-04-06")'
Added
-
Extended noreturn optimization to recognize
error,rethrow, andexitin addition tothrow. These calls are now treated as block terminators for unreachable code detection and undef variable analysis, reducing false positives when these functions are used as guards. For example, the following code no longer produces a false "possibly undefined" warning ony:function f(x) if x > 0 y = x else error("x must be positive") end return sin(y) # no warning: error() guarantees y is defined end
-
Noreturn detection now works for nested calls (e.g.
println(error(x))) where a noreturn function appears in argument position.
Changed
- Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest.
Fixed
-
Fixed scope resolution for notebook cells to use soft scope semantics, so that assignments inside loops correctly resolve to existing globals instead of creating ambiguous locals.
-
Fixed a crash during signature analysis (
AssertionError: invalid cache_argtypes) that occurred when constant propagation encountered methods using@nospecializeinferwith varying varargs arities.
Updated the bundledCompiler.jlrevision with the upstream fix (https://github.com/JuliaLang/julia#61502) (Closed #618).
2026-04-04
- Commit:
8deefa8 - Diff:
d14efce...8deefa8 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-04-04")'
Added
-
Added
lowering/unreachable-codediagnostic that detects code after block terminators (return,throw,break,continue), including cases where all branches ofif/elseif/elseortry/catchcontain a terminator.
Unreachable code is displayed as faded/grayed out with theUnnecessarytag.
A "Delete unreachable code" quick fix code action is also available. -
Added
lowering/ambiguous-soft-scopediagnostic that warns when a variable assignment inside afor/while/tryblock at the top level shadows an existing global variable.
This matches the warning Julia itself emits at runtime for this pattern.
Two code actions are offered: "Insertglobaldeclaration" (preferred) and "Insertlocaldeclaration".
This diagnostic is suppressed for notebook cells, where soft scope semantics are enabled.
Changed
-
lowering/undef-local-varnow recognizes correlated conditions to reduce false positives.
When a variable is assigned under a condition (e.g.if x; y = 42; end) and later used under the same condition (if x; println(y); end), the diagnostic is no longer emitted.
This also works with&&chains (if x && z), nestedifblocks that are equivalent to&&, and combinations of both. -
Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest.
The updated JuliaLowering pipeline is faster overall (JuliaLang/julia#61425), improving performance of LSP features that rely on lowering such as diagnostics and document highlight. -
The JETLS's own def-use analysis (
analyze_def_use_all_lambdas) is now ~5x faster (684ms → 127ms).
Combined with the JuliaSyntax/JuliaLowering pipeline improvements above, the overall analysis pipeline time is reduced by ~2x (3649ms → 1772ms) on a large file (test/test_lowering_diagnostic.jl, ~1600 lines) (#612). -
The "Prefix with
_" code action is no longer offered for unused keyword arguments, since renaming a keyword argument changes the function's calling convention.
Fixed
-
Fixed world age warnings (
WARNING: Detected access to binding 'xxx' in a world prior to its definition world. ...) that could occur when the language server interacts with user-defined methods or types at a newer world age.
This affected diagnostic printing, documentation lookup (hover, completions), and signature help display.
(Closed #485) -
Fixed full analysis not working on unsaved (
untitled:) buffers.
Unlike saved files where analysis runs on save, unsaved buffers trigger
analysis on each content change with a fixed 3-second debounce. -
Fixed lowering-based LSP features (document highlight, go-to-definition, find references, rename, hover) not working for functions with docstrings.
-
Fixed go-to-definition, find references, rename, and code actions not working correctly in notebooks.
2026-03-20
- Commit:
d14efce - Diff:
ea73622...d14efce - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-03-20")'
Added
- Added process title setting so that
jetls serveprocesses are distinguishable inps/htopwhen multiple projects are open.
The title includes JETLS version, workspace path, transport mode, and client process ID.
Fixed
- Fixed false positive
lowering/unused-assignmentdiagnostic for variables reassigned insidewhileloops withbreak/continue.
2026-03-19
- Commit:
ea73622 - Diff:
4280097...ea73622 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-03-19")'
Added
-
Added
@mainfunction support across LSP features (document-symbol, document-highlight, references, rename, completions, diagnostic). -
Added
lowering/unused-assignmentdiagnostic that detects assignments whose values are never read (dead stores).
This complements the existinglowering/unused-localdiagnostic:lowering/unused-localreports variables that are never used at all, whilelowering/unused-assignmentreports specific assignments to variables that are used elsewhere.
For example:function f(x::Bool) if x z = "Hi" println(z) # z is used, so no `unused-local` end if x z = "Hey" # but this value is never read → `unused-assignment` end end
Changed
lowering/undef-local-varnow reports a diagnostic for each use site on an undef path individually, rather than only reporting the first one.lowering/undef-local-var@isdefinedpropagation now recognizes@isdefined(var)within&&chains (e.g.,if cond && @isdefined(y)), suppressing false positive diagnostics in the guarded branch.- Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest
Fixed
- Fixed false positive
lowering/unused-bindingwarning for keyword arguments that are only used in computing other keyword arguments' default values (Closed #592). - Fixed false positive
lowering/unused-importwarning for imports used inside quoted expressions in macro bodies or helper functions (Closed #594). - Fixed
lowering/undef-local-vardiagnostic being reported at the wrong location:
when a variable had both defined and potentially-undefined uses, the diagnostic pointed to the first use in source order rather than the use that is actually on the undef path. - Fixed signature-help error when displaying signatures for operator-like methods (e.g.
Base.:(==)). - Fixed "Delete assignment" code action removing the opening delimiter of string literals (e.g.,
z = "Hey"becameHey"instead of"Hey").
2026-03-13
- Commit:
4280097 - Diff:
d32f1cf...4280097 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-03-13")'
Changed
- Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest
Fixed
-
Fixed crash in diagnostics when
@generatedfunctions use old-style macros
(Closed #583). -
Fixed false
"Invalid type signature for @kwdef"error when using@kwdef
with subtype declarations (e.g.@kwdef struct A <: B)
(Closed #587). -
Fixed false
unused-importwarnings for modules with docstrings
(Closed #586). -
Fixed server hang when the client terminates abnormaly without sending an
exitnotification (e.g. Neovim)
(Fixed #580).
2026-03-08
- Commit:
d32f1cf - Diff:
5e1f0bb...d32f1cf - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-03-08")'
Changed
- Updated JuliaSyntax and JuliaLowering to their latest versions, fixing
several errors caused by JuliaLowering (Fixed #495, #518, #538).
Fixed
2026-02-27
- Commit:
5e1f0bb - Diff:
ebcbd60...5e1f0bb - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-02-27")'
Added
- Added a GitHub composite action (
.github/actions/check/) for running
jetls checkin CI pipelines. External packages can use it as:All- uses: aviatesk/JETLS.jl/.github/actions/check@release with: files: src/SomePkg.jl
jetls checkcommand-line options are available as action inputs.
Changes
- The previously deprecated behavior of running
jetlswithout a subcommand
to start the language server has been removed. Runningjetlswithout a
subcommand or with unrecognized arguments now shows the help message and
exits. Usejetls serveinstead
(Closed #565).
2026-02-26
- Commit:
ebcbd60 - Diff:
e141508...ebcbd60 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-02-26")'
Added
-
Added
inference/method-error
diagnostic that detects function calls where no matching method exists for
the inferred argument types. This catches potentialMethodErrors that would
occur at runtime. For union-split calls, the diagnostic reports only the
failing branches with their count (e.g., "1/2 union split"). -
Added
jetls schemaCLI command that prints the JSON Schema for JETLS
configuration. Supports--settings,--init-options, and
--config-tomloptions. -
Added schema generation infrastructure under
scripts/schema/and
committed generated schema files underschemas/. CI now checks that
the schema files andjetls-client/package.jsonstay in sync with
src/types.jl.
Changed
-
textDocument/documentSymbolnow showsfor,let,while, and
try/catch/else/finallyblocks inside functions as hierarchical
Namespacesymbols. Previously, all local bindings within a function were
shown as flat children; now, bindings inside scope constructs are nested
under the scope construct, matching the existing behavior for top-level
scope constructs. -
textDocument/documentSymbolnow strips redundant name prefixes from
symbol details. (e.g., a symbol namedfoowith detailfoo = func(args...)
now shows= func(args...)as the detail.
Fixed
-
Fixed
textDocument/renamefor macro bindings. -
Fixed bindings in
let/for/whileblocks inside nested functions
not appearing as children of those functions in the document outline.
2026-02-16
- Commit:
e141508 - Diff:
150f880...e141508 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-02-16")'
Added
- Anonymous function assignments (
f = (x) -> x + 1and
clos = function (y) ... end) are now analyzed asFunctionsymbols
fortextDocument/documentSymbol, with their arguments as children.
Changed
- Enabled signature analysis for all analysis modes. Previously, signature
analysis was only active in the package source analysis, meaning some
potential errors within standalone scripts can be missed.
This change ensures that diagnostics likeinference/field-error
can be detected from methods within standalone scripts.
(Fixed #479).
Fixed
-
Fixed
jetls checkfailing to correctly activate user package environments
during full analysis. -
Fixed
jetls checkresolving file path arguments relative to the current
working directory instead of the--rootdirectory when--rootis specified.
For example,jetls check --root=/path/to/Pkg src/Pkg.jlnow correctly
resolves to/path/to/Pkg/src/Pkg.jl. -
Fixed false positive
lowering/unused-importdiagnostics for symbols
in a package file but used inincluded files
(Fixed #547). -
Fixed rename/document-highlight/references failing for
@kwdefstructs with
default values (Fixed #540). -
Fixed duplicate syntax error diagnostics by skipping
ParseErrorReportfrom
full-analysis, since syntax errors are already reported via
textDocument/diagnosticorworkspace/diagnostic
(Fixed #535). -
Fixed false positive unused argument diagnostic for keyword arguments whose
type annotation constrains awhere-clause static parameter that is used in
the function body (e.g.,f(; dtype::Type{T}=Float32) where {T} = T.(xs))
(Fixed #481). -
Fixed various type instabilities across the codebase caught by the new
inference/method-errordiagnostic running on JETLS itself.
Other
- Added GitHub issue templates for bug reports and feature requests.