Skip to content

release: 2026-06-26#779

Merged
aviatesk merged 25 commits into
releasefrom
releases/2026-06-26
Jun 26, 2026
Merged

release: 2026-06-26#779
aviatesk merged 25 commits into
releasefrom
releases/2026-06-26

Conversation

@aviatesk

@aviatesk aviatesk commented Jun 26, 2026

Copy link
Copy Markdown
Owner

This PR releases version 2026-06-26.

Checklist

  • release / Test JETLS.jl with release environment
  • release / test_app / Test jetls serve
  • release / test_app / Test jetls check
  • release / test_app / Test jetls schema
  • release / check_schemas / Check schemas are up to date

Post-merge

  • The releases/2026-06-26 branch can be deleted after merging
  • CHANGELOG.md will be automatically updated on master

github-actions Bot and others added 25 commits June 23, 2026 08:12
Hover on expressions inferred as `Core.Const(nothing)` or
`Core.Const(missing)` previously appended the raw lattice value as a
detail comment, which could appear tedious, since the header already
shows `Nothing` or `Missing`.

Skip extended lattice details for `Core.Const` values whose payload is
`nothing` or `missing`, preserving details for other constant lattice
elements.

Co-Authored-By: GPT-5.5 <noreply@openai.com>
Signed-off-by: John E <jeis4wpi@outlook.com>
The TypeAnnotation test for tuple-yield comprehensions used a typed destructuring iterator form that is not valid Julia syntax. That made the test sensitive to JuliaLowering behavior for malformed input instead of checking the intended user-visible type query.

Switch the case to a valid tuple destructuring generator while preserving the assertion that the yielded tuple expression is annotated as `Tuple{Float64, Float64}`.

Co-Authored-By: GPT-5.5 <noreply@openai.com>
Hovering on the name inside a symbol literal such as `:foo` previously
rendered `foo :: Symbol  # Core.Const(:foo)`. This could look like a
hover on a normal binding named `foo`, and the raw constant lattice
value was redundant because the literal itself is already visible.

Use the surrounding symbol-literal syntax for the hover header and range
while retaining the inner identifier range for the type query. Also skip
binding-doc lookup for such literals so a same-named global does not
affect the hover.

Covered by `test/test_hover.jl` cases for `:foo`, `:(foo)`, and a
same-named documented global.

Co-Authored-By: GPT-5.5 <noreply@openai.com>
Update the JuliaSyntax and JuliaLowering revisions used by JETLS.
The newer JuliaLowering checkout changes typed generator lowering, so
queries for typed comprehension bodies such as `[x for x::Int in xs]`
can otherwise surface intermediate type-checking results in type
annotations and inlay hints.

Adjust `TypeAnnotation` to treat opaque-closure construction ranges as
body-result queries when a scoped closure return value is available.
This keeps the yielded expression annotated with its source-level value
while leaving annotations for inner expressions such as `y`, `z`, and
`sin(y)` intact.

Adds TypeAnnotation coverage for typed iterator bodies with branching
and block-form expressions.

Co-authored-by: GPT-5.5 <noreply@openai.com>
Update dependency revisions that affect JETLS analysis behavior. This
pulls in fixes for world-age-related failures that could surface as
`toplevel/error` diagnostics when analyzing top-level `@eval` loops
that generate methods.

Bump the staged `JET.jl` revision and `Revise` compat/source pin,
and record the dependency-update and issue-closing notes in
`CHANGELOG.md`.
Repeated script or notebook re-analysis could leave methods from an old
virtual module visible. It could also try to delete the same method
twice and log `Method ... already disabled` during cleanup.

Remove the previous analysis result from `AnalysisRequest` so queued,
debounced, and pending requests only carry scheduling metadata.
Build `AnalysisExecution` at resolve time to capture the current
baseline result for the whole run, including intermediate result publication
, and make method cleanup skip already-disabled methods.

Co-authored-by: GPT-5.5 <noreply@openai.com>
`vendor-deps.jl --local` rebuilt root `[sources]` from scratch.
That dropped source entries for non-vendored direct dependencies,
including `Revise`, so the final `Pkg.instantiate()` fell back to
General and failed while `Revise` 3.16 was still unreleased.

