2026-05-27
- Commit:
0b038c7 - Diff:
72cc49c...0b038c7 - Installation:
julia -e 'using Pkg; Pkg.Apps.add(; url="https://github.com/aviatesk/JETLS.jl", rev="2026-05-27")'
Added
-
Added property completion (
x.│/x.partial│). Typing.after a typed expression now offers the properties thatpropertynames(::T)reports for the dot prefix's inferred type — both plain struct fields and types with a custompropertynamesoverload are handled uniformly.
Each candidate's inferred property type (x.field :: T) is resolved lazily, only when the client requests details for a focused item. The resolved documentation also includes the per-field docstring attached to that field in its struct definition, when present.
For union-typed prefixes the offered names are the union of each component'spropertynames, so the commonUnion{T, Nothing}pattern still surfacesT's properties even thoughpropertynames(::Nothing) == (); type details merge each component's per-property type at resolve time.Screen.Recording.2026-05-15.at.18.01.56.mov
-
Added support for "Go to Type Definition" (
textDocument/typeDefinition).
Invoking it on an expression jumps to the definition of its inferred type — e.g. landing on a binding of typeFoojumps to thestruct Foodefinition.
ForUniontypes the response includes one location per constituent.
(#686)
Changed
-
textDocument/hovernow surfaces inferred types alongside documentation.
Any identifier, dot expression, call result, or indexing position can be queried —func(x) :: Int,s[2] :: Float64,Base.Pair :: typeof(Pair), etc. — and the type is queried at the cursor's byte range so flow-sensitive type narrowing is reflected.
Binding hovers additionally carry a kind tag —(argument),(local),(static parameter), or(global)— before the name, making the binding's role in scope visible.
Closures display as function-arrow signatures like(x::Int, y::Int) -> Int, with argument names recovered from the body when available.
Documentation is gathered both from the binding's own docstring and from the docstring of whatever value the expression resolves to via type inference. So e.g. givensv = Some(sin), hovering onsv.valueshowssin's docstring even thoughsindoesn't appear at the cursor. For dot expressions whose LHS is a struct instance (x.y│), the per-field docstring attached toyin its struct definition is also surfaced when present.
When the cursor is on the callee identifier (e.g.sin│(rand(Int)),Base.Math.sin│(x)), the header is promoted to the full call expression (sin(rand(Int)) :: Float64) and the docstring is narrowed to the dispatched method's doc when dispatch resolves to a single method (sin(::Real)). When the cursor sits past a call-like surface's closing punctuation (f(args)│,xs[i]│,[a, b]│, …), only theexpr :: Theader is shown without any docstring body. Non-call cursors (f│) still show every overload's doc.
(#687)Hover on call 
Hover on closure 
-
textDocument/definitionon a call site (f(arg)│orf│(arg)) now narrows to the method dispatch picked for the inferred argument types — e.g.sin│(42)jumps tosin(::Real)only, not to every method ofsin. Bare cursors on the function name (sin│) still return all definitions. -
textDocument/signatureHelpand method-signature completion (textDocument/completion) now narrow overloads using the inferred type of each argument at the call site, including arbitrary local-scope expressions.
Previously only top-level globals and literal arguments contributed to filtering, solet x = rand(); sin(x,│); endshowed everysinmethod;
with the localx :: Float64now folded in, onlysin(::T) where T<:Union{Float32, Float64}is offered. -
textDocument/semanticTokensnow classifies type parameters declared instruct/abstract type/primitive typeheaders (and their use sites inside the type body) astypeParameter. Previously these identifiers were classified as plainvariable. -
lowering/undef-global-varnow suppresses reports as soon as a sibling file in the same analysis unit defines the referenced name. Previously, addingfoo = ...to one file leftfooreferences in other files of the same unit flagged as undefined until the next full-analysis cycle (typically triggered on save) caught up. -
lowering/macro-expansion-errorno longer aborts analysis of the enclosing top-level form. Any misuse JETLS's stubs forBasemacros detect — invalid threadpool literal inThreads.@spawn, duplicate kwarg in@info/@warn/…,@testwithskip+broken, wrong argument count in@assert/@invoke/@kwdef/@assume_effects/…, non-call shape passed to@invoke, malformed@testsetbody, and so on — is now reported in place while the macrocall body still flows through to scope and type analysis.
Previously any of these would propagate aMacroExpansionError, remove the entire macrocall from analysis, and take every other LSP feature requiring full lowering of the enclosing function (hover, inlay, signature help, undef-var, references, …) down with it.
Reports come withErrorseverity when Base would reject the misuse andWarningseverity when Base accepts it silently or only deprecates. -
Documenter admonitions (
!!! note,!!! tip,!!! warning,!!! danger,!!! info,!!! compat) in docstrings now render as Markdown blockquotes with a category-emoji header (e.g.> **💡 Tip**) wherever JETLS surfaces docstrings (hover, completion documentation, signature help).
Previously the!!!block leaked through verbatim, leaving the editor's Markdown view to render it in unintended ways. -
Hover and method-signature completion documentation no longer surface Base's "No documentation found for ..." placeholder paragraph for bindings that exist but carry no docstring. The auto-generated method / type summary that follows the placeholder is still shown, so the hover stays informative without the placeholder noise.
Fixed
-
Fixed spurious diagnostics like
`{ }` outside of `where` is reserved for future usefalsely appearing on Jupyter notebook (.ipynb) files in VS Code. (Fixed #703) -
Fixed
jetls checkfailing with "could not find any files to analyze" on Windows when the current working directory's drive letter casing differed from the URI-normalized form (Closed #679). -
jetls checkno longer rejects files outside the current working directory. Previously, paths such asjetls check ../foo.jlwere classified as out-of-scope by the LSP-style workspace boundary guard and produced "could not find any files to analyze". The CLI now analyzes any file passed on the command line regardless of where it lives relative to the cwd. -
jetls checknow reports parse errors. Previously, files with syntax errors (e.g. an unclosed parenthesis likef(x) = println(x) silently produced "No diagnostics found". -
Fixed spurious
WARNING: Detected access to binding ... in a world prior to its definition worldmessages emitted byjetls checkand other server analyses. -
Identifiers interpolated into docstrings (e.g.
$(TYPEDEF)/$(TYPEDSIGNATURES)from DocStringExtensions.jl) are now treated as real references during scope resolution. As a result,lowering/unused-importno longer falsely reports imports that are only used through docstring interpolations, andlowering/undef-global-varflags interpolations of names that aren't actually in scope. Other LSP features (hover, go-to-definition, find-references, …) also work on identifiers inside docstring interpolations. (Fixed #699) -
Identifiers inside keyword arguments of
@test,@test_broken, and@test_skip(e.g.flagin@test x broken=flag) are now picked up by scope resolution, so undef-var diagnostics and find-references work for them. Previously the keyword arguments were dropped during macro expansion. -
Identifiers inside
@show,@debug,@info,@warn,@error, and@logmsgcalls — including kwarg values (e.g.flagin@info "msg" extra=flag) and splatted operands (e.g.kwsin@info "msg" kws...) — are now picked up by scope resolution, so undef-var diagnostics and find-references work for them. Previously the identifiers in these macros were silently ignored. For the logging macros, duplicate kwarg names also surface aslowering/macro-expansion-erroranchored at the call site. -
Fixed completion items to honor the client's
completionItem.resolveSupport.propertiescapability. Previously, properties such askindandlabelDetailswere updated duringcompletionItem/resolveregardless of whether the client advertised lazy support for them, which caused visible glitches in some clients (e.g. flickering completion lists in cmp-nvim-lsp). (Closed #711)