CHANGELOG
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
JETLS uses date-based versioning (YYYY-MM-DD) rather than semantic versioning, as it is not registered in General due to environment isolation requirements.
Each dated section below corresponds to a release that can be installed via Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="YYYY-MM-DD")
To install the latest version regardless of date, re-run the installation command:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release")'Unreleased
- Commit:
HEAD - Diff:
ebcbd60...HEAD
Announcement
JETLS currently has a known memory leak issue where memory usage grows with each re-analysis (aviatesk/JETLS.jl#357). As a temporary workaround, you can disable full-analysis for specific files using the analysis_overrides initialization option:
// VSCode settings.json example
{
"jetls-client.initializationOptions": {
"analysis_overrides": [
{ "path": "src/**/*.jl" },
{ "path": "test/**/*.jl" }
]
}
}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.
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
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 withsrc/types.jl.Added
inference/method-errordiagnostic 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").
Changed
textDocument/documentSymbolnow showsfor,let,while, andtry/catch/else/finallyblocks inside functions as hierarchicalNamespacesymbols. 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 + 1andclos = 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 like
inference/field-errorcan be detected from methods within standalone scripts. (Fixed aviatesk/JETLS.jl#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 aviatesk/JETLS.jl#547).Fixed rename/document-highlight/references failing for
@kwdefstructs with default values (Fixed aviatesk/JETLS.jl#540).Fixed duplicate syntax error diagnostics by skipping
ParseErrorReportfrom full-analysis, since syntax errors are already reported viatextDocument/diagnosticorworkspace/diagnostic(Fixed aviatesk/JETLS.jl#535).Fixed false positive unused argument diagnostic for keyword arguments whose type annotation constrains a
where-clause static parameter that is used in the function body (e.g.,f(; dtype::Type{T}=Float32) where {T} = T.(xs)) (Fixed aviatesk/JETLS.jl#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.
2026-02-11
- Commit:
150f880 - Diff:
9c00dfe...150f880 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-02-11")'
Added
Added
jetls checkcommand for running JETLS diagnostics from the command line. This enables CI integration and command-line workflows without requiring an editor. Features include--exit-severityfor controlling exit codes,--show-severityfor filtering output,--context-linesfor output formatting, and--rootfor configuration lookup. The CLI now uses a subcommand structure:jetls servestarts the language server (default), whilejetls checkruns diagnostics.Added
lowering/unused-importdiagnostic that reports explicitly imported names that are never used within the same module space. The "Remove unused import" code action removes the unused name from the import statement.Added reference count code lens for top-level symbols (functions, structs, constants, abstract types, primitive types, modules). When enabled, a code lens showing "N references" appears above each symbol definition. Clicking it opens the references panel. This feature is opt-in and can be enabled via
code_lens.referencesconfiguration.Added
code_lens.testrunnerconfiguration option to enable or disable TestRunner code lenses. Some editors (e.g., Zed) display code lenses as code actions, causing duplication. The aviatesk/zed-julia extension automatically defaults this tofalse.Added document symbol support for
ifand@static ifblocks. These blocks now appear in the document outline asSymbolKind.Namespacesymbols, with all definitions fromif/elseif/elsebranches flattened as children.Added document symbol support for
@testsetand@testmacros.@testsetblocks appear in the document outline with the test name, and@testexpressions appear as children showing the test expression.Added inlay hints for block
endkeywords. For long blocks (module,function,macro,struct,if/@static if,let,for,while,@testset), an inlay hint is displayed at theendkeyword showing what construct is ending, such asmodule Fooorfunction bar. The minimum block length can be configured viainlay_hint.block_end_min_lines(default: 25 lines).
Deprecated
- Running
jetlswithout a subcommand (e.g.,jetls --stdio) is deprecated. Usejetls serveinstead. This may be removed in a future release.
Changed
Namespace symbols (
if/let/for/while/@static ifblocks) are now excluded from workspace symbol search. These symbols exist only to provide hierarchical structure in the document outline, not to represent actual definitions.textDocument/diagnosticnow supports cancellation, avoiding to compute staled diagnostics (aviatesk/JETLS.jl#524)Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest, fixing the root causes of aviatesk/JETLS.jl#492, and aviatesk/JETLS.jl#508.
Fixed
Lowering diagnostics no longer report issues in macro-generated code that users cannot control. User-written identifiers processed by new-style macros are still reported, but old-style macros are not yet supported due to JuliaLowering limitations.
Fixed false positive
lowering/unused-argumentandlowering/unused-localdiagnostics that could appear before full-analysis completes when macros cannot be expanded. Fixed aviatesk/JETLS.jl#522.Fixed diagnostic configuration pattern merging to use composite keys. Previously, patterns with the same
patternvalue but differentpathwould overwrite each other. Now patterns are identified by(match_by, match_type, path, pattern), allowing multiple rules for the same pattern with different paths.Fixed potential segfault on server exit by implementing graceful shutdown of worker tasks. All
Threads.@spawned tasks are now properly terminated before the server exits. (xref: https://github.com/JuliaLang/julia/issues/32983, aviatesk/JETLS.jl#523)Fixed thread-safety issue with cached syntax trees. Multiple threads accessing the same cached tree during lowering could cause data races and segfaults. Cached trees are now copied before use. (aviatesk/JETLS.jl#525)
Fixed cache not being generated in some cases in the experimental incremental analysis mode. The cache is now always created when
CodeInstanceis available, ensuring cache reuse works reliably.Fixed auto-instantiate creating unwanted versioned manifest files (e.g.,
Manifest-v1.12.toml) viatouch. A manifest is now only created whenPkg.instantiate()needs one. (aviatesk/JETLS.jl#511, aviatesk/JETLS.jl#536; thanks visr)
2026-01-23
- Commit:
9c00dfe - Diff:
c8e2012...9c00dfe - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-23")'
Added
Added
workspace/diagnosticsupport to provideJETLS/livediagnostics (syntax errors and lowering-based analysis) for unopened files in the workspace.Added
diagnostic.all_filesconfiguration option to control whether diagnostics are reported for unopened files. Disabling this can be useful to reduce noise when there are many warnings across the workspace.Added
lowering/unsorted-import-namesdiagnostic that reports when names inimport,using,export, orpublicstatements are not sorted alphabetically. The "Sort import names" code action is available to automatically fix the ordering.textDocument/documentHighlightnow supports macro bindings. Highlighting a macro name (either in the definition or at a call site) shows all occurrences of that macro within the document.textDocument/referencesnow supports macro bindings. Finding references on a macro name (either in the definition or at a call site) shows all occurrences of that macro across the package.
Changed
Updated TestRunner.jl installation instructions to use the
#releasebranch for vendored dependencies. TestRunner.jl should now be installed viajulia -e 'using Pkg; Pkg.Apps.add(url="https://github.com/aviatesk/TestRunner.jl#release")'(aviatesk/TestRunner.jl#14).
Replaced
inference/undef-local-varwith newlowering/undef-local-vardiagnostic. The new diagnostic uses CFG-aware analysis on lowered code, providing faster feedback viatextDocument/diagnosticwithout waiting for full analysis, and offers precise source location information. See the diagnostic reference for details and workarounds.textDocument/documentSymbolnow usesSymbolKind.Objectfor function arguments instead ofSymbolKind.Variable. This visually distinguishes arguments from local variables in the document outline. Since LSP does not provide a dedicatedSymbolKind.Argument,Objectis used as a workaround.workspace/symbolnow shows the parent function signature or struct name as the container name for arguments or fields respectively, making it clearer which function or struct they belong to during workspace symbol search.Diagnostic
sourcefield now uses distinct values to indicate which channel delivers the diagnostic:JETLS/livefor on-change diagnostics,JETLS/savefor on-save full analysis, andJETLS/extrafor external sources like the TestRunner.jl integration. This helps users understand when diagnostics update and enables filtering by source in editors that support it. See the Sources documentation for details.Yet more improved performance of
workspace/symbol,textDocument/references,
textDocument/rename, and textDocument/definition by avoiding re-parsing of already analyzed files not opened in the editor.
workspace/configurationrequests now expect settings to be found under the top-level"jetls"key, such that a request withsection = "jetls"produces the full configuration. This is to ensure compatibility with generic clients, e.g., the neovim client, which may not conform to JETLS's previous expectations about how requests with nosectionare handled. (aviatesk/JETLS.jl#483; thanks danielwe)Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest.
Fixed
Fixed LSP features not working inside
@mainfunctions.Fixed false positive
lowering/captured-boxed-variablediagnostic when a struct's inner constructor defines a local variable with the same name as a type parameter (e.g.,struct Foo{T}withT = typeof(x)in the constructor). (aviatesk/JETLS.jl#508)Fixed severe performance issue when analyzing test files containing many
@testand@testsetmacros. The underlying JuliaLowering issue caused macro expansion to be 40-300x slower for test files compared to regular source files. (JuliaLang/julia#60756)
2026-01-17
- Commit:
c8e2012 - Diff:
4cf9994...c8e2012 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-17")'
Added
textDocument/definitionnow supports global bindings. Previously, go-to-definition for global variables couldn't find their definition sites since runtime reflection doesn't provide binding location information. Now it uses binding occurrence analysis to find definition sites across the package, benefiting from the binding occurrences cache.
Changed
Improved
workspace/symbolperformance by enabling document symbol caching for files not currently open in the editor. Previously, only synced files (opened in editor) used the cache, causing repeated parsing for every workspace symbol search. The cache is now invalidated viaworkspace/didChangeWatchedFileswhen unsynced files change on disk.Improved
textDocument/references,textDocument/rename, andtextDocument/documentHighlightperformance for global bindings by caching binding occurrence analysis results per top-level expression. The cache persists across requests within the same package, so consecutive find-references, rename, or document highlight operations avoid redundant lowering.
2026-01-15
- Commit:
4cf9994 - Diff:
54b3058...4cf9994 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-15")'
Added
- Implemented
textDocument/documentSymbolfor structured outline view in editors. Provides hierarchical symbol information including modules, functions, structs, and local variables with rich detail context.
- Implemented
workspace/symbolfor workspace-wide symbol search, allowing quickly jumping to any function, type, or variable across the workspace. Results include rich context like function signatures for easier identification.
Changed
- Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest.
2026-01-11
- Commit:
54b3058 - Diff:
8b3c9db...54b3058 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-11")'
Fixed
Fixed cancellation not working properly for formatting requests (Fixed aviatesk/JETLS.jl#465)
Fixed diagnostic
relatedInformationrange not being localized for notebook cells
2026-01-10
- Commit:
8b3c9db - Diff:
cbcdc3c...8b3c9db - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-10")'
Added
- Added
lowering/captured-boxed-variablediagnostic that reports variables captured by closures requiring boxing. E.g.:
(aviatesk/JETLS.jl#452)function abmult1(r::Int) # `r` is captured and boxed (JETLS lowering/captured-boxed-variable) if r < 0 r = -r end f = x -> x * r # RelatedInformation: Closure at L5:9 captures `r` return f end
Changed
- Keyword argument name completion items are now sorted according to their order in the method definition.
Fixed
Fixed
textDocument/diagnosticfor notebook cells.Fixed
textDocument/formattingandtextDocument/rangeFormattingfor notebook cells (Fixed the first issue of aviatesk/JETLS.jl#442).Return empty results instead of errors for LSP requests on documents that haven't been synchronized via
textDocument/didOpen(Fixed the second issue of aviatesk/JETLS.jl#442).Fixed
lowering/undef-global-vardiagnostic incorrectly reporting non-constant but defined symbols as undefined in the file-analysis mode.Fixed cancellation not working for requests that use server-initiated progress (e.g.,
textDocument/formatting,textDocument/rename,textDocument/references). Previously, these requests were marked as handled immediately when the handler returned, causing$/cancelRequestto be ignored.Fixed progress UI cancel button not being displayed for
textDocument/formatting,textDocument/rangeFormatting,textDocument/references, andtextDocument/renamerequests. The server now properly handles both$/cancelRequestandwindow/workDoneProgress/cancelto abort these requests.
2026-01-09
- Commit:
cbcdc3c - Diff:
368e0a1...cbcdc3c - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-09")'
Fixed
Fixed
lowering/undef-global-vardiagnostic incorrectly reporting imported symbols from dependency packages as undefined. when!JETLS_DEV_MODE. (aviatesk/JETLS.jl#457)Fixed false positive
lowering/undef-global-vardiagnostic for keyword slurp arguments with dependent defaults (e.g.,f(; a=1, b=a, kws...)). (JuliaLang/julia#60600)
2026-01-08
- Commit:
368e0a1 - Diff:
c5f3c0d...368e0a1 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-08")'
Added
- Added
lowering/undef-global-vardiagnostic that reports undefined global variable references on document change (as you type). This provides faster feedback compared toinference/undef-global-var, which runs on save. The on-change diagnostic detects simple undefined references with accurate position information, while the on-save version detects a superset of undefined global binding references, including qualified references likeBase.undefvar. (aviatesk/JETLS.jl#450)
- Method signature completion for function calls. When typing inside a function call (triggered by
(,,, or), compatible method signatures are suggested based on already-provided arguments. Selecting a completion inserts remaining positional arguments as snippet placeholders with type annotations. When you select a completion item in the list, additional details such as inferred return type and documentation are displayed (resolved lazily for performance). (aviatesk/JETLS.jl#428)
- Keyword argument name completion for function calls. When typing inside a function call (e.g.,
func(; |)orfunc(k|)), available keyword arguments are suggested with=appended. Already-specified keywords are excluded from suggestions, and the spacing around=follows the existing style in the call. (aviatesk/JETLS.jl#427)
Added
completion.latex_emoji.strip_prefixconfiguration option to control prefix stripping in LaTeX/emoji completions. Some editors (e.g., Zed) don't handle backslash characters in the LSPsortTextfield, causing incorrect completion order. Set totrueto strip prefixes,falseto keep them. If not set, JETLS auto-detects based on client. The auto-detection covers only a limited set of known clients, so users experiencing sorting issues should explicitly set this option.Added
completion.method_signature.prepend_inference_resultconfiguration option to control whether to prepend inferred return type information to the documentation of method signature completion items. In some editors (e.g., Zed), additional information like inferred return type displayed when an item is selected may be cut off in the UI when method signature text is long. Set totrueto show return type in documentation. If not set, JETLS auto-detects based on client. The auto-detection covers only a limited set of known clients, so users experiencing visibility issues should explicitly set this option.
Help improve auto-detection:
Some completion configuration options (e.g., completion.latex_emoji.strip_prefix, completion.method_signature.prepend_inference_result) use client-based auto-detection for default behavior. If explicitly setting these options clearly improves behavior for your client, consider submitting a PR to add your client to the auto-detection logic.
- Added code actions to delete unused variable assignments. For unused local bindings like
y = println(x), two new quick fix actions are now available:- "Delete assignment": removes
y =, leaving justprintln(x) - "Delete statement": removes the entire assignment statement
x, y, z = func()where deletion would change semantics. - "Delete assignment": removes
Changed
Enhanced global completion items with detailed kind information (
[function],[type],[module], etc.). When you select a completion item, these details are displayed (resolved lazily for performance). The visibility of these enhancements varies by client: VSCode updates only theCompletionItem.detailfield (shown above documentation), while Zed is able to update all fields includingCompletionItem.kindfor richer presentation with label highlighting (combined with https://github.com/aviatesk/zed-julia/pull/1). (aviatesk/JETLS.jl#425)Demo with aviatesk/zed-julia
Improved signature help filtering when a semicolon is present in function calls. Methods that require more positional arguments than provided are now filtered out once the user enters the keyword argument region (e.g.,
g(42;│)no longer showsg(x, y)which requires 2 positional arguments). (aviatesk/JETLS.jl#426)Signature help and method completion now use type-based filtering. Method candidates are filtered based on the inferred types of already-provided arguments. For example, signature help and method completions triggered by typing
sin(1,│now shows onlysin(::Real)instead of allsinmethods. Global constants are also resolved (e.g.,sin(gx,│)withconst gx = 42correctly infersInt). Note that local variable types are not yet resolved, (e.g.,let x = 1; sin(x,│); endwould still show allsinmethods). (aviatesk/JETLS.jl#436)Signature help now displays the inferred argument type for the active parameter. The parameter documentation shows the passed argument expression and its type (e.g.,
p ← (arg) :: Int64).
Updated JuliaSyntax.jl and JuliaLowering.jl dependency versions to latest.
Updated Revise.jl dependency version to v3.13.
Fixed
Improved type resolver robustness, eliminating
UndefVarErrormessages that could appear in server logs during signature help. Fixed aviatesk/JETLS.jl#391. (aviatesk/JETLS.jl#435)Fixed signature help parameter highlighting when cursor is not inside any argument. For positional arguments exceeding the parameter count, the last (vararg) parameter is now highlighted (e.g.
println(stdout,"foo","bar",│)). For keyword arguments after a semicolon, the next unspecified keyword parameter is highlighted (e.g.,printstyled("foo"; bold=true,│)highlightsitalic).
2026-01-01
- Commit:
c5f3c0d - Diff:
b61b6fa...c5f3c0d - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-01-01")'
Fixed
- Fixed method overwrite detection to handle both
Core.CodeInfoandExprsource types, making the analysis more robust. (aviatesk/JETLS.jl#421) - Fixed
toplevel/abstract-fielddiagnostic to report correct field locations for structs with<:subtyping syntax andconstfield modifiers. (aviatesk/JETLS.jl#422)
2025-12-31
- Commit:
b61b6fa - Diff:
afc5137...b61b6fa - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-31")'
Added
- Added
diagnostic.allow_unused_underscoreconfiguration option (default:true). When enabled, unused variable diagnostics (lowering/unused-argumentandlowering/unused-local) are suppressed for names starting with_. (aviatesk/JETLS.jl#415) - Added code action to prefix unused variables with
_. When triggered on an unused variable diagnostic, this quickfix inserts_at the beginning of the variable name to suppress the warning. (aviatesk/JETLS.jl#416) - Added warning diagnostic for method overwrites (
toplevel/method-overwrite). When a method with the same signature is defined multiple times within a package, a warning is reported at the overwriting definition with a link to the original definition. Addresses aviatesk/JETLS.jl#387. (aviatesk/JETLS.jl#417)
- Added information diagnostic for abstract field types (
toplevel/abstract-field). Reports when a struct field has an abstract type (e.g.,Vector{Integer}orPair{Int}), which often causes performance issues such as dynamic dispatch. (aviatesk/JETLS.jl#418, aviatesk/JETLS.jl#419)
Fixed
- Added patch to vendored JuliaLowering to support
@.macro expansion. This was addressed with a specific patch for the@.case, but many of these JuliaLowering macro compatibility issues are planned to be resolved generically in the future. Fixed aviatesk/JETLS.jl#409.
2025-12-19
- Commit:
afc5137 - Diff:
c9c5729...afc5137 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-19")'
Added
- Added CHANGELOG page to the documentation.
Fixed
- Fixed
inference/undef-global-vardiagnostic being unintentially reported for undefined global bindings in dependency packages. - Fixed syntax/lowering diagnostics not being refreshed when diagnostic configuration change via
.JETLSConfig.tomlor LSP configuration. The server now sendsworkspace/diagnostic/refreshrequest to prompt clients to re-pull diagnostics. Note that client support varies; e.g. VSCode refreshestextDocument/diagnosticin response, but Zed does not.
2025-12-18
- Commit:
c9c5729 - Diff:
048d9a5...c9c5729 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-18")'
Added
- Added
inference/field-errordiagnostic for detecting access to non-existent struct fields (e.g.,x.propertwhen the field isproperty). Closed aviatesk/JETLS.jl#392. - Added
inference/bounds-errordiagnostic for detecting out-of-bounds field access by index (e.g.,tpl[2]on atpl::Tuple{Int}). Note that this diagnostic is for struct/tuple field access, not array indexing. - Added completion support for Julia keywords. Closed aviatesk/JETLS.jl#386.
- Added hover documentation for Julia keywords.
- Initialization options can now be configured via
.JETLSConfig.tomlusing the[initialization_options]section. See the documentation for details. - Added file rename support. When renaming a string literal that refers to a valid file path (e.g., in
include("foo.jl")), JETLS now renames both the file on disk and updates the string reference in the source code. Note that this feature only works when initiating rename from within the Julia source code; renaming files externally (e.g., via editor file explorer) will not automatically update code references.
Fixed
- Small adjustments for using JETLS with Julia v1.12.3
- Fixed false negative unused argument diagnostics for functions with keyword arguments. For example,
func(a; kw=nothing) = kwnow correctly reportsaas unused. Fixed aviatesk/JETLS.jl#390. - Fixed stale diagnostics not being cleared when a file is closed or when test structure changes remove all diagnostics for a URI.
- Fixed wrong message for diagnostic with multiple stack frames. The diagnostic message could be incorrectly overwritten when there are multiple stack frames, causing "message must be set" errors in VSCode. Fixed aviatesk/JETLS.jl#393.
Changed
- Completions now return no results when the prefix type is unknown. Previously, irrelevant completions were shown for expressions like
obj.xwhereobj's type could not be resolved. Fixed aviatesk/JETLS.jl#389. - Invalid initialization options are now reported to the user via editor notifications instead of only being logged to the server.
2025-12-12
- Commit:
048d9a5 - Diff:
9b39829...048d9a5 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-12")'
Added
- Added
textDocument/referencessupport for bindings. Both local and global bindings are supported, although currently the support for global references is experimental and has some notable limitations:- References can only be found within the same analysis unit. For example, when finding references to
somebindingdefined inPkgA/src/somefile.jl, usages inPkgA/src/can be found, but usages inPkgA/test/cannot be detected because test files are in a separate analysis unit. - Aliasing is not considered. Usages via
using ..PkgA: somebinding as otherbindingor module-qualified access likePkgA.somebindingare not detected.
- References can only be found within the same analysis unit. For example, when finding references to
- Added
textDocument/renamesupport for global bindings. Similar to global references, this feature is experimental and has the same limitations regarding analysis unit boundaries and aliasing.
Fixed
- Fixed false positive unused variable diagnostics in comprehensions with filter conditions. For example,
[x for (i, x) in enumerate(xs) if isodd(i)]no longer incorrectly reportsias unused. Fixes aviatesk/JETLS.jl#360.
Changed
- Updated JuliaSyntax.jl and JuliaLowering.jl dependencies to the latest development versions, which fixes spurious lowering diagnostics that occurred in edge cases such as JuliaLang/julia#60309.
2025-12-08
- Commit:
9b39829 - Diff:
fd5f113...9b39829 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-08")'
Added
Jupyter notebook support: JETLS now provides language features for Julia code cells in Jupyter notebooks. As shown in the demo below, all code cells are analyzed together as a single source, as if the notebook were a single Julia script. JETLS is aware of all cells, so features like go-to-definition, completions, and diagnostics work across cells just as they would in a regular Julia script.
JETLS × notebook LSP demo
Fixed
- Fixed
UndefVarErrorduring full analysis by updating the vendored JuliaInterpreter.jl to v0.10.9. - Fixed source location links in hover content to use comma-delimited format (
#L<line>,<character>) instead of#L<line>C<character>. The previous format was not correctly parsed by VS Code - the column position was ignored. The new format follows VS Code's implementation and works with other LSP clients like Sublime Text's LSP plugin. Fixes aviatesk/JETLS.jl#281.
2025-12-06
- Commit:
fd5f113 - Diff:
c23409d...fd5f113 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-06")'
Fixed
- TestRunner code lenses and code actions now properly wait for file cache population before being computed.
Changed
- Updated JuliaSyntax.jl and JuliaLowering to the latest development versions.
2025-12-05
- Commit:
c23409d - Diff:
aae52f5...c23409d - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-05")'
Changed
diagnostic.patternsfrom LSP config and file config are now merged instead of file config completely overriding LSP config. For patterns with the samepatternvalue, file config wins. Patterns unique to either source are preserved.
Fixed
- Request handlers now wait for file cache to be populated instead of immediately returning errors. This fixes "file cache not found" errors that occurred when requests arrived before the cache was ready, particularly after opening files. (aviatesk/JETLS.jl#273, aviatesk/JETLS.jl#274, aviatesk/JETLS.jl#327)
- Fixed glob pattern matching for
diagnostic.patterns[].path:**now correctly matches zero or more directory levels (e.g.,test/**/*.jlmatchestest/testfile.jl), and wildcards no longer match hidden files/directories. (aviatesk/JETLS.jl#359) .JETLSConfig.tomlis now only recognized at the workspace root. Previously, config files in subdirectories were also loaded, which was inconsistent with the documentation.- Clean up methods from previous analysis modules after re-analysis to prevent stale overload methods from appearing in signature help or completions.
Internal
- Added heap snapshot profiling support. Create a
.JETLSProfilefile in the workspace root to trigger a heap snapshot. The snapshot is saved asJETLS_YYYYMMDD_HHMMSS.heapsnapshotand can be analyzed using Chrome DevTools. See DEVELOPMENT.md's Profiling section for details.
2025-12-02
- Commit:
aae52f5 - Diff:
f9b2c2f...aae52f5 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-12-02")'
Added
- Added support for LSP
initializationOptionswith the experimentaln_analysis_workersoption for configuring concurrent analysis worker tasks. See Initialization options for details.
Changed
- Parallelized signature analysis phase using
Threads.@spawn, leveraging the thread-safe inference pipeline introduced in Julia v1.12. This parallelization happens automatically when Julia is started with multiple threads, independent of the newly addedn_analysis_workersinitialization option. With 4 threads (--threads=4,2specifically), first-time analysis of CSV.jl improved from 30s to 18s (~1.7x faster), and JETLS.jl itself from 154s to 36s (~4.3x faster).
Fixed
- Fixed handling of messages received before the initialize request per LSP 3.17 specification.
- Fixed progress indicator not being cleaned up when analysis throws an error.
2025-11-30
- Commit:
f9b2c2f - Diff:
eda08b5...f9b2c2f - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-11-30")'
Added
- JETLS now automatically runs
Pkg.resolve()andPkg.instantiate()for packages that have not been instantiated yet (e.g., freshly cloned repositories). This allows full analysis to work immediately upon opening such packages. When no manifest file exists, JETLS first creates a versioned manifest (e.g.,Manifest-v1.12.toml). This behavior is controlled by thefull_analysis.auto_instantiateconfiguration option (default:true). Set it tofalseto disable. - When
full_analysis.auto_instantiateis disabled, JETLS now checks if the environment is instantiated and warns the user if not.
Fixed
- Fixed error when receiving notifications after shutdown request. The server now silently ignores notifications instead of causing errors from invalid property access (which is not possible for notifications).
- Fixed race condition in package environment detection when multiple files are opened simultaneously. Added global lock to
activate_doto serialize environment switching operations. This fixes spurious "Failed to identify package environment" warnings. - Fixed document highlight and rename not working for function parameters annotated with
@nospecializeor@specialize.
Internal
- Fixed Revise integration in development mode. The previous approach of dynamically loading Revise via
Base.requiredidn't work properly because Revise assumes it's loaded from a REPL session. Revise is now a direct dependency that's conditionally loaded at compile time based on theJETLS_DEV_MODEflag. - Significantly refactored the full-analysis pipeline implementation. Modified the full-analysis pipeline behavior to output more detailed logs when
JETLS_DEV_MODEis enabled.
2025-11-28
- Commit:
eda08b5 - Diff:
6ec51e1...eda08b5 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-11-28")'
Changed
- Pinned installation now uses release tags (
rev="YYYY-MM-DD") instead of branch names (rev="releases/YYYY-MM-DD"). Thereleases/YYYY-MM-DDbranches will be deleted after merging since[sources]entries reference commit SHAs directly. Existing release branches (releases/2025-11-24throughreleases/2025-11-27) will be kept until the end of December 2025 for backward compatibility.
Fixed
- Fixed false
lowering/macro-expansion-errordiagnostics appearing before initial full-analysis completes. These diagnostics are now skipped until module context is available, then refreshed viaworkspace/diagnostic/refresh. Fixes aviatesk/JETLS.jl#279 and aviatesk/JETLS.jl#290. (aviatesk/JETLS.jl#333)
Removed
- Removed the deprecated
runserver.jlscript. Users should use thejetlsexecutable app instead. See the 2025-11-24 release notes for migration details.
2025-11-27
- Commit:
6ec51e1 - Diff:
6bc34f1...6ec51e1 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-11-27")'
Added
- Added
--version(-v) option to thejetlsCLI to display version information. The--helpoutput now also includes the version. Version is stored in theJETLS_VERSIONfile and automatically updated during releases. - Automatic GitHub Release creation when release PRs are merged. You can view releases at https://github.com/aviatesk/JETLS.jl/releases. The contents are and will be extracted from this CHANGELOG.md.
Changed
- Updated CodeTracking.jl, LoweredCodeUtils and JET.jl dependencies to the latest development versions.
Internal
- Automation for release process:
scripts/prepare-release.shautomates release branch creation, dependency vendoring, and PR creation. - Automatic CHANGELOG.md updates via CI when release PRs are merged.
2025-11-26
- Commit:
6bc34f1 - Diff:
2be0cff...6bc34f1 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-11-26")'
Changed
- Updated JuliaSyntax.jl and JuliaLowering.jl dependencies to the latest development versions.
- Updated documentation deployment to use
releaseas the default version. The documentation now has two versions in the selector:release(stable) anddev(development). The root URL redirects to/release/by default. The release documentation index page shows the release date extracted from commit messages.
2025-11-25
- Commit:
2be0cff - Diff:
fac4eaf...2be0cff - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2025-11-25")'
Added
- Added CI workflow for testing the vendored release environment. This validates that changes to master don't break the release branch. (aviatesk/JETLS.jl#321)
- Added CI workflow for the
releasebranch with tests and documentation deployment. Documentation for thereleasebranch is now available at https://aviatesk.github.io/JETLS.jl/release/. (aviatesk/JETLS.jl#321)
Fixed
- Fixed vendoring script to remove unused weakdeps and extensions from vendored packages. These could interact with user's package environment unexpectedly. Extensions that are actually used by JETLS are preserved with updated UUIDs. Fixes aviatesk/JETLS.jl#312. (aviatesk/JETLS.jl#320)
2025-11-24
- Commit:
fac4eaf
Changed / Breaking
- Implemented environment isolation via dependency vendoring to prevent conflicts between JETLS dependencies and packages being analyzed. All JETLS dependencies are now vendored with rewritten UUIDs in the
releasebranch, allowing JETLS to maintain its own isolated copies of dependencies. This resolves issues where version conflicts between JETLS and analyzed packages would prevent analysis. Users should install JETLS from thereleasebranch usingPkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release"). (aviatesk/JETLS.jl#314)- For developers: See https://github.com/aviatesk/JETLS.jl/blob/master/DEVELOPMENT.md#release-process for details on the release process.
- Migrated the JETLS entry point from the
runserver.jlscript to thejetlsexecutable app defined by JETLS.jl itself. This significantly changes how JETLS is installed and launched, while the new methods are generally simpler: (aviatesk/JETLS.jl#314)- Installation: Install the
jetlsexecutable app using:
This installs the executable tojulia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release")'~/.julia/bin/jetls. Make sure~/.julia/binis in yourPATH. - Updating: Update JETLS to the latest version by re-running the installation command:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="release")' - Launching: Language clients should launch JETLS using the
jetlsexecutable with appropriate options. See https://aviatesk.github.io/JETLS.jl/release/launching/ for detailed launch options. - The VSCode language client
jetls-clientand Zed extensionaviatesk/zed-juliahas been updated accordingly.
- Installation: Install the
- Changed diagnostic configuration schema from
[diagnostic.codes]to[[diagnostic.patterns]]for more flexible pattern matching. (aviatesk/JETLS.jl#299) - Renamed configuration section from
[diagnostics]to[diagnostic]for consistency. (aviatesk/JETLS.jl#299)
Added
- Added configurable diagnostic serveirty support with hierarchical diagnostic codes in
"category/kind"format. Users can now control which diagnostics are displayed and their severity levels through fine-grained configuration. (aviatesk/JETLS.jl#298) - Added pattern-based diagnostic configuration supporting message-based matching in addition to code-based matching. Supports both
literalandregexpatterns with a four-tier priority system. (aviatesk/JETLS.jl#299) - Added file path-based filtering for diagnostic patterns. Users can specify glob patterns (e.g.,
"test/**/*.jl") to apply diagnostic configurations to specific files or directories. (aviatesk/JETLS.jl#313) - Added LSP
codeDescriptionimplementation with clickable documentation links for diagnostics. (aviatesk/JETLS.jl#298) - Added this change log. (aviatesk/JETLS.jl#316)
Fixed
- Fixed UTF-8 position encoding to use byte offsets instead of character counts. This resolves misalignment issues in UTF-8-based editors like Helix while maintaining compatibility with UTF-16 editors like VS Code. (aviatesk/JETLS.jl#306)