Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
bae92bc
Razor foundation: spec, plan, fixture solution, and C# features insid…
MelbourneDeveloper Oct 19, 2026
3bc8285
Format RazorCompiler.props, and keep the repository's analyzer severi…
MelbourneDeveloper Oct 19, 2026
084d5ce
Video search and playable social previews for every docs film
MelbourneDeveloper Oct 19, 2026
f0ba77a
Razor host routing, and document symbols, folding and linked editing …
MelbourneDeveloper Oct 19, 2026
60a836f
Point lspkit at main, which ignores the local Deslop index
MelbourneDeveloper Oct 19, 2026
5c99b81
Serve the Razor HTML projection through the host, and tick the Razor …
MelbourneDeveloper Oct 19, 2026
73df9bf
Razor spec: describe the engine's three capture passes, the markup fa…
MelbourneDeveloper Oct 19, 2026
5f64634
Razor in VS Code and Zed: sync, activation, HTML forwarding, and an e…
MelbourneDeveloper Oct 19, 2026
4489091
One query skeleton for documents, Razor positions, projections and ma…
MelbourneDeveloper Oct 19, 2026
9131ec0
Razor spec: declare the compiler types the markup facts model uses, s…
MelbourneDeveloper Oct 19, 2026
dfc9d49
Razor HTML projection and markup-context tokenizer
MelbourneDeveloper Oct 19, 2026
2d58669
Razor spec: Zed attaches the server to the community Razor language
MelbourneDeveloper Oct 19, 2026
a17e238
Razor plan: the foundation and the editors are done
MelbourneDeveloper Oct 19, 2026
156b84f
Test the C# symbols behind Razor markup, and tell the generic @bind h…
MelbourneDeveloper Oct 19, 2026
ab742a2
Test the markup lookups by offset: tag, bound attribute and directive…
MelbourneDeveloper Oct 19, 2026
70bf531
End the Razor session with a clean shutdown, so the server writes its…
MelbourneDeveloper Oct 19, 2026
6caf4eb
Test the Razor endpoints over the sidecar's real socket
MelbourneDeveloper Oct 19, 2026
5b20c4b
Test that a Razor edit made before the workspace loads is replayed in…
MelbourneDeveloper Oct 19, 2026
a96f3a3
Test completion's additional edits through real Razor projections
MelbourneDeveloper Oct 19, 2026
8943a6b
Rename skips the Razor reference search in solutions without Razor files
MelbourneDeveloper Oct 19, 2026
f75afd9
Look for Razor projections only in projects that list a Razor file
MelbourneDeveloper Oct 19, 2026
c351c5d
Split the linked editing answer out of its handler
MelbourneDeveloper Oct 19, 2026
b6a3466
Razor plan: record the foundation's Release validation
MelbourneDeveloper Oct 19, 2026
1f29cc0
Date each watch page by its video's upload, not by the checkout that …
MelbourneDeveloper Oct 19, 2026
66f8940
Razor HTML forwarding lives and dies with the client, and forgets clo…
MelbourneDeveloper Oct 19, 2026
8044569
Razor HTML: test every reachable tokenizer and comment path, drop the…
MelbourneDeveloper Oct 19, 2026
85a34c0
Test Razor markup that has no projection: a stray file, a refused URI…
MelbourneDeveloper Oct 19, 2026
11e9721
Razor sidecar: test the projection, span map, rename, settings and fi…
MelbourneDeveloper Oct 19, 2026
014ee9f
Host: test Razor structure requests without a sidecar, and postfix te…
MelbourneDeveloper Oct 19, 2026
64372af
Razor HTML tokenizer: reconsume after a stray slash, a doubled `<` an…
MelbourneDeveloper Oct 19, 2026
2079443
Type definition and declaration share one Razor-aware location query
MelbourneDeveloper Oct 19, 2026
e0720e1
Ratchet the C# sidecar coverage threshold to 95.39%
MelbourneDeveloper Oct 19, 2026
6aba324
Razor plan: record the final validation counts and full new-code cove…
MelbourneDeveloper Oct 19, 2026
0ca0e2a
Razor import files never mark their usings unnecessary
MelbourneDeveloper Oct 19, 2026
4cbc805
No Razor file reports a using as unnecessary
MelbourneDeveloper Oct 19, 2026
4aa7d6a
The VS Code Razor fixture keeps the repository's SDK pin in its scrat…
MelbourneDeveloper Oct 20, 2026
5c9a882
The Rust Razor fixture keeps the repository's SDK pin in its scratch …
MelbourneDeveloper Oct 20, 2026
b19d0bd
The Razor target-path formatter lives in NativePaths
MelbourneDeveloper Oct 20, 2026
0d07edf
Merge remote-tracking branch 'origin/main' into feature/397-razor-sup…
MelbourneDeveloper Oct 20, 2026
8979d33
Fix Razor signature help scaffolding and escaped identifier rename
MelbourneDeveloper Oct 20, 2026
9df8ea3
Blazor and Razor docs, walkthrough film and announcement post in Engl…
MelbourneDeveloper Oct 20, 2026
326d307
The Blazor post's cover shows the real hover still, and its hover cla…
MelbourneDeveloper Oct 20, 2026
d5ab5c7
Use standard C# keyword scopes and correct F# semantic highlighting
MelbourneDeveloper Oct 20, 2026
b7d301d
A watch page ignores a non-finite ?t= instead of throwing
MelbourneDeveloper Oct 20, 2026
7706620
The docs sidebar lists Blazor & Razor under Write code, after F#
MelbourneDeveloper Oct 20, 2026
05fd821
The Blazor docs name the open completion-after-a-dot gap (#401) in ev…
MelbourneDeveloper Oct 20, 2026
2a35dde
Record full Razor regression review and test strengthening evidence
MelbourneDeveloper Oct 20, 2026
8de4acc
Razor completion right after a typed dot offers members (#401)
MelbourneDeveloper Oct 20, 2026
5e5dccc
Keep F# value-type constructor tokens in the struct category
MelbourneDeveloper Oct 20, 2026
48966d7
Completion after a dot works (#401), so the Blazor docs no longer lis…
MelbourneDeveloper Oct 20, 2026
f921918
Blazor translations: scaffolding never reaches the reader, VS Code's …
MelbourneDeveloper Oct 20, 2026
029fc3a
Use the bundled Razor generator when an SDK requires newer Roslyn
MelbourneDeveloper Oct 20, 2026
4b60f33
Strengthen the check against editor token color overrides
MelbourneDeveloper Oct 20, 2026
84dd286
Prove Razor C# features with a newer SDK's Razor generator (#399)
MelbourneDeveloper Oct 20, 2026
ac5f04a
Remove an unreachable compiler-version guard and update regression ev…
MelbourneDeveloper Oct 20, 2026
8c418ce
Newer SDKs work without a pin (#399): the Blazor docs and post explai…
MelbourneDeveloper Oct 20, 2026
f12be29
Razor completion inside a call in an unfinished @( offers members (#404)
MelbourneDeveloper Oct 20, 2026
2205e7b
Record nested Razor completion regression and full suite evidence
MelbourneDeveloper Oct 20, 2026
f4ce193
Ratchet the C# sidecar coverage threshold to 95.49%, and record the R…
MelbourneDeveloper Oct 20, 2026
9ac337c
Record successful Razor host proof against real SDK 10.0.401
MelbourneDeveloper Oct 20, 2026
64a9987
Razor plan: SDK 10.0.401's compiler confirms the #399 root cause, and…
MelbourneDeveloper Oct 20, 2026
e16cced
Assert completion caret boundaries and later Razor source mappings
MelbourneDeveloper Oct 20, 2026
8475b7a
Reshoot the Blazor film: Roslyn completion at every dot, with VS Code…
MelbourneDeveloper Oct 20, 2026
cd48e54
Razor spec: completion finishes an unfinished expression in a copy of…
MelbourneDeveloper Oct 20, 2026
1702412
Razor plan: track #405, HTML projection word suggestions at C# positions
MelbourneDeveloper Oct 20, 2026
92ee2c1
Ratchet the duplication threshold to 6.48%: this branch measures 6.46…
MelbourneDeveloper Oct 20, 2026
05b6279
Razor plan: track review R9's pending editor run, and blank C# in HTM…
MelbourneDeveloper Oct 20, 2026
233ba29
The Blazor post names SharpLsp 0.30, the release that ships it and de…
MelbourneDeveloper Oct 20, 2026
a3c7937
Reshoot the Blazor film on the #405 build: C# completion lists hold o…
MelbourneDeveloper Oct 20, 2026
fb1fff3
Forward Razor HTML features only at compiler-owned markup positions
MelbourneDeveloper Oct 20, 2026
694b48c
The HTML projection blanks directive attributes and the C# in attribu…
MelbourneDeveloper Oct 20, 2026
d3697e7
Razor plan: #405 and #407 are done
MelbourneDeveloper Oct 20, 2026
994a03b
Replace the Blazor blog header with original illustrated artwork
MelbourneDeveloper Oct 20, 2026
925b896
Razor plan: #399 is done, with CI proof on SDK 10.0.401
MelbourneDeveloper Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .deslop.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# agent-pmo:a72c926
[threshold]
max_duplication_percent = 6.65
max_duplication_percent = 6.48

[defaults]
exclude = [
Expand Down
2 changes: 1 addition & 1 deletion coverage-thresholds.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"language": "dotnet"
},
"sharplsp-sidecar-csharp": {
"threshold": 95.39,
"threshold": 95.54,
"language": "dotnet"
},
"sharplsp-sidecar-fsharp": {
Expand Down
16 changes: 16 additions & 0 deletions docs/plans/RAZOR-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,20 @@ The phases below are in dependency order. Each item is checked only when a test
- [x] Verify configuration fallbacks, target-path metadata, current file/import reads, missing files, missing paths, cancellation and failure recovery — `RazorEngineSettingsTests`: 12 passing cases; settings, filesystem and engine each have 100% line coverage
- [x] Sidecar: build the HTML projection and the markup-context tokenizer ([RAZOR-ARCHITECTURE-HTML])
- [x] HTML projection from compiler IR, preserving offsets/newlines and current unsaved text — `RazorHtmlProjectionTests`: 19 passing fixture cases (Blazor and MVC, comments, UTF-16, incomplete tags, unsaved edits)
- [x] The C# in an HTML attribute value (`disabled="@(…)"`) and every directive attribute, including a minimized parameter the compiler gives no span (`@onclick:stopPropagation`) and a binding parameter's value (`@bind:event="oninput"`), is blank in the projection, while the attribute's name, quotes and literal text stay (#407, review R10, Claude2, 694b48c0). Three regressions failed with the fix off, then passed unchanged; the full .NET leg passes and C# coverage ratchets to 95.54%
- [x] HTML markup-context tokenizer — `HtmlMarkupContextTests`: 36 passing cases with 100% line coverage, including malformed start/end tag recovery; the three character-reconsumption regressions were verified failing before the fix and pass unchanged afterward
- [x] Host: `sharplsp/razor/htmlProjection` answers `{ text }`, or `null` for a file no project lists — `test_full_stack_razor_routing_session`
- [x] Verify `sharplsp/razor/htmlProjection` through editor integration — `razor-lsp.test.ts`: the projection keeps the editor's offsets, line breaks and unsaved text, and feeds VS Code's HTML completion and hover

- [x] Sidecar: Razor C# features answer whatever SDK a project resolves (#399). When the project's SDK Razor generator was built against a newer Roslyn than the sidecar's, the bundled Razor compiler loads in its place, and a warning names both Roslyn versions ([RAZOR-ARCHITECTURE-GENERATOR])
- [x] Root cause: a newer SDK's Razor compiler has a higher assembly version than the bundled copy. Roslyn's analyzer loader stands the sidecar's own copy in only once that copy is loaded. Otherwise it loads the SDK's copy, finds it references a newer `Microsoft.CodeAnalysis`, and refuses it for the session. xUnit's discovery always loads the bundled copy before any test runs, which is why the sidecar's own Razor tests passed on runners with SDK 10.0.401 while the end-to-end suites failed. Confirmed on SDK 10.0.401 itself: its compiler is version 10.4.0.0 and references `Microsoft.CodeAnalysis` 5.9, against the sidecar's 5.6
- [x] Failing tests, failing for the bug: `RazorNewerSdkTests` gives the fixture's design-time builds a newer SDK's Razor compiler (a higher assembly version that references a newer Roslyn). In a fresh sidecar process, hover in `Counter.razor` answers null: the process loads that compiler from the SDK's folder, never its own copy, and Roslyn refuses it. In process, the projects keep the newer SDK's generator files. The fixture copies now keep the repository's SDK pin, as the editor suites' copies do
- [x] Fix: at project load, an SDK Razor compiler that references a newer `Microsoft.CodeAnalysis` than the running one is swapped, with its two companion files, for the bundled copies, and a warning names both versions (`RazorGenerator`, Codex1, 029fc3a)
- [x] Pass: the two failing tests pass unchanged, and a third proves a compiler that cannot be read leaves the project as it loaded
- [x] Full sidecar suite and coverage gates with the fix: C# 693/693, F# 447/447, Common 125/125; C# coverage 96.50% ratchets its threshold to 95.49%
- [x] CI proof on a real newer SDK: a Rust end-to-end Razor test whose fixture copy keeps no SDK pin, so runners carrying SDK 10.0.401 load it with that SDK (Codex1, 029fc3a). It passes locally against an isolated real SDK 10.0.401, and in CI: `test_latest_sdk_razor_generator_remains_usable` passes on Rust Shard 2/2 of run 39364686929, whose ubuntu-24.04 image (20261012.334) ships SDK 10.0.401 beside the pinned 10.0.303
- [x] Docs and blog: drop the advice to pin SDK 10.0.303, and explain the bundled-compiler fallback (Claude1, 8c418ced)

**Validation (2026-10-20):** the Release sidecar solution builds with zero warnings and errors; 671 C#, 440 F# and 125 Common tests pass, and all three coverage gates pass. C# coverage is 96.39%, with all 1,530 new C# executable lines covered. `RazorSidecarTests` exercises the real IPC contract and malformed-request recovery; `RazorCompletionEditsTests` covers mapped edits, import deduplication, aliases, static imports and LF/CRLF insertion.

**Editor validation (2026-10-20):** the final Razor chunk passes all 6 cases, the workspace chunk passes all 446 cases (including server-start lifecycle), the debugger chunk passes all 80 cases, and editor lint and formatting pass. The debugger group-outcome test that previously timed out passes unchanged in the full chunk in 6.5 seconds.
Expand All @@ -48,9 +58,14 @@ The phases below are in dependency order. Each item is checked only when a test
- [ ] Definition, type definition, declaration and implementation from mapped positions, with generated component classes landing in their `.razor` file ([RAZOR-FEATURES-DEFINITION])
- [x] References and document highlights across projections, with hidden scaffolding dropped ([RAZOR-FEATURES-REFERENCES])
- [x] C# completion, with mapped edits and `using` → `@using` ([RAZOR-FEATURES-COMPLETION])
- [x] Completion right after a typed dot offers members: `@scores.` and an unclosed `@(scores.` (#401, review R2). Red tests `RazorCompletionRecoveryTests` (Codex1) failed for the bug, then passed unchanged once completion asks a copy of the file with the expression finished at the caret (Claude2). An unclosed `@{` already completed and is kept as a control
- [x] Coverage gates with the #401 fix; the full C# sidecar suite passes with it
- [x] Completion inside a call or lambda of an unfinished `@(` offers members (#404, review R8). Red tests from Claude1's report failed for the bug, then passed unchanged once the copy closes every construct Roslyn's parser reads as open, innermost first, and its map keeps the parts of a fragment outside the C# it inserted. Completion now reads the compiler's diagnostics only when the projection's C# does not parse, and forks only the file's active framework
- [x] Signature help ([RAZOR-FEATURES-SIGNATURE-HELP])
- [x] Signature help after `@(` no longer lists the generator's scaffolding (`AddContent`, `AddAttribute`) (#400, review R1, Codex1): the regression cases failed for the bug, then passed unchanged
- [x] Semantic tokens for C# fragments ([RAZOR-FEATURES-SEMANTIC-TOKENS])
- [ ] Rename and prepareRename — Razor usages and `@code` declarations, from `.cs` and `.razor` origins ([RAZOR-FEATURES-RENAME])
- [x] Escaped identifiers (`@class`) get their Razor rename edits (review R4, Codex1): the real-fixture regression failed for the bug, then passed unchanged

### Phase 3: Blazor Markup

Expand All @@ -71,6 +86,7 @@ The phases below are in dependency order. Each item is checked only when a test

- [x] VS Code: sync `razor` and `aspnetcorerazor` documents, and activate on `onLanguage:razor` ([RAZOR-EDITORS]) — `razor-lsp.test.ts`: a Razor file opens as Razor, and its unsaved edits reach the server
- [x] VS Code: forward HTML completion and hover over `sharplsp/razor/htmlProjection` ([RAZOR-FEATURES-HTML]) — `razor-lsp.test.ts`: element names and HTML hovers in markup, C# completion and hover in code
- [x] A C# position offers C# items alone: no word suggestions from the HTML projection, including after a typed dot and inside an unfinished `@(` (#405, review R9, Codex1, fb1fff3). The client sends the caret, and the projection answers null where the compiler-backed completion target is C#, while tag and attribute names stay markup. The host, sidecar and real-editor regressions failed for the bug, then passed unchanged
- [x] VS Code: add a `razor` end-to-end chunk on both platforms — `test-chunks.json`, in both matrices
- [x] Zed: Razor language registration (Zed has no built-in Razor grammar) — `the_server_attaches_to_the_csharp_fsharp_and_razor_languages`

Expand Down
Loading
Loading