Skip to content

lsp: implement workspace/executeCommand#120

Open
bneiswander wants to merge 21 commits into
purefunctor:mainfrom
bneiswander:pr/lsp-execute-command-build-clean
Open

lsp: implement workspace/executeCommand#120
bneiswander wants to merge 21 commits into
purefunctor:mainfrom
bneiswander:pr/lsp-execute-command-build-clean

Conversation

@bneiswander

Copy link
Copy Markdown
Contributor

Add LSP Execute Commands for Build, Clean, Reset, and Analyzer Refresh

Summary

  • Advertise and handle workspace/executeCommand for a small PureScript-focused command surface: purescript.build, purescript.clean, purescript.reset, and purescript.analyzerRefresh.
  • Add on-demand build support through spago or purs, parse PureScript compiler JSON errors, and publish file-scoped build diagnostics without flooding clients with empty diagnostics for every workspace file.
  • Add safe clean/reset/refresh commands that clear stale diagnostics, preserve existing automatic diagnostics behavior, and avoid publishing diagnostics for dependency/generated/non-file sources.

Motivation

The LSP server did not previously respond to workspace/executeCommand, which blocked editor workflows that expect PureScript commands such as build and clean to be available from command palettes or keybindings.

This PR adds a compatible, intentionally small command surface for common build/clean/reset workflows while keeping default diagnostics behavior unchanged. Diagnostics are still automatically published on open/save by default, and on change only when explicitly enabled.

User-Facing Behavior

New Execute Commands

  • purescript.build: runs the configured external build tool and publishes compiler diagnostics.
  • purescript.clean: deletes the workspace output/ directory and clears stale build diagnostics.
  • purescript.reset: fast diagnostic reset that clears known/open file diagnostics and invalidates analyzer caches without reloading all workspace sources.
  • purescript.analyzerRefresh: recomputes analyzer diagnostics for refreshable workspace source files.

Capability Advertisement

The server now advertises executeCommandProvider.commands with exactly these implemented commands:

  • purescript.build
  • purescript.clean
  • purescript.reset
  • purescript.analyzerRefresh

Unknown workspace/executeCommand requests are rejected with an LSP request error instead of being silently ignored.

Implementation Details

Build Command

  • Adds CLI configuration for selecting the build tool:
    • --build-tool auto
    • --build-tool spago
    • --build-tool purs
  • Adds repeatable --build-arg support for extra build arguments.
  • Uses spago automatically when spago.lock is present, otherwise uses purs when configured/selected.
  • Runs spago build --json-errors for Spago builds.
  • Runs purs compile --json-errors <workspace sources...> for Purs builds.
  • Parses compiler JSON errors from stdout and stderr because tool/version behavior varies.
  • Resolves relative compiler paths, such as src/Foo.purs, relative to the workspace root.
  • Converts compiler JSON errors to lsp_types::Diagnostic values with build-specific sources such as build/spago and build/purs.

Diagnostic Publication Model

  • Tracks analyzer diagnostics and build diagnostics separately.
  • Publishes merged diagnostics for each URI, with build diagnostics first.
  • Suppresses analyzer diagnostics when they have the same range as a build diagnostic to avoid stale/duplicate messages.
  • Keeps analyzer diagnostics for distinct ranges so useful analyzer feedback remains visible.
  • Avoids diagnostic notification floods by publishing build updates only for files that previously had build diagnostics and files reported by the current build.
  • Guards background diagnostic publication with a diagnostics generation counter so stale in-flight work cannot republish diagnostics after reset.

Clean Command

  • Deletes only <workspaceRoot>/output recursively.
  • Treats a missing output/ directory as success.
  • Validates the deletion target before removing files.
  • Clears stored build diagnostics and republishes merged diagnostics for files that previously had build diagnostics, preventing stale build-only errors from lingering after clean.

Reset Command

  • Cancels in-flight analyzer work.
  • Clears stored build and analyzer diagnostics.
  • Publishes empty diagnostics for file URIs that previously had diagnostics and currently open file URIs.
  • Invalidates workspace-symbol and suggestion caches.
  • Keeps currently loaded file contents instead of rediscovering/reloading all workspace sources.

This is intentionally a fast reset. Users can explicitly recompute diagnostics afterward with purescript.analyzerRefresh or purescript.build.

Analyzer Refresh Command

  • Reuses existing per-file analyzer diagnostic computation.
  • Targets only refreshable workspace PureScript source files:
    • file:// URIs
    • .purs files
    • files under the workspace root
  • Excludes dependency/generated/non-workspace paths such as:
    • .spago
    • output
    • .git
    • node_modules
    • non-file URIs such as prim://

Non-Goals

  • Does not implement the full purescript-language-server command set, such as case split or add clause.
  • Does not introduce automatic project-wide diagnostics refresh on save/change.
  • Does not fully emulate IDE server behavior.
  • Does not change the existing default diagnostics triggers.

Safety And Trade-Offs

  • Build diagnostics are parsed from PureScript JSON output instead of scraped from text output, which is less fragile and supports file-scoped diagnostics.
  • The JSON parser intentionally reads only the fields needed for diagnostics, reducing coupling to the full compiler output schema.
  • purescript.clean is restricted to <workspaceRoot>/output to avoid deleting arbitrary paths.
  • Reset is fast and does not discover new/deleted source files by itself; normal file events/source loading plus explicit refresh/build remain responsible for recomputation.
  • External build process cancellation is best-effort; stale diagnostic publication is prevented by the diagnostics generation guard.

Testing

  • Added coverage for execute-command capability advertisement.
  • Added coverage for unknown command rejection.
  • Added reset coverage verifying diagnostics are cleared while loaded files are retained.
  • Added analyzer refresh coverage for multiple files and refreshable source-file scoping.
  • Added clean coverage for deleting output/ in a fixture workspace.
  • Added compiler JSON error parsing coverage.
  • Added diagnostics merge behavior coverage, including build diagnostics winning for same-range analyzer diagnostics and analyzer diagnostics remaining for distinct ranges.

Validation run on the clean PR branch:

cargo check -p purescript-analyzer --tests
cargo nextest run -p purescript-analyzer

Both commands passed. The only warnings were existing deprecation warnings for test construction of InitializeParams.root_path / root_uri.

@coderabbitai

coderabbitai Bot commented May 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7dbba8ae-caf9-4b6f-9905-2dfed1e23c4c

📥 Commits

Reviewing files that changed from the base of the PR and between cb08f4f and 94366f6.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • compiler-bin/Cargo.toml
  • compiler-bin/src/cli.rs
  • compiler-bin/src/lsp.rs
  • compiler-bin/src/lsp/build.rs
  • compiler-bin/src/lsp/error.rs
  • compiler-bin/src/lsp/event.rs
🚧 Files skipped from review as they are similar to previous changes (5)
  • compiler-bin/Cargo.toml
  • compiler-bin/src/cli.rs
  • compiler-bin/src/lsp.rs
  • compiler-bin/src/lsp/event.rs
  • compiler-bin/src/lsp/build.rs

Overview

This PR implements LSP workspace/executeCommand support with four PureScript-specific commands (purescript.build, purescript.clean, purescript.reset, purescript.analyzerRefresh) and introduces a sophisticated diagnostics management system that separates build and analyzer diagnostics while preventing stale results through a generation counter.

Key Changes

Build Command Support

  • Added CLI options --build-tool (auto|spago|purs) with auto-selection when spago.lock exists
  • Executes spago build --json-errors or purs compile --json-errors with 5-minute timeout
  • Parses compiler JSON errors into LSP Diagnostics with build-specific sources (build/spago, build/purs)
  • Implements fallback parsing strategy (whole-buffer then line-by-line) to handle mixed/interleaved output
  • Prevents stale diagnostics via generation token checking before and during publish
  • Shows "Build completed" or "Build failed" with truncated output on failure

Diagnostics Architecture

  • Maintains separate diagnostic maps for build and analyzer sources per URI
  • Implements merge_diagnostics function using composite key deduplication (range/severity/code/source/message)
  • Explicitly suppresses analyzer diagnostics when build diagnostics share the same range
  • Uses atomic diagnostics_generation counter (incremented on reset) to invalidate in-flight work
  • Clears build diagnostics on file change/save to prevent stale results

Reset Command

  • Cancels in-flight analyzer work via engine.request_cancel()
  • Increments diagnostics_generation to prevent republishing stale results
  • Clears both build and analyzer diagnostic maps
  • Publishes empty diagnostics for all affected file URIs with remembered textDocument.version values
  • Preserves loaded file contents (fast reset pattern)
  • Invalidates workspace symbol and suggestion caches
  • Uses delayed background thread (50ms) to avoid notification ordering issues

Clean Command

  • Safely deletes only <workspaceRoot>/output (validates exact path match)
  • Treats missing output directory as success
  • Clears stored build diagnostics and republishes merged diagnostics for affected files

Analyzer Refresh

  • Recomputes diagnostics for all refreshable workspace .purs file:// URIs
  • Excludes configured non-refreshable paths (.spago, output, .git, node_modules, prim://)
  • Removes existing analyzer diagnostics for excluded URIs and republishes from build map
  • Best-effort cancels in-flight engine requests

Document Lifecycle Tracking

  • did_open: Records URI in open_uris and captures textDocument.version
  • did_change: Records new version and invalidates build diagnostics for changed URI
  • did_close: Removes URI from tracking
  • did_save: Invalidates build diagnostics before collecting new diagnostics

Error Handling

  • Added UnsupportedCommand(String) error mapping to INVALID_PARAMS LSP error code
  • Added BuildTimeout and MissingProcessPipe variants for process-related failures
  • Added UrlParseError variant for URL parsing issues

Test Coverage

Comprehensive test suite validates:

  • Reset clears diagnostics while preserving loaded files
  • Merge diagnostics precedence and deduplication behaviour
  • Build diagnostic invalidation on file change
  • Multi-file analyzer refresh dispatch
  • executeCommand capability advertisement
  • Unknown command rejection with proper error code
  • Event dispatch failure handling

Quality Indicators

  • No unsafe code blocks detected
  • No TODO/FIXME markers found
  • Proper thread-safe atomic operations with SeqCst ordering
  • Well-structured event dispatch pattern
  • Generation counter pattern effectively prevents stale diagnostics
  • Delayed diagnostic publishing avoids notification ordering issues in async-lsp

Merge Confidence: 4.5/5

Strengths:

  • Comprehensive test coverage covering normal paths and edge cases
  • Well-designed generation counter pattern prevents stale diagnostics (validated at multiple checkpoints)
  • Proper LSP error codes and error messages
  • Thread-safe concurrent access patterns using Arc<RwLock<>> and atomic operations
  • Clean separation of build and analyzer diagnostic concerns

Minor Considerations:

  • Performance implications for large diagnostic sets not explicitly tested (though deduplication via HashSet is efficient)
  • Delayed diagnostic clearing depends on thread timing (50ms delay), though this is a known pattern in LSP servers
  • No explicit test for corrupted/invalid JSON error output beyond line-by-line fallback strategy

The implementation is production-ready with solid error handling, comprehensive tests, and a well-thought-out approach to preventing stale diagnostics in an async LSP environment.

Walkthrough

Adds an LSP build command (spago/purs) that parses JSON compiler errors into per‑URI build diagnostics, tracks analyzer vs build diagnostics and open document versions, merges/deduplicates diagnostics preferring build results, and wires executeCommand handlers (build/clean/reset/analyzerRefresh) with reset safety via a diagnostics_generation token.

Changes

LSP Build Handler with Diagnostic Management

Layer / File(s) Summary
CLI options and Cargo dependency
compiler-bin/Cargo.toml, compiler-bin/src/cli.rs
Adds serde_json dependency; CLI adds build_tool (Auto/Spago/Purs), repeatable build_arg, and repeatable analyzer_excluded_dir options.
Build execution, parsing, and publication
compiler-bin/src/lsp/build.rs
New Build command runs spago/purs (auto-detect), enforces timeout, captures stdout/stderr, parses full-buffer or line-wise JSON, converts errors to per-URI diagnostics, stores build diagnostics (file:// only), computes affected URIs, and publishes merged diagnostics; supports workspace source discovery and includes unit tests.
LSP error variant extensions
compiler-bin/src/lsp/error.rs
Adds BuildTimeout, MissingProcessPipe, UrlParseError, and UnsupportedCommand variants; maps unsupported commands to INVALID_PARAMS and surfaces inner message.
Analyzer refresh, reset, clean, and generation guarding
compiler-bin/src/lsp/event.rs
analyzer_refresh cancels work and targets workspace .purs files excluding configured directories; reset increments diagnostics_generation, clears diagnostics, publishes empties for affected file:// URIs and invalidates caches; clean only removes exact <root>/output, clears build diagnostics, and republishes merged diagnostics; diagnostics collection guarded against stale publications.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The PR description comprehensively details the implementation of LSP workspace/executeCommand support with four PureScript-focused commands, including build, clean, reset, and analyzer refresh functionality.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
compiler-bin/src/lsp/event.rs (1)

107-112: ⚖️ Poor tradeoff

Hardcoded exclusion list is reasonable but consider making it configurable.

The exclusion of .spago, output, .git, and node_modules is sensible for typical PureScript projects, but consider whether this should be configurable for non-standard project layouts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@compiler-bin/src/lsp/event.rs` around lines 107 - 112, The hardcoded
exclusion list in the closure using path.components(), Component::Normal and
matches!(...) should be made configurable: add a configurable list (e.g.,
Vec<String> or HashSet<String>) on your project/config struct and replace the
inline matches! check with a helper function (e.g., is_excluded_path(path,
&config.excluded_dirs)) that checks each Component::Normal against the
configured names; update the code that constructs the LSP/server options to load
defaults [".spago","output",".git","node_modules"] when no override is provided
and wire the config through to where path.components() is evaluated.
compiler-bin/src/lsp.rs (1)

352-364: ⚖️ Poor tradeoff

Thread spawn with sleep delay is a workaround for LSP buffering.

Lines 352-364 spawn a thread that sleeps before publishing diagnostics to work around async-lsp buffering behavior. This is fragile.

Consider if there's a more reliable way to ensure diagnostics are published after the response, such as:

  • Using async-lsp's built-in notification ordering guarantees
  • Deferring publication via the event system rather than spawning a raw thread
  • Adding a synchronization primitive to confirm the response was flushed

However, if this workaround is necessary for client compatibility, document the specific clients/scenarios where this is required.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@compiler-bin/src/lsp.rs` around lines 352 - 364, The current raw
std::thread::spawn + sleep workaround (using RESET_DIAGNOSTIC_CLEAR_DELAY,
publish_jobs, client.publish_diagnostics) is fragile; replace it with a
reliable, event-driven defer using the async runtime or the async-lsp event loop
instead of sleeping: schedule the diagnostic-clear work as an async task (e.g.,
tokio::spawn or the crate's task scheduler) or post it via the server's event
system after the executeCommand response is confirmed flushed, or use a
synchronization primitive that awaits the response flush before iterating
publish_jobs and calling client.publish_diagnostics; if keeping the delay is
unavoidable, add a concise comment documenting the specific clients/scenarios
requiring this workaround and why RESET_DIAGNOSTIC_CLEAR_DELAY is needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@compiler-bin/Cargo.toml`:
- Line 27: Remove the unused dependency entry once_cell = "1.21.3" from the
Cargo.toml for the compiler binary and update the lockfile; specifically delete
the once_cell line from the dependency list, run cargo update (or cargo clean &&
cargo build) to refresh Cargo.lock and ensure there are no remaining references
to once_cell in the codebase (search for "once_cell" usages to confirm).

In `@compiler-bin/src/lsp/build.rs`:
- Around line 162-175: The run_spago process currently blocks indefinitely;
convert run_spago to an async function and execute the external build under a
timeout: replace std::process::Command usage with tokio::process::Command (or
spawn_blocking and run in a cancellable task) and wrap the awaited output with
tokio::time::timeout, returning a clear LspError on timeout; ensure you forward
args the same way and preserve existing output handling. Apply the same
async/timeout pattern to the other build-invoking function in the file (the
sibling block at lines 177-189) so both spago invocations are time-limited and
return errors if the command exceeds the configured duration.
- Around line 296-318: The function error_to_diagnostic currently hardcodes
DiagnosticSeverity::ERROR; change its signature to accept a severity indicator
(e.g., an additional parameter like severity: DiagnosticSeverity or is_warning:
bool) and use that to set DiagnosticSeverity::WARNING or ERROR instead of the
hardcoded value, keeping existing behavior for cli::BuildTool and reusing
extract_message/extract_range; then update all callers (the code that iterates
PureScript JSON error and warning arrays) to pass the appropriate severity based
on whether the item came from the warnings array or errors array so diagnostics
reflect true severity.

---

Nitpick comments:
In `@compiler-bin/src/lsp.rs`:
- Around line 352-364: The current raw std::thread::spawn + sleep workaround
(using RESET_DIAGNOSTIC_CLEAR_DELAY, publish_jobs, client.publish_diagnostics)
is fragile; replace it with a reliable, event-driven defer using the async
runtime or the async-lsp event loop instead of sleeping: schedule the
diagnostic-clear work as an async task (e.g., tokio::spawn or the crate's task
scheduler) or post it via the server's event system after the executeCommand
response is confirmed flushed, or use a synchronization primitive that awaits
the response flush before iterating publish_jobs and calling
client.publish_diagnostics; if keeping the delay is unavoidable, add a concise
comment documenting the specific clients/scenarios requiring this workaround and
why RESET_DIAGNOSTIC_CLEAR_DELAY is needed.

In `@compiler-bin/src/lsp/event.rs`:
- Around line 107-112: The hardcoded exclusion list in the closure using
path.components(), Component::Normal and matches!(...) should be made
configurable: add a configurable list (e.g., Vec<String> or HashSet<String>) on
your project/config struct and replace the inline matches! check with a helper
function (e.g., is_excluded_path(path, &config.excluded_dirs)) that checks each
Component::Normal against the configured names; update the code that constructs
the LSP/server options to load defaults
[".spago","output",".git","node_modules"] when no override is provided and wire
the config through to where path.components() is evaluated.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 82ed035b-2b1a-4a2e-ab8c-c79393e10977

📥 Commits

Reviewing files that changed from the base of the PR and between 608aeb5 and 32e05e7.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • compiler-bin/Cargo.toml
  • compiler-bin/src/cli.rs
  • compiler-bin/src/lsp.rs
  • compiler-bin/src/lsp/build.rs
  • compiler-bin/src/lsp/error.rs
  • compiler-bin/src/lsp/event.rs

Comment thread compiler-bin/Cargo.toml Outdated
Comment thread compiler-bin/src/lsp/build.rs Outdated
Comment thread compiler-bin/src/lsp/build.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@compiler-bin/src/lsp/build.rs`:
- Around line 134-165: When build_map.is_empty() we currently call
snapshot.client.show_message twice (once with the detailed truncated msg and
then again with a generic "Build failed" via
ShowMessageParams/MessageType::ERROR), causing duplicate notifications; fix by
making the generic "Build failed" notification only sent when we did not already
send the detailed msg (e.g., return early after sending the detailed message or
wrap the second snapshot.client.show_message call in an else branch),
referencing the existing build_map check and the snapshot.client.show_message /
ShowMessageParams usage to locate where to change the control flow.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 35b2c7a5-3ab7-4271-9f94-5370a4c1c46c

📥 Commits

Reviewing files that changed from the base of the PR and between 32e05e7 and 9b741e8.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • compiler-bin/Cargo.toml
  • compiler-bin/src/cli.rs
  • compiler-bin/src/lsp.rs
  • compiler-bin/src/lsp/build.rs
  • compiler-bin/src/lsp/error.rs
  • compiler-bin/src/lsp/event.rs
🚧 Files skipped from review as they are similar to previous changes (3)
  • compiler-bin/src/cli.rs
  • compiler-bin/src/lsp/error.rs
  • compiler-bin/src/lsp.rs

Comment thread compiler-bin/src/lsp/build.rs
@bneiswander bneiswander changed the title Pr/lsp execute command build clean lsp: implement execute command May 15, 2026
@bneiswander bneiswander changed the title lsp: implement execute command lsp: implement workspace/executeCommand May 15, 2026
Spago expects --json-errors as a spago flag, not forwarded to purs. Also parse JSON from both stdout/stderr and avoid publishing diagnostics for non-file URIs to prevent Emacs lsp-mode failures.
Track URIs for which build diagnostics were published and clear only those on the next build. This prevents emitting empty diagnostics for every known file, which can freeze Emacs lsp-mode on large workspaces.
Spago JSON errors report relative filenames (e.g. src/Foo.purs). Join these against the workspace root when building diagnostic URIs so Emacs receives file:// URIs and renders diagnostics correctly.
Persist build diagnostics alongside analyzer diagnostics and publish a merged, de-duplicated set per URI. This prevents build-only errors from disappearing when a file is reopened, and clears both sources on purescript.reset.
Stop reloading and parsing the full workspace on purescript.reset. Reset now clears published diagnostics and invalidates caches while keeping current file contents, making it usable on large projects.
purescript.clean deletes output artifacts; clear stored build diagnostics and republish merged diagnostics so clients don't keep showing stale build-only errors.
Bump a diagnostics generation counter on purescript.reset and have in-flight build/analyzer tasks skip publishing if a reset occurred. This ensures reset reliably clears diagnostics even when background tasks are still running.
Track open document URIs and include them in the reset clear set. This ensures purescript.reset reliably clears visible diagnostics even if the server didn't record them in its diagnostic maps.
Handle purescript.reset directly in the executeCommand handler instead of dispatching via an internal event. This makes reset reliably publish diagnostic clears immediately.
Emit a window/showMessage breadcrumb when purescript.reset is invoked, to confirm executeCommand handling in client traces while diagnosing reset diagnostic clearing.
Always emit a window/showMessage after clearing diagnostics in purescript.reset, to confirm in client traces that reset executed and published clears.
Handle purescript.reset synchronously in the executeCommand request handler by clearing stored diagnostics and publishing empty publishDiagnostics for affected URIs. This avoids relying on internal event dispatch and makes reset effective immediately.
@bneiswander bneiswander force-pushed the pr/lsp-execute-command-build-clean branch from cb08f4f to 410ee89 Compare May 18, 2026 23:48
@codecov

codecov Bot commented May 18, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.07%. Comparing base (b50beaa) to head (94366f6).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #120      +/-   ##
==========================================
- Coverage   83.09%   83.07%   -0.03%     
==========================================
  Files         130      130              
  Lines       23812    23812              
  Branches    23812    23812              
==========================================
- Hits        19786    19781       -5     
- Misses       2238     2241       +3     
- Partials     1788     1790       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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.

1 participant