Skip to content

Releases: aviatesk/JETLS.jl

2026-04-14

14 Apr 15:11
d1ebbb2

Choose a tag to compare

  • 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:

// 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.

Added

  • Added inference/non-boolean-cond diagnostic 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.toml version to YYYY.MM.DD (converted from the YYYY-MM-DD release date), so pkg> app status displays 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's untitled: scheme convention (#626).

  • Fixed false "macro name not found" diagnostics on macros like @enumx that internally generate baremodules
    (Closed #628).

2026-04-06

06 Apr 14:05
c954d83

Choose a tag to compare

  • 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, and exit in addition to throw. 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 on y:

    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 @nospecializeinfer with varying varargs arities.
    Updated the bundled Compiler.jl revision with the upstream fix (https://github.com/JuliaLang/julia#61502) (Closed #618).

2026-04-04

04 Apr 01:10
8deefa8

Choose a tag to compare

  • 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-code diagnostic that detects code after block terminators (return, throw, break, continue), including cases where all branches of if/elseif/else or try/catch contain a terminator.
    Unreachable code is displayed as faded/grayed out with the Unnecessary tag.
    A "Delete unreachable code" quick fix code action is also available.

  • Added lowering/ambiguous-soft-scope diagnostic that warns when a variable assignment inside a for/while/try block 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: "Insert global declaration" (preferred) and "Insert local declaration".
    This diagnostic is suppressed for notebook cells, where soft scope semantics are enabled.

Changed

  • lowering/undef-local-var now 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), nested if blocks 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

20 Mar 08:04
d14efce

Choose a tag to compare

  • 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 serve processes are distinguishable in ps/htop when multiple projects are open.
    The title includes JETLS version, workspace path, transport mode, and client process ID.

Fixed

  • Fixed false positive lowering/unused-assignment diagnostic for variables reassigned inside while loops with break/continue.

2026-03-19

18 Mar 18:35
ea73622

Choose a tag to compare

  • 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 @main function support across LSP features (document-symbol, document-highlight, references, rename, completions, diagnostic).

  • Added lowering/unused-assignment diagnostic that detects assignments whose values are never read (dead stores).
    This complements the existing lowering/unused-local diagnostic: lowering/unused-local reports variables that are never used at all, while lowering/unused-assignment reports 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-var now reports a diagnostic for each use site on an undef path individually, rather than only reporting the first one.
  • lowering/undef-local-var @isdefined propagation 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-binding warning for keyword arguments that are only used in computing other keyword arguments' default values (Closed #592).
  • Fixed false positive lowering/unused-import warning for imports used inside quoted expressions in macro bodies or helper functions (Closed #594).
  • Fixed lowering/undef-local-var diagnostic 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" became Hey" instead of "Hey").

2026-03-13

13 Mar 11:51
4280097

Choose a tag to compare

  • 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 @generated functions 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-import warnings for modules with docstrings
    (Closed #586).

  • Fixed server hang when the client terminates abnormaly without sending an
    exit notification (e.g. Neovim)
    (Fixed #580).

2026-03-08

08 Mar 15:16
d32f1cf

Choose a tag to compare

  • 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

  • Fixed highlight range in jetls check (#574).
  • Fixed false "unused argument" warnings for @generated functions.
    Arguments used inside quoted expressions (:(...)) are now correctly
    recognized. Document highlight, find references, and rename also work
    for these arguments
    (Closed #480).

2026-02-27

26 Feb 15:29
5e1f0bb

Choose a tag to compare

  • 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 check in CI pipelines. External packages can use it as:
    - uses: aviatesk/JETLS.jl/.github/actions/check@release
      with:
        files: src/SomePkg.jl
    All jetls check command-line options are available as action inputs.

Changes

  • The previously deprecated behavior of running jetls without a subcommand
    to start the language server has been removed. Running jetls without a
    subcommand or with unrecognized arguments now shows the help message and
    exits. Use jetls serve instead
    (Closed #565).

2026-02-26

25 Feb 16:25
ebcbd60

Choose a tag to compare

  • 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 potential MethodErrors 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 schema CLI command that prints the JSON Schema for JETLS
    configuration. Supports --settings, --init-options, and
    --config-toml options.

  • Added schema generation infrastructure under scripts/schema/ and
    committed generated schema files under schemas/. CI now checks that
    the schema files and jetls-client/package.json stay in sync with
    src/types.jl.

Changed

  • textDocument/documentSymbol now shows for, let, while, and
    try/catch/else/finally blocks inside functions as hierarchical
    Namespace symbols. 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/documentSymbol now strips redundant name prefixes from
    symbol details. (e.g., a symbol named foo with detail foo = func(args...)
    now shows = func(args...) as the detail.

Fixed

  • Fixed textDocument/rename for macro bindings.

  • Fixed bindings in let/for/while blocks inside nested functions
    not appearing as children of those functions in the document outline.

2026-02-16

16 Feb 04:32
e141508

Choose a tag to compare

  • 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 + 1 and
    clos = function (y) ... end) are now analyzed as Function symbols
    for textDocument/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-error
    can be detected from methods within standalone scripts.
    (Fixed #479).

Fixed

  • Fixed jetls check failing to correctly activate user package environments
    during full analysis.

  • Fixed jetls check resolving file path arguments relative to the current
    working directory instead of the --root directory when --root is specified.
    For example, jetls check --root=/path/to/Pkg src/Pkg.jl now correctly
    resolves to /path/to/Pkg/src/Pkg.jl.

  • Fixed false positive lowering/unused-import diagnostics for symbols
    in a package file but used in included files
    (Fixed #547).

  • Fixed rename/document-highlight/references failing for @kwdef structs with
    default values (Fixed #540).

  • Fixed duplicate syntax error diagnostics by skipping ParseErrorReport from
    full-analysis, since syntax errors are already reported via
    textDocument/diagnostic or workspace/diagnostic
    (Fixed #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 #481).

  • Fixed various type instabilities across the codebase caught by the new
    inference/method-error diagnostic running on JETLS itself.

Other

  • Added GitHub issue templates for bug reports and feature requests.