Skip to content

Test Explorer Debug builds, diagnostic accuracy and refresh; consolidate all branches - #494

Merged
MelbourneDeveloper merged 164 commits into
mainfrom
feature/429-test-explorer-windows
Oct 27, 2026
Merged

MelbourneDeveloper merged 164 commits into
mainfrom
feature/429-test-explorer-windows

Conversation

@MelbourneDeveloper

@MelbourneDeveloper MelbourneDeveloper commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Consolidates every open SharpLsp branch into one, per the one-feature-branch rule.

What's in it

  • Test Explorer (Test Explorer must default test builds to Debug with shared configuration #429): test builds default to Debug and build only the selected project graph, incrementally. The tree refreshes after builds, and every test host a debug run owns is stopped. Reactive discovery contains failures: a target that cannot be listed becomes an error row with a logged warning, never an unhandled rejection.
  • Diagnostics: solution-wide accuracy, freshness, cancellation and reactive refresh for C# and F#, with restore convergence, sidecar-restart recovery, severity and per-file limits and project filters. No result reports clean before the compiler is ready (Use compiler-owned projects in diagnostic protocol smoke tests #471, Resolve compiler apphost aliases in recovery fixtures #472).
  • Analyzer diagnostics ([Bug]: C# LSP does not report diagnostics from external analyzers such as StyleCop #343): IDE code-style rules and external analyzers such as StyleCop now report in the editor. Each diagnostic carries its rule's documentation link (codeDescription), in C# and in F# (FSharpLint).
  • Watched-file reloads run on a background worker, so requests never wait behind a compiler load:
    • Each compiler reopens the workspace it last opened. A reload never reopens a superseded or settings-replaced selection.
    • A reload replays the buffers the compiler's previous graph owned, so owners adopted for open files survive, and documents an explicit selection excluded stay excluded.
    • Restore outputs a compiler's own open wrote are not reloaded again, and a reload never restores again, so restores cannot feed reload storms.
    • A completed reload or disk sync retires the identities that racing pulls minted.
    • Only the compilers whose loaded graph a change concerns reload; a project no compiler loaded reloads none.
  • Restore gate: stale assets are restored before a workspace opens. Inputs include inherited props, central package versions, NuGet configuration and global.json, including a remembered input that has since been deleted. dotnet children resolve the SDK their workspace selects instead of inheriting the C# sidecar's MSBuild registration, and every restore stage is bounded at two minutes.
  • F#:
    • Wildcard <Compile> items come from MSBuild evaluation ([Bug]: F# Bad wildcard support #455).
    • A superseded owner adoption never joins a replacement workspace.
    • Script diagnostics track current references, completion resolution goes back to FCS, and function symbols are classified.
    • A design-time build whose project is deleted while it runs is abandoned at once, instead of holding every F# request for three minutes.
  • C# owner adoption: a project loaded for a file outside the workspace loads under the path its restore recorded. Loading it under another spelling (a Windows drive letter in the other case, or a link) rewrote its obj inputs, so the user's next build recompiled it.
  • Compiler recovery: a respawned compiler is restored without a selected workspace that no longer exists (a deleted scratch solution), instead of failing and respawning forever, and with it again once it is back.
  • Debugger: a disconnect the adapter exits before answering is answered by the router. On Windows netcoredbg exits as its debuggee ends, and VS Code held the dead session until its own timeout.
  • Push clients: a framework switch publishes its diagnostics before it is announced, even when other pushes compete.
  • CI:
    • The SDK diagnostic suites have their own chunk.
    • Fixtures build as users' projects, outside SharpLsp's lint policy.
    • Failing Rust shards keep their sidecar logs, and every VS Code shard keeps the server's and sidecars' logs.
  • Merged branches:
  • lspkit: points at lspkit main (53fd4c6, Let engine changes refresh pulls without superseding them; refuse non-.NET targets before connecting lspkit#30). Pull revisions separate supersession from engine generations, and the .NET profiler refuses non-.NET targets before connecting.

An adversarial review of this branch found eight defects (one critical, five high, one medium, one low). Each is fixed here behind a test that failed first.

Test plan

  • CI green on every leg

dependabot Bot and others added 30 commits October 14, 2026 17:34
Bumps the rust-host group with 3 updates: [tree-sitter](https://github.com/tree-sitter/tree-sitter), [serde_json](https://github.com/serde-rs/json) and [toml](https://github.com/toml-rs/toml).


Updates `tree-sitter` from 0.27.0 to 0.27.1
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](tree-sitter/tree-sitter@v0.27.0...v0.27.1)

Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.151...v1.0.154)

Updates `toml` from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.6...toml-v1.1.8)

---
updated-dependencies:
- dependency-name: tree-sitter
  dependency-version: 0.27.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
- dependency-name: toml
  dependency-version: 1.1.8+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps the rust-zed group in /src/editors/zed with 1 update: [toml](https://github.com/toml-rs/toml).


Updates `toml` from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.6...toml-v1.1.8)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 1.1.8+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-zed
...

Signed-off-by: dependabot[bot] <[email protected]>
…t-upgrades/rust-zed-1725422218 into dependabot-upgrades
Bumps the github-actions group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [taiki-e/install-action](https://github.com/taiki-e/install-action) | `2.87.23` | `2.87.27` |
| [actions/setup-node](https://github.com/actions/setup-node) | `7.0.0` | `7.1.0` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.1` | `8.0.2` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.1` | `7.0.2` |
| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |
| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |


Updates `taiki-e/install-action` from 2.87.23 to 2.87.27
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](taiki-e/install-action@861a07c...ab68953)

Updates `actions/setup-node` from 7.0.0 to 7.1.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@8207627...949feb2)

Updates `actions/download-artifact` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@3e5f45b...9000827)

Updates `actions/upload-artifact` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@043fb46...cf430e0)

Updates `github/codeql-action/init` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

Updates `github/codeql-action/analyze` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.87.27
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/init
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps the website group in /src/website with 1 update: [@playwright/test](https://github.com/microsoft/playwright).


Updates `@playwright/test` from 1.63.0 to 1.64.0
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.63.0...v1.64.0)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.64.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: website
...

Signed-off-by: dependabot[bot] <[email protected]>
…des/github-actions-c88aa5ffdc into dependabot-upgrades
…abot-upgrades/website-3c101cf53b into dependabot-upgrades
Bumps the vscode-extension group in /src/editors/vscode with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.6.4` | `26.6.5` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.71.0` | `8.71.1` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.71.0` | `8.71.1` |
| [playwright](https://github.com/microsoft/playwright) | `1.63.0` | `1.64.0` |
| [prettier](https://github.com/prettier/prettier) | `3.9.9` | `3.9.10` |
| [typescript](https://github.com/microsoft/TypeScript) | `6.0.3` | `7.0.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.0` | `8.71.1` |


Updates `@types/node` from 26.6.4 to 26.6.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@typescript-eslint/eslint-plugin` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/parser)

Updates `playwright` from 1.63.0 to 1.64.0
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.63.0...v1.64.0)

Updates `prettier` from 3.9.9 to 3.9.10
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.9.9...3.9.10)

Updates `typescript` from 6.0.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](microsoft/TypeScript@v6.0.3...v7.0.2)

Updates `typescript-eslint` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: playwright
  dependency-version: 1.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vscode-extension
- dependency-name: prettier
  dependency-version: 3.9.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vscode-extension
- dependency-name: typescript-eslint
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
...

Signed-off-by: dependabot[bot] <[email protected]>
…/dependabot-upgrades/vscode-extension-9912a3cfe6 into dependabot-upgrades
Bumps Fantomas.Core from 8.0.7 to 8.0.8
Bumps FSharp.Compiler.Service from 43.12.401 to 43.12.402
Bumps FSharp.Core from 10.1.401 to 10.1.402
Bumps MessagePack from 3.1.11 to 3.1.12
Bumps Microsoft.CodeAnalysis.NetAnalyzers from 10.0.401 to 10.0.402
Bumps Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0
Bumps System.Security.Cryptography.Xml from 10.0.12 to 10.0.13
Bumps xunit.runner.visualstudio from 4.0.0 to 4.0.1

---
updated-dependencies:
- dependency-name: Fantomas.Core
  dependency-version: 8.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: FSharp.Compiler.Service
  dependency-version: 43.12.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: FSharp.Core
  dependency-version: 10.1.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: FSharp.Core
  dependency-version: 10.1.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: MessagePack
  dependency-version: 3.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: MessagePack
  dependency-version: 3.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: Microsoft.CodeAnalysis.NetAnalyzers
  dependency-version: 10.0.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dotnet-sidecars
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dotnet-sidecars
- dependency-name: System.Security.Cryptography.Xml
  dependency-version: 10.0.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: xunit.runner.visualstudio
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: xunit.runner.visualstudio
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
...

Signed-off-by: dependabot[bot] <[email protected]>
…bot-upgrades/dotnet-sidecars-61cedddb46 into dependabot-upgrades
…e completion

Legacy tag helper elements and attributes become markup facts, with names read
where the compiler gives no span; @addTagHelper, @removeTagHelper and
@tagHelperPrefix scope MVC attribute completion. Builds; tests not yet run.
Bumps the rust-host group with 1 update: [tokio](https://github.com/tokio-rs/tokio).


Updates `tokio` from 1.53.2 to 1.53.3
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-1.53.2...tokio-1.53.3)

---
updated-dependencies:
- dependency-name: tokio
  dependency-version: 1.53.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps the website group in /src/website with 3 updates: [@11ty/eleventy](https://github.com/11ty/buildawesome), [@playwright/test](https://github.com/microsoft/playwright) and [markdown-it](https://github.com/markdown-it/markdown-it).


Updates `@11ty/eleventy` from 3.1.6 to 3.1.7
- [Release notes](https://github.com/11ty/buildawesome/releases)
- [Changelog](https://github.com/11ty/buildawesome/blob/main/docs/release-instructions.md)
- [Commits](11ty/buildawesome@v3.1.6...v3.1.7)

Updates `@playwright/test` from 1.64.0 to 1.64.1
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.64.0...v1.64.1)

Updates `markdown-it` from 15.0.2 to 15.0.3
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](markdown-it/markdown-it@15.0.2...15.0.3)

---
updated-dependencies:
- dependency-name: "@11ty/eleventy"
  dependency-version: 3.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: website
- dependency-name: "@playwright/test"
  dependency-version: 1.64.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: website
- dependency-name: markdown-it
  dependency-version: 15.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: website
...

Signed-off-by: dependabot[bot] <[email protected]>
…abot-upgrades/website-46eb8014e6 into dependabot-upgrades
Bumps the vscode-extension group in /src/editors/vscode with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.71.1` | `8.71.2` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.71.1` | `8.71.2` |
| [eslint](https://github.com/eslint/eslint) | `10.12.0` | `10.13.0` |
| [playwright](https://github.com/microsoft/playwright) | `1.64.0` | `1.64.1` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.1` | `8.71.2` |


Updates `@typescript-eslint/eslint-plugin` from 8.71.1 to 8.71.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.2/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.71.1 to 8.71.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.2/packages/parser)

Updates `eslint` from 10.12.0 to 10.13.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.12.0...v10.13.0)

Updates `playwright` from 1.64.0 to 1.64.1
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.64.0...v1.64.1)

Updates `typescript-eslint` from 8.71.1 to 8.71.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.2/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.71.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.71.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: eslint
  dependency-version: 10.13.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vscode-extension
- dependency-name: playwright
  dependency-version: 1.64.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: typescript-eslint
  dependency-version: 8.71.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps Fantomas.Core from 8.0.8 to 8.0.10

---
updated-dependencies:
- dependency-name: Fantomas.Core
  dependency-version: 8.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
...

Signed-off-by: dependabot[bot] <[email protected]>
…/dependabot-upgrades/vscode-extension-90a4738cce into dependabot-upgrades
…ecar.FSharp/dependabot-upgrades/dotnet-sidecars-58fe4f58b6 into dependabot-upgrades
Bumps the github-actions group with 4 updates: [taiki-e/install-action](https://github.com/taiki-e/install-action), [actions/setup-java](https://github.com/actions/setup-java), [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).


Updates `taiki-e/install-action` from 2.87.27 to 2.87.29
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](taiki-e/install-action@ab68953...8cca091)

Updates `actions/setup-java` from 6.0.1 to 6.1.0
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@de7274f...b843ebf)

Updates `github/codeql-action/init` from 4.38.3 to 4.39.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@24c5418...6f2ac81)

Updates `github/codeql-action/analyze` from 4.38.3 to 4.39.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@24c5418...6f2ac81)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.87.29
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/setup-java
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action/init
  dependency-version: 4.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <[email protected]>
…des/github-actions-6a4e98548a into dependabot-upgrades
…, WebAssembly debugging and Hot Reload

Completes the Razor plan:
- Razor Pages and MVC views: tag helper hover, definition, completion and scope; @model, @Inject and @functions through the projection.
- F# in Razor solutions: hover with F# docs, definition into the F# source, and references and rename across F#, C# and Razor, found by assembly and XML doc identity.
- Editing features from Razor positions: selection ranges, code actions (add @using, generate a handler, extract to code-behind or a component), inlay hints, code lens, and call and type hierarchy. C# hierarchy kinds are PascalCase, as the host maps them.
- Collocated files: .razor.css classes complete as LSP values and define to their selectors, an "import" call defines to its .razor.js, and VS Code nests the files. The attribute at a caret is read by the HTML tokenizer.
- Blazor WebAssembly launches through the sharplsp-blazorwasm debugger and js-debug.
- Razor Hot Reload: a Razor save swaps the additional document in every framework copy. A re-save of committed text answers applied with nothing to apply, for .cs saves too.
- Review fixes: the host maps the Value completion kind, the F# Razor e2e builds its F# library, and fixture copies and hierarchy runners are shared.
…t new advisories

RUSTSEC-2026-0382 (rustls-webpki 0.103.15 -> 0.103.16), RUSTSEC-2026-0381
(webpki-roots 1.0.9 -> 1.0.10), and GHSA-vfgh-jcmw-g37q / GHSA-gfr2-rv44-r23c
(markdown-it 14.3.2 -> 14.3.3 under Eleventy) failed the dependency audit.
On Windows the rename's edit for Scores.fs and the document the test opened
spell the drive letter differently, so a lookup by Uri.path found no edits.
Key the edits by comparablePath(fsPath), merging spellings of one file, and
assert exactly two files are edited.
…e code the pty reported

VS Code's terminal process fires exitCode || 0, and on Windows node-pty can
close conout before ConPTY hands over the exit code, so a run that returned 50
was reported as 0. Each fixture program now writes its code beside its binary;
the test asserts that code exactly, and that the one task exit is that code or
the pty's lost 0, which these programs never return.
…e code the pty reported

VS Code's terminal process fires exitCode || 0, and on Windows node-pty can
close conout before ConPTY hands over the exit code, so a run that returned 50
was reported as 0. Each fixture program now writes its code beside its binary;
the test asserts that code exactly, and that the one task exit is that code or
the pty's lost 0, which these programs never return.
Observe extension task completions and native build outputs through shared signals. Enumerate completed VSTest and MTP outputs without rebuilding, and keep build observations separate from user engagement. Cover F# and C# across all runner modes with real builds and exact MSBuild counters.

Fixes #428
…erseded solution

The background reload read the selected solution once, then waited behind a
slow initial load. A solution switch landing in that gap opened the new
solution first, and the reload's stale open then put the old one back: the
F# sidecar lost the selected project and sharplsp/targetFramework answered
null until a later reload. Every workspace open of a sidecar now holds one
async lock, and the reload re-reads the selection under it, so the last
selection always wins. The new watched_reload_selection e2e reproduces the
interleaving with a slow 16-project solution. [DIAG-LSP-REFRESH]
… a load finishes

lspkit#30 gives PullStore an engine generation that refreshes without
superseding. A sidecar's diagnostics/refresh (a WorkspaceChanged) now uses
it, so a pull racing a project reload completes against its snapshot
instead of being cancelled for as long as the compiler keeps reporting
changes. A compiler finishing the load of the selected workspace is
different: pulls enumerated its inputs while it loaded, so
workspace/initializationComplete and a completed loadSolution still
supersede them, and the first successful pull after a selection carries
every loaded compiler's reports.

lspkit moves to main (53fd4c6), which also brings the .NET engine's
endpoint check: a live non-.NET process is refused as UNSUPPORTED_RUNTIME
before connecting, not after Windows' 30-second pipe timeout.
[DIAG-ANALYSIS-CANCELLATION] [DIAG-IPC-INITIALIZED]
…s MSBuild policy