Keep the existing `[sources]` table when updating the root project.
Vendored packages still overwrite their own source entries, while
non-vendored entries are preserved.

Co-authored-by: GPT-5.5 <noreply@openai.com>
Lowering failures during type annotation currently emit an error log
even when the server can recover by returning `nothing`. This makes
routine parse or lowering failures noisy outside development mode.

Wrap the existing `@error` path in `JETLS_DEV_MODE` and print the
caught backtrace only in that mode. The production path continues to
recover by returning `nothing` without adding language server log noise.
JETLS development mode previously ran Revise from the LSP receive
callback and dispatched handlers with `@invokelatest`. When JETLS
analyzed itself, ordinary requests could update both the analyzed
code and the running language-server machinery to the latest methods.

Add a server world age captured at initialization and route dev-mode
handler dispatch through `Base.invoke_in_world`. Apply Revise before
Revise-based full analysis so the analysis snapshot sees updated package
methods without changing the running server code. Add a `.JETLS_REVISE`
watched-file trigger to apply Revise and explicitly advance the server
world when needed.

This does not isolate mutable globals or existing server state.
Structural changes to running server objects may still require
a restart.
The server callback hook was originally used to observe every incoming
and outgoing LSP message. In development mode it also served as the
place where Revise was invoked, which made the running server machinery
update on ordinary message receipt.

Now that Revise is applied at explicit analysis and server-world
advancement points, the generic callback path is no longer needed for
production server execution. Remove the callback-based `runserver` entry
points and make `Server` store only an optional concrete message
recorder used by tests.

This is an internal API cleanup. Code that used
`runserver(callback, ...)` or `Server(callback, endpoint)` should use
the supported `Server(endpoint)` path or the test-only
`ServerCallback` recorder instead.
The zero-argument test server constructor carried a
`suppress_notifications` flag, but the flag only guarded one
diagnostics-clear notification path. Most server notifications and
diagnostics refreshes ignored it, so the name overstated its behavior
and kept extra constructor plumbing around.

Remove the flag from ServerState and Server constructors. The cache
update path now sends the diagnostics-clear notification whenever
deleted testset information requires it, and the CLI check server no
longer passes the obsolete option.
Native inference helpers previously invoked CC.typeinf through a dedicated NATIVE_INFERENCE_WORLD captured during initialization. That added a second implementation-world pin separate from server dispatch, making the helper behavior harder to reason about.

Call CC.typeinf directly from infer_frame! and abstract_call_const while keeping the target analysis world on CC.NativeInterpreter(world). This leaves world selection to the caller and removes the unused initialization hook.

Tests were not run; this commit only records the staged cleanup.
`LSInterpreter` precompilation is now fixed so that it actually works.
As a result, `Foo` is now genuinely defined in `__demo__` along the
JET's virtual process, which makes it possible to exercise other LSP
features using it later.

Using that, JETLS now exercises the property-completion pass,
precompiling `native-inference.jl`.

Also exercise the `collect_type_inlay_hints!` workload, precompiling
`TypeAnnotation`.

Co-Authored-By: GPT-5.5 <noreply@openai.com>
…778)

Property completion (`obj.`) previously returned no suggestions in
some contexts where the incomplete `prefix.│` accessor at the cursor
prevented type inference of the prefix, such as inside `try`/`catch`
blocks or on the right-hand side of an assignment (`out = obj.`).

Introduce `get_dotprefix_inferred_ctx`, which builds the inferred
context from a virtual source where the cursor's incomplete `.partial`
accessor is removed, instead of relying on generic AST repair to
handle every parser-recovery shape around `prefix.│`. The helper
`property_completion_hole_end` computes the byte range to delete (the
dangling dot plus any partially-typed identifier under the cursor).
Since property completion only needs the prefix type, this narrower
virtual-source approach sidesteps the fragile recovery cases that
previously broke inference.

Add tests covering `r.│` and `out = r.│` inside a `try`/`catch` block.

Co-authored-by: GPT-5.5 <noreply@openai.com>
@aviatesk
aviatesk merged commit 0d67c12 into release Jun 26, 2026
10 checks passed
@aviatesk
aviatesk deleted the releases/2026-06-26 branch June 26, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants