Announcement

SharpLsp 0.19.0: A Run, Debug, and Test Loop You Can Trust

An abstract SharpLsp language-service graph connecting C# braces, F# syntax, project files, packages, and diagnostics

Version 0.19.0 is about the inner loop: press F5, pick a launch profile, hit a breakpoint, read the stack, run the tests. That whole loop now works — and, more importantly, we can prove it works, because every piece of it is covered by end-to-end tests that build real projects and assert real outcomes.

The release ships VSIX packages for all five platforms — win32-x64/arm64, linux-x64/arm64, and darwin-arm64 — with SHA256 checksums on the release page. Here's what changed.

F5 and Launch Profiles, Fixed for Real

The previous run/debug experience had bugs that no amount of UI polish could hide: profiles that dotnet run could see but the extension couldn't, silent failures when a project had more than one profile, and a build step that couldn't be cancelled. We root-caused all three.

The run/debug end-to-end chunk is 21/21 green. These suites launch actual project files, attach, and verify behavior — they don't mock the debugger.

Async Stacks That Read Like Your Code

Debugging async C# has always meant squinting at state-machine internals: a wall of MoveNext frames instead of the await chain you actually wrote. This release introduces the DapRouter (dap-router.ts + dap-frames.ts), a routing layer for the Debug Adapter Protocol that reconstructs the logical async call stack before anything reaches the editor.

With the router in place, pausing inside an awaited call shows the chain you'd expect:

ProcessOrders()
  await ChargeCardAsync()
    await Gateway.PostAsync()   ← paused here

...not three tiers of compiler-generated plumbing.

The DapRouter speaks DAP 1.71 and is also the groundwork for what comes next: netcoredbg and the ICorDebug path become interchangeable behind it, and features on the roadmap — logpoints, DebuggerDisplay emulation, hot reload coordination — build on the same plumbing.

A Test Explorer Backed by End-to-End Proof

Test explorers rot quietly: discovery works on the demo project, then fails on yours. Version 0.19.0 adds seven new end-to-end suites — roughly 4,800 lines of tests — covering:

The outcome assertions check what actually ran, not just what rendered. And the behavior is now specified in TEST-EXPLORER-SPEC.md, so it's documented contract rather than folklore.

Editor Extensions That Can't Quietly Rot

The most valuable fix in this release might be the one you'll never see. During the 0.19.0 cycle we discovered that SharpLsp's own Zed extension shipped test suites that were never executed — some of which were tautologies asserting that constants equal themselves. Green pipelines containing nothing. That is the exact failure mode that produces releases like the ones this post is about, so we fixed it structurally:

Build and Release Hardening

The remaining work is invisible plumbing that keeps the release itself honest:

Getting 0.19.0

Install from the release page (VSIX for your platform, with SHA256 checksums), read the docs, and if something in the inner loop breaks on your project — that's exactly the issue we want.