The fixtures' .editorconfig root cut them off from the repository's rule
suppressions, while the repository-wide Directory.Build.props still applied
AnalysisMode=All and warnings-as-errors, so the Linux build failed on
ProfileTarget's CA1031/CA1303. An empty Directory.Build.props now shadows
the repository's, as the Razor, Blazor and F# profiling fixtures already
do, and ProfileTarget declares the implicit usings and nullability it was
written against. [DIAG-CATEGORIES-ANALYZER]
Owner adoption for a file outside the solution runs in the background,
beside the sidecar's request queue. A workspace/open that replaced the
graph meanwhile was undone when the stale adoption finished last: it
inserted the old owner into the new selection and, for an empty one,
marked it loaded with the old project's options. Every replacement now
advances a workspace epoch before it awaits anything; an adoption commits
only under the epoch it started in, checked and applied under one lock,
and in-flight adoptions are keyed by epoch so a new selection never waits
on a stale load. [SHARPLSP-ARCHITECTURE-PROJECTS-FSHARP-OWNING]
…witch's diagnostics despite competing pushes

Every watched batch reopened the workspace with the stale-input restore
enabled, and that restore rewrote obj/project.assets.json, which arrived
as the next batch: one Razor run traced 102 asset events, every pull
answering -32802 for a minute and hover starving. Batches made only of
SDK restore outputs now reload the compiler without restoring; any other
input keeps the configured restore gate. [DIAG-RESTORE] [DIAG-LSP-REFRESH]

A framework switch's synchronous push treated a publication the
generation gate rejected as done, so the switch could be announced before
its diagnostics. The first push now retries under the newest generation
until it publishes. [NETFX-CONTEXT] [DIAG-PUSH-GATE]
The restore gate proved assets current against the inherited inputs that
exist now, so deleting a Directory.Build.props, Directory.Packages.props
or NuGet configuration that took part in the last restore left nothing to
compare and stale assets passed. Each sidecar now remembers the inherited
inputs a project's assets were last proven against, when the gate passes
or a restore succeeds, and a remembered input that has vanished sends the
project back to the SDK. A failed restore keeps the old proof so the next
open retries. [DIAG-RESTORE]
A build completion or a debounced discovery-input change started a sweep
with nothing to catch it, and the per-operation sharplsp/configuration
request could reject inside it while the server stopped: an unhandled
rejection in the extension host, the stale tree left standing and nothing
logged. A target that cannot be listed now becomes the failed listing the
sweep already renders, logged as a warning, and both reactive launches
catch and log what still escapes. [TEST-REACTIVITY] [TEST-BUILD-CONFIGURATION]
NuGet configuration is a restore input, but neither the reload predicate
nor the shallow ancestor scope recognised nuget.config, so repairing a
package source in an ancestor nuget.config never reached the compiler and
closed-file diagnostics stayed stale. Both now accept it, case-folded.
The diagnostic-input predicates move to paths/inputs.rs so paths.rs keeps
its documentation and stays below the file-size ceiling. [DIAG-RESTORE]
… restore outputs, and retire racing identities

A pull could reach the compiler between a watched edit and the background
worker's closed-file synchronization, memoize the old text, and be
answered unchanged forever, because the completed mutation only scheduled
a refresh. A reload or disk sync now advances the pull revision when it
completes. [DIAG-LSP-REFRESH]

The reload reopened the global selection in both compilers, which a
settings-driven switch never updated and which named the C# solution even
for the F# compiler that opened the root. Each compiler now records the
workspace it last opened under its open lock and a reload reopens exactly
that; a settings switch records the selection for watchers and filters
too. The reload's second replay sent every open buffer, so documents an
explicit selection excluded re-adopted their old owners; it now replays
only the buffers the compiler's previous graph owned, which keeps owners
adopted for open files. [DIAG-TRUTH-RECOVERY]

