Skip to content

release: 2025-11-30#346

Merged
aviatesk merged 31 commits intoreleasefrom
releases/2025-11-30
Nov 29, 2025
Merged

release: 2025-11-30#346
aviatesk merged 31 commits intoreleasefrom
releases/2025-11-30

Conversation

@aviatesk
Copy link
Owner

@aviatesk aviatesk commented Nov 29, 2025

This PR releases version 2025-11-30.

Checklist

  • release / Test JETLS.jl with release environment
  • release / Test jetls executable with release environment

Post-merge

  • The releases/2025-11-30 branch can be deleted after merging
  • CHANGELOG.md will be automatically updated on master

aviatesk and others added 30 commits November 28, 2025 00:51
The create-release and update-changelog jobs were failing because they
tried to checkout or fetch the PR head branch (releases/*), which may
already be deleted by the time the workflow runs.

Changed both jobs to use the release branch instead, which contains
the merged content and is always available.

Written by Claude
Pkg.Apps.update("JETLS") does not always work reliably. Changed all
documentation to recommend re-running the installation command
(Pkg.Apps.add with rev="release") for updates instead.

Written by Claude
The Revise integration added during the jetls executable app migration
didn't work properly. Revise assumes it's loaded from a REPL session, so
dynamically loading it via Base.require at runtime failed silently.

This change makes Revise a direct dependency that's conditionally loaded
at compile time based on JETLS_DEV_MODE. When the flag is set, Revise is
imported "normally"; otherwise it's set to `nothing`. This seems to make
Revise work as expected for development while having no impact on
release builds.
Previously, the server would attempt to send an error response for any
message received after a shutdown request. However, notifications don't
have an id field and cannot receive responses per the LSP specification.

This change checks if the message has an id before sending an error
response, silently ignoring notifications that arrive after shutdown.
Previously, when multiple files were opened simultaneously, each could
trigger `lookup_analysis_entry` which calls `activate_do` to switch
environments. Without synchronization, this could cause race conditions
where concurrent environment switches would interfere with each other,
potentially causing package environment detection to fail.

This fix adds a global `ACTIVATE_LOCK` to serialize all `activate_do`
calls, ensuring that environment activation, the callback execution, and
environment restoration happen atomically.
…lts (#337)

Add automatic `Pkg.instantiate()` for environments that have not been
instantiated yet (e.g., freshly cloned repositories or new project
directories). This allows full analysis to work immediately upon opening
files in such environments, whether they are package source files,
test files, or scripts with their own Project.toml.

Also add caching for environment detection results to avoid redundant
`Pkg.instantiate()` calls and `Base.identify_package_env` lookups for
the same environment.

The behavior is controlled by `full_analysis.auto_instantiate` config
option (default: `true`).
The `pending_analyses` check was previously done in `request_analysis!`
before debouncing. This caused a problem when multiple requests for the
same entry arrived during the debounce period: they would all pass the
check (since no analysis was running yet) and all get queued after their
timers fired.

With multiple analysis workers, this could lead to duplicate analyses
running concurrently for the same entry, defeating the purpose of
per-entry serialization.

By moving the check into `queue_request!` (which is called after
debounce), we ensure that only one request per entry is ever queued at a
time.

Also adds a docstring to `request_analysis!` explaining the
`pending_analyses` mechanism and its relationship to generation checks.
…disabled

When `auto_instantiate` is disabled, check if the environment is instantiated
using `Pkg.Operations.is_instantiated` and warn the user if not.

`ensure_instantiated` now returns a boolean indicating whether the environment
is ready for package-level analysis, allowing callers to decide whether to
fall back to script-level analysis.
Refactor the full-analysis system to provide earlier and more accurate
progress reporting. Progress now begins during entry lookup phase
(especially during environment instantiation) rather than waiting for
analysis to actually start. This gives users immediate feedback when
opening files in projects that require instantiation.
Co-authored-by: Camillo Schenone <camillo.schenone@jasco.com>
Co-authored-by: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com>
…rogress (#345)

Split analysis entry lookup into two phases to enable dedicated progress
reporting for environment instantiation and analysis.

Phase 1 (`lookup_analysis_entry`) performs a non-blocking check that returns:
- `AnalysisEntry` directly if no instantiation is needed (cached or no env)
- `InstantiationRequest` if instantiation is required
- `OutOfScope` if the file is out of analysis scope

Phase 2 (`do_instantiation` or `do_instantiation_with_progress`) performs
the actual instantiation when needed.

This design allows the server to issue separate progress tokens for
instantiation and analysis phases, providing users with earlier and
more accurate progress feedback. The `InstantiationProgressCaller` is
non-cancellable since instantiation cannot be cancelled, while
`AnalysisProgressCaller` remains cancellable.

Also consolidate the entry point: replace separate `request_analysis_on_open!`
and `request_analysis_on_save!` functions with a unified `request_analysis!`
that handles both cases via the `onsave` parameter.

Co-authored-by: Claude <noreply@anthropic.com>
)

The `remove_macrocalls` function converts macrocall nodes to block nodes to
enable LSP features to work with local variables inside macrocalls. However,
this transformation caused `@nospecialize` and `@specialize` macros in
function argument lists to become invalid block expressions, which prevented
JuliaLowering from generating correct lowered trees.

This commit adds special handling for these macros: instead of transforming
them, we keep them intact. JuliaLowering.jl provides new macro style
definitions for `@nospecialize` and `@specialize`, so they don't need to be
removed in the first place.

This fix enables document highlight and rename to work correctly for
function parameters annotated with these macros.
auto-instantiation

When `auto_instantiate` is enabled and no manifest file exists, JETLS
now creates a versioned manifest file (e.g., `Manifest-v1.12.toml`)
before running `Pkg.resolve()` and `Pkg.instantiate()`.
…lls` (#347)

Provide mock `@specialize` defintions
@aviatesk aviatesk merged commit f9b2c2f into release Nov 29, 2025
7 checks passed
@aviatesk aviatesk deleted the releases/2025-11-30 branch November 29, 2025 18:11
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