Restore outputs a compiler's own open wrote were reported after the load
and reloaded it again: FsToolkit's 18 s F# reopen starved hover on CI.
Outputs written before the latest completed open are now skipped; later
ones, or their removal, reload without restoring again. [DIAG-RESTORE]
config.rs had grown past the 500-line ceiling with its inline test module;
the tests now live in config_tests.rs, wired as the other host modules wire
theirs. No test or behaviour changed. [CONFIG-EDITOR-BRIDGE]
A Linux debug-tests run lost ten minutes to an F# workspace/open that never
answered, and the shard's artifact held only the extension host's logs, so
the compiler's side was invisible. The shard now copies the host's and
both sidecars' logs from the system temp folder into the uploaded logs.
[DIST-CI-VSIX-SHARDS]
The Windows run found 4 diagnostics where the C# policy contract expects 3,
and the bare count left no way to tell which document or rule produced the
extra one. The workspace assertion now reports each document's codes,
severities and lines. The assertion itself is unchanged. [DIAG-CONFIG]
Moving config.rs's tests into their own file exposed duplicates the
duplication gate does not count inside an inline test module, and the new
reload and discovery tests repeated their neighbours' setup and leaf
assertions, so the gate failed at 5.952% against 5.95% and every test job
was skipped. The configuration tests are inline again, their near-identical
cases are table-driven (every case keeps its assertion) and config.rs stays
below 500 lines; the reload tests share one select-and-open helper; the
discovery test asserts its leaves with the kit's assertLeavesAre. The score
is now 5.918%, below the last passing commit. [DIST-CI-DESLOP]
No behaviour changes; code moves with its documentation and spec IDs.
- main.rs gives back this branch's growth: build watching joins
  build_monitor.rs, the inbound queue and shutdown fast path move to
  inbound.rs, and push republication moves to diagnostic_publish.rs
  (1889 -> 1688 lines, below main's 1706).
- sidecar/manager.rs keeps its code and moves its inline tests to
  manager_tests.rs (1193 -> 821).
- FSharpWorkspace.fs keeps the workspace state; owner-adoption epochs move
  to FSharpOwningEpoch.fs and workspace loading to FSharpWorkspaceLoading.fs
  (642 -> 482).
[SHARPLSP-ARCHITECTURE-TIERS]
…Roslyn matches

The four real-Roslyn cancellation tests failed only on Linux CI with "real
analyzer did not signal entered". The fixture compiles its cooperative
analyzer in a temp folder outside the repository, so dotnet chose the
newest installed SDK: the Ubuntu runner ships 10.0.401, whose Roslyn is
5.9.0, while the C# sidecar hosts the Roslyn 5.6.0 that the repository's
pinned SDK ships. Roslyn silently loads no analyzers from an assembly built
against a newer compiler, so the analyzer never ran. The fixture now writes
the repository's own global.json, as the VS Code suite's pinned fixtures
already do. Reproduced red and green in the Linux devcontainer with the
runner's SDK set. [DIST-RUNTIME-ACQUIRE] [DIAG-ANALYSIS-CANCELLATION]
The legacy push test pulls workspace/diagnostic only to pump the server's
pushes, but it failed on the standard retriggerable -32802 that a
completed watched-file mutation now correctly answers. The pump retries
supersession through completed_pull_before like every other pull in the
suite; any other error still fails the test. [DIAG-LSP-REFRESH]
Every watched batch reopened both compilers, whatever it touched. The
VS Code debug suites create, build and delete scratch projects beside the
selected solution, so CI reopened the C# workspace 37 times and the F#
workspace 35 times in one Windows run: every reopen design-time built the
fixture graph, perturbing the outputs the suites assert unchanged, and
on Linux one F# reopen sat ten minutes in a restore of a scratch project.

A batch now reloads a compiler only when it touches that compiler's
loaded graph: a project or solution file of its language that it loaded
or that its folder workspace discovers, configuration above one of its
projects, a source added or removed inside one of its projects or edited
there while unknown to it, or a restore output of one of its projects
written after its own latest open. A project no compiler loaded reloads
none. [DIAG-LSP-REFRESH] [DIAG-ARCHITECTURE-SCOPE] [DIAG-RESTORE]
…tage

The C# sidecar registers its pinned SDK for in-process MSBuild through
MSBUILD_EXE_PATH, MSBuildExtensionsPath and MSBuildSDKsPath, and every
dotnet child inherited them. In a workspace without a global.json the CLI
picks the newest installed SDK, which then loaded the pinned SDK's tasks
and failed with MSB4018: the restore gate failed, workspace/open failed
and the C# workspace never loaded. That is every machine whose newest SDK
is not the pinned one, and the Linux CI runner's Razor tests. dotnet
children now start without those variables, from one shared helper the
restore gate and the F# design-time builds use.

A restore of a scratch project also sat ten minutes with no bound,
blocking every F# request behind it. Each restore stage is now bounded at
two minutes, its whole process tree killed on overrun and reported as a
failed restore naming the stage; stdin is closed, the evaluate stage runs
without node reuse, and a failed restore logs what dotnet printed instead
of dropping it. [DIAG-RESTORE]
netcoredbg on Windows exits by itself once its debuggee has ended, so the
disconnect VS Code sends in reply to terminated can reach a process that
never answers it. VS Code then held the dead session until its own
disconnect timeout: the next launch found that session still active and a
breakpoint edit reached an adapter that refused it. The router now answers
every stop request still owed when the adapter dies, since a gone adapter
is the stopped state. [DEBUG-ARCHITECTURE-ROUTER]
One project has several spellings: a link, or a Windows drive letter that
VS Code lowercases while the file system and builds say D:. The C# sidecar
adopted an owner under whichever spelling the opened file arrived with, and
its design-time build rewrote obj inputs that spell the path, such as
build_property.ProjectDir in the generated .editorconfig, a CoreCompile
input. The user's next build then recompiled the project, which is why
Debug rebuilt the referenced library on Windows. The owner now loads under
project.restore.projectPath from its obj/project.assets.json when that names
the same file. [SHARPLSP-ARCHITECTURE-PROJECTS-CSHARP-OWNING]
[DEBUG-FEATURES-LAUNCH-BUILD]
MSBuild can wait forever in BuildSubmission.Execute on a project removed
under it. On Linux CI the F# sidecar reloaded while a debug suite deleted
its fixture, and the design-time build of that fixture's C# reference held
workspace/open, and with it every F# request, for the full three-minute
bound; the next F# test timed out. The F# design-time runner now watches
the project file while MSBuild runs and, once it is gone, stops the process
tree and reports the removal. The three-minute bound is unchanged.
[SHARPLSP-ARCHITECTURE-PROJECTS-FSHARP-CSHARP-REFERENCES] [DIAG-LSP-REFRESH]
A respawned compiler replays the selected workspace before it answers, and
a failed replay discards the connection so the next request retries. A
scratch solution that a scaffolding test selected and then deleted stayed
the remembered F# workspace; once the F# sidecar crashed, every respawn
replayed the deleted solution, failed, and was discarded again, so the
compiler respawned 99 times in two minutes and answered nothing. A
remembered workspace that no longer exists is now skipped while it is
missing and replayed again once it is back. The fake compiler the reload
tests use moves to a shared test module so the recovery test reuses it.
[DIAG-TRUTH-RECOVERY]
@MelbourneDeveloper
MelbourneDeveloper merged commit 5a2ef03 into main Oct 27, 2026
63 checks passed
@MelbourneDeveloper
MelbourneDeveloper deleted the feature/429-test-explorer-windows branch October 27, 2026 05:15
MelbourneDeveloper added a commit that referenced this pull request Oct 27, 2026
Two changes, each behind tests.

- **F# scripts outside any project (#497):** a script is never project-owned (`[SCRIPT-DETECT]`), but semantic queries only checked files against a loaded workspace.
  - In a folder with no F# project, the F# sidecar refused the workspace ("No .fsproj found"), and every query on a script answered nothing.
  - Beside a project that does not list it, a script was checked under that project's options, and answered nothing either.
  - Now a directory or selection with no F# project opens as an empty workspace (`[SCRIPT-DEGRADE]`). A script that no loaded project or script compiles is checked under the options its own directives resolve (`[SCRIPT-FSX-OPTIONS]`), with or without a workspace.
  - Three tests asserted the old refusal. They now assert the empty workspace the spec requires.
- **Coverage floors:** Rust 95.8 → 96.25 and VS Code 96.96 → 97.4: what CI measured on #494, less the gate's one-point tolerance.

The full local ci-prep passed before this was pushed: every lint gate, the .NET suites (158, 488 and 839 tests), both Rust shards with 97.24% coverage, and all 16 VS Code chunks that run on macOS.

Refs #497. The issue closes once a released build is verified.
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