Re-land the sonic decl/impl split with fallback discovery parse reuse - #84844
Merged
Conversation
This reverts commit 5864742.
When a component can't be split (an @inherits/@implements/@typeparam header or unroutable body markup), tag-helper discovery falls back to a second pass over the compilation augmented with the discovery-only decl trees. That pass walked the whole assembly and kept only the fallback types, rebuilding descriptors for every already-discovered splittable component -- costly on large component libraries where most types are components. Resolve the fallback component types from the decl trees and discover only those. Producers examine each type independently, so the descriptors are identical to the full walk's for those types, and the existing ownership filter is unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8188d9c-18d2-4e12-8b25-4c8d99114193
Resolving the fallback component symbols by creating a semantic model per discovery-only decl tree bound each tree against the whole augmented compilation. On a large component library that ran on every generator pass during completion and allocated heavily -- far more than the full-assembly walk it replaced. Look the types up through the compilation's declaration table instead: key a name predicate off each fallback type's final name segment and let the existing descriptor-name filter trim the over-selection. No semantic models are created, and only the fallback types' descriptors are built. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8188d9c-18d2-4e12-8b25-4c8d99114193
A component that cannot be split (an @inherits/@implements/@typeparam header, or body markup the analysis can't route) falls back to discovery over an augmented compilation. Each fallback component was processed twice: once by the generation engine's initial parse, then again by a freshly created declaration engine that re-parsed the same source purely to produce a discoverable decl. For a component-heavy, fallback-dominated app (every MudBlazor component @inherits MudComponentBase) that second parse dominates cold discovery allocation with no offsetting speed gain. The split phase already builds the discoverable declaration surface for a split component from the classified nodes it just parsed. Build the same surface for a fallback component and stash it on the document node; the generator lowers it in place -- reusing the initial parse -- instead of re-parsing through a separate engine. It is never emitted to pre-compilation (the bodiless type shell still plays that role); only its syntax tree feeds slow discovery. The rare shapes with no render method or namespace keep the re-parse path. Measured over 100 fallback components, cold source-generator allocation drops from 19.6 MB to 13.6 MB -- below the pre-split baseline of 17.1 MB. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8188d9c-18d2-4e12-8b25-4c8d99114193
|
Azure Pipelines: Successfully started running 2 pipeline(s). There may be pipelines that require an authorized user to comment /azp run to run. |
Member
Author
|
/pr-val |
Contributor
|
View PR Validation Run triggered by @chsienki Parameters
|
Slow discovery re-parsed every fallback component's decl and re-ran discovery over the whole augmented compilation on any edit, because the fallback decl pipeline compared decls by instance. A fallback decl is markup-free and checksum-suppressed, so a markup-only edit produces a byte-identical decl -- yet each edit still allocated a fresh instance, invalidating the parse and, through the Collect, all of slow discovery. Compare fallback decls by text, matching the split-decl (DeclSources) path that already does this for fast discovery. A markup-only edit now leaves the fallback decl Unchanged, so its parse and slow discovery stay cached. Measured over 100 fallback components, warm allocation for a markup edit drops from 3.2 MB to 0.42 MB -- level with the pre-split baseline of 0.41 MB. This is the interactive path RPS exercises as html-span completion in a component. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8188d9c-18d2-4e12-8b25-4c8d99114193
Member
Author
|
/pr-val |
Contributor
|
View PR Validation Run triggered by @chsienki Parameters
|
davidwengier
approved these changes
Aug 12, 2026
|
Azure Pipelines: Successfully started running 2 pipeline(s). There may be pipelines that require an authorized user to comment /azp run to run. |
Contributor
There was a problem hiding this comment.
Pull request overview
This PR re-lands the Razor “sonic” decl/impl split work and follows through with associated Razor tooling/service reshaping (notably Remote Razor namespace moves and additional decl-document plumbing) while updating a broad set of unit/integration baselines.
Changes:
- Moves/renames multiple Razor OOP/remote-facing feature areas (Completion/Formatting/Tooltip/DocumentMapping/etc.) under
Microsoft.CodeAnalysis.Remote.Razor.*, with corresponding test and benchmark updates. - Extends several protocol/data shapes to carry decl/impl context (for example
InDeclDocumentflags, decl/impl generated document kinds) and updates endpoints/services to use snapshots rather than contexts in some places. - Updates Razor compiler/test infrastructure expectations (phase boundaries, cloning support on additional IR nodes) and refreshes large numbers of integration baseline files.
Reviewed changes
Copilot reviewed 300 out of 2971 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| src/Razor/src/Razor/tools/HtmlCompletionDataGenerator/README.md | Updates generator usage example to the new generated output location under Remote Razor. |
| src/Razor/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.UnitTests/Cohost/HoverAssertions.cs | Updates Tooltip namespace usage to Microsoft.CodeAnalysis.Remote.Razor.Tooltip. |
| src/Razor/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.UnitTests/Cohost/Formatting/FormattingTestBase.cs | Adds Remote Razor formatting namespace usage to match moved formatting implementation. |
| src/Razor/src/Razor/test/Microsoft.VisualStudio.LanguageServices.Razor.UnitTests/Cohost/CohostTextPresentationEndpointTest.cs | Updates endpoint construction to match updated Cohost endpoint dependencies. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Remote.Razor.UnitTests/Tooltip/DocCommentHelperTests.cs | Aligns test namespace with moved Tooltip implementation. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Remote.Razor.UnitTests/Formatting/FormattingUtilitiesTest.cs | Adds Remote Razor formatting namespace import. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Remote.Razor.UnitTests/Completion/LanguageServerTagHelperCompletionServiceTest.cs | Aligns test namespace with moved Completion implementation. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Remote.Razor.UnitTests/Completion/DirectiveVerifier.cs | Aligns test namespace with moved Completion implementation. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Remote.Razor.UnitTests/Completion/DirectiveAttributeCompletionItemProviderTest.ParameterNames.cs | Moves test namespace while retaining use of shared completion types. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/Formatting/HtmlFormattingTest.cs | Updates formatting namespace to Remote Razor formatting. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/Formatting/HtmlFormattingPassTest.cs | Updates DocumentMapping/Formatting namespace usage for Remote Razor. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/Endpoints/CohostSemanticTokensRangeEndpointTest.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/ImplementInterfaceTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/ImplementAbstractClassTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/GeneratePropertyTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/GenerateMethodTests.cs | Updates expected markup formatting in test content. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/GenerateFieldTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/GenerateDeconstructMethodTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/GenerateConversionTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/CodeActions/GenerateConstructorTests.cs | Touches test file header/encoding line. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/AutoInsert/RazorOnAutoInsertProviderTestBase.cs | Updates AutoInsert namespace usage to Remote Razor. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/AutoInsert/CloseTextTagOnAutoInsertProviderTest.cs | Updates AutoInsert namespace usage to Remote Razor. |
| src/Razor/src/Razor/test/Microsoft.CodeAnalysis.Razor.CohostingShared.UnitTests/AutoInsert/AutoClosingTagOnAutoInsertProviderTest.cs | Updates AutoInsert namespace usage to Remote Razor. |
| src/Razor/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Cohosting/Formatting/TestFormattingLoggerFactory.cs | Moves Formatting test helper namespace to Remote Razor formatting. |
| src/Razor/src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/VisualStudioFilePathService.cs | Removes a Visual Studio-specific IFilePathService export (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Tooltip/TypeNameStringResolver.cs | Moves Tooltip implementation namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Tooltip/MarkupTagHelperTooltipFactory.cs | Moves Tooltip implementation namespace; retains shared tooltip dependencies. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Tooltip/DocCommentHelpers.cs | Moves Tooltip helpers namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/SpellCheck/SpellCheckRange.cs | Extends spellcheck range representation to include InDeclDocument. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/SpellCheck/ISpellCheckService.cs | Updates spellcheck service signature to take RemoteDocumentSnapshot. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/SpellCheck/ICSharpSpellCheckRangeProvider.cs | Updates provider signature to take RemoteDocumentSnapshot. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteRazorComponentSearchEngine.cs | Removes a remote search engine export wrapper (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj | Moves HtmlDescriptions.resx logical resource name to Remote Razor project. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Hover/HoverFactory.cs | Moves Hover implementation namespace to Remote Razor and updates Tooltip import. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Hover/HoverDisplayOptions.cs | Moves Hover options namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/SnippetFormatter.cs | Moves formatting helper namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/RemoteFormattingLoggerFactory.cs | Removes remote formatting logger factory wrapper (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/Passes/RazorFormattingPass.cs | Moves formatting pass namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/Passes/HtmlOnTypeFormattingPass.cs | Moves formatting pass namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/Passes/FormattingDiagnosticValidationPass.cs | Moves formatting pass namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/Passes/FormattingContentValidationPass.cs | Moves formatting pass namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/LineInfo.cs | Moves formatting model namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/IndentCache.cs | Moves formatting helper namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/IndentationContext.cs | Moves formatting model namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/IFormattingValidationPass.cs | Moves formatting interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/IFormattingPass.cs | Moves formatting interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/IFormattingLoggerFactory.cs | Moves formatting interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/IFormattingLogger.cs | Moves formatting interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/FormattingVisitor.cs | Moves formatting visitor namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/FormattingSpanKind.cs | Moves formatting enum namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/FormattingSpan.cs | Moves formatting model namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/FormattingLogger.cs | Moves formatting logger namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/FormattingBlockKind.cs | Moves formatting enum namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Formatting/FormattedDocument.cs | Moves formatting model namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/FoldingRanges/IFoldingRangeService.cs | Extends folding range API to accept decl C# ranges. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/RazorEditService.CSharpMember.cs | Moves DocumentMapping namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/PreferAttributeNameDocumentPositionInfoStrategy.cs | Moves DocumentMapping strategy namespace and imports shared mapping types. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/MappingBehavior.cs | Moves mapping behavior enum namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/IDocumentPositionInfoStrategy.cs | Moves mapping strategy interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/DocumentMapping/DefaultDocumentPositionInfoStrategy.cs | Moves default mapping strategy namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/RazorCompletionResolveContext.cs | Moves completion resolve context namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/RazorCompletionItemResolver.cs | Moves completion resolver namespace and imports shared completion/tooltip types. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/RazorCompletionContext.cs | Moves completion context namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/OOPTagHelperCompletionService.cs | Removes a remote completion service wrapper (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/ITagHelperCompletionService.cs | Moves completion service interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/IRazorCompletionItemProvider.cs | Moves completion provider interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/IRazorCompletionFactsService.cs | Moves completion facts service interface namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/LocalHtmlCompletionResolveContext.cs | Moves local HTML completion resolve context namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/LocalHtmlCompletionProvider.PositionKind.cs | Moves local HTML completion provider namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/LocalHtmlCompletionProvider.PositionContext.cs | Moves local HTML completion provider namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/LocalHtmlCompletionProvider.EntityCompletion.cs | Moves local HTML completion provider namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/LocalHtmlCompletionProvider_Fallback.cs | Moves local HTML completion fallback namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/HtmlCompletionImageMonikers.cs | Moves HTML completion image monikers namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/Html/Generated/*.g.cs | Updates generated HTML completion data namespaces to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/ElementCompletionResult.cs | Moves completion result namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/ElementCompletionContext.cs | Moves completion context namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/DirectiveAttributeCompletionItemProvider.AttributeCompletionDetails.cs | Moves directive attribute completion details namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/DirectiveAttributeCompletionContext.cs | Moves directive attribute completion context namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/CompletionSortTextHelper.cs | Moves completion sort helper namespace to Remote Razor and imports shared completion types. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/CompletionReason.cs | Moves completion reason enum namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/CompletionItemResolver.cs | Moves completion resolver base namespace to Remote Razor and fixes imports. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/CompletionContextHelper.cs | Moves completion context helper namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/AttributeCompletionResult.cs | Moves attribute completion result namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Completion/AttributeCompletionContext.cs | Moves attribute completion context namespace to Remote Razor. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/Razor/IRazorCodeActionResolver.cs | Updates resolver signature to use RemoteDocumentSnapshot. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/Html/IHtmlCodeActionResolver.cs | Updates resolver signature to use RemoteDocumentSnapshot. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/CodeActions/Html/HtmlCodeActionProvider.cs | Updates mapping import to Remote Razor mapping types. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/AutoInsert/IOnAutoInsertProvider.cs | Moves auto-insert provider namespace and inlines trigger character contract. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/UriExtensions.cs | Removes GetSystemUri helper and inlines ParsedUri usage. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Remote/CodeActionRequestInfo.cs | Adds decl-document C# request payload field for code actions. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/LanguageServerConstants.cs | Removes the UnformattedRemap code action constant. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/InlayHints/InlayHintDataWrapper.cs | Adds InDeclDocument flag to inlay hint wrapper payload. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Protocol/DevTools/GeneratedDocumentKind.cs | Splits generated C# kind into implementation vs declaration. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Microsoft.CodeAnalysis.Razor.Workspaces.csproj | Removes HtmlDescriptions.resx logical name override (moved to Remote Razor project). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/IFilePathService.cs | Removes IFilePathService abstraction (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Formatting/RazorFormattingOptions.cs | Makes CSharpSyntaxFormattingOptions non-null with default. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/DocumentMapping/DocumentPositionInfo.cs | Adds InDeclDocument flag with default false. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Completion/LspRazorCompletionFactsService.cs | Removes a completion facts service wrapper (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/CodeActions/RazorCodeActionResolutionParams.cs | Changes delegated document URI to DocumentUri with converter. |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/AutoInsert/IOnAutoInsertTriggerCharacterProvider.cs | Removes trigger character provider abstraction (deleted file). |
| src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.CohostingShared/IncompatibleProjectService.cs | Switches URI extraction to DocumentUri.ParsedUri directly. |
| src/Razor/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/Serialization/CompletionListSerializationBenchmark.cs | Updates completion namespace usage to Remote Razor. |
| src/Razor/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/HtmlIntermediateToken.cs | Adds cloning support preserving IsSynthesizedHelper. |
| src/Razor/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/DirectiveTokenIntermediateNode.cs | Adds cloning support preserving directive token state and IsSynthesizedHelper. |
| src/Razor/src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Intermediate/CSharpIntermediateToken.cs | Adds cloning support preserving IsSynthesizedHelper. |
| src/Razor/src/Compiler/Microsoft.AspNetCore.Razor.Language/test/** | Large set of updated/added integration baseline .txt files reflecting updated decl/impl split outputs and pipeline changes. |
dibarbet
approved these changes
Aug 20, 2026
GetRequiredCSharpDocument requires an explicit declarationDocument flag. Two AssetPath/tilde-path diagnostic tests inspect implementation-document diagnostics, so they pass declarationDocument: false to match the other call sites. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
dibarbet
approved these changes
Aug 20, 2026
…lement The declaration/implementation code document split produces separate decl baselines. Add the missing decl IR, decl codegen, and builder baselines for this test so it passes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jjonescz
approved these changes
Aug 21, 2026
This was referenced Aug 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Re-lands the sonic decl/impl split (backed out in #84831 to unblock insertions) together with the slow-discovery perf work (#84808) and a new fix that removes the remaining cold-allocation regression on fallback components.
Why this is safe to re-land now
The split was reverted because a VS insertion showed a cold-allocation regression on fallback-heavy scenarios (Component Classification, cohosting completion) with no offsetting speed gain. This branch addresses the root cause rather than just re-applying the revert.
What's here
GetSymbolsWithName) instead of a per-tree semantic model, and discovers only the fallback types rather than re-walking the whole augmented compilation. (Removed the +535 MB semantic-model regression.)The new fix
A fallback component (an
@inherits/@implements/@typeparamheader, or body markup the analysis can't route) can't be split, so its descriptor comes from discovery over an augmented compilation. Each fallback component was being processed twice: the generation engine's initial parse, then a freshly created declaration engine that re-parsed the same source just to produce a discoverable decl. For an app where nearly every component@inheritsa base (MudBlazor, OrchardCore) every component is a fallback, so that second parse dominates cold discovery allocation.The split phase already builds the discoverable declaration surface for a split component from the nodes it just classified. This builds the same surface for a fallback component and stashes it on the document node; the generator lowers it in place -- reusing the initial parse -- instead of re-parsing through a separate engine. It's never emitted to pre-compilation (the bodiless type shell still fills that role for C# type resolution); only its syntax tree feeds slow discovery. The rare shapes with no render method or namespace keep the re-parse path.
Measurements
Cold source-generator allocation over 100 fallback components (in-memory A/B):
The fallback path is now below the pre-split baseline -- a genuine win, not break-even.
Validation
Microsoft.NET.Sdk.Razor.SourceGenerators.UnitTests: 219 passed / 1 skipped (incl. Keep a fallback component's derived tag helpers during discovery #84818's fallback child-content test).Microsoft.AspNetCore.Razor.Language.UnitTests(component / tag helper / split / bind / discovery / clone): 1672 passed.Draft pending the RPS + Speedometer insertion run.
Microsoft Reviewers: Open in CodeFlow
Update: warm/interactive path fix (html-span completion)
A matched-baseline Speedometer re-run showed the cold-discovery regressions gone but a smaller residual on html-span completion in a component (
CLR_BytesAllocated_devenv) -- the interactive/warm path, a different signature than the cold source-generator work above.Root cause: the fallback decl incremental pipeline compared decls by instance, while the split-decl (
DeclSources) fast path compares by text. A fallback component's decl is markup-free and checksum-suppressed, so a markup-only edit (every keystroke during completion) yields a byte-identical decl -- but the instance changed each run, invalidating the parse and, through theCollect, re-running slow discovery over every fallback component on each edit.Fix: compare fallback decls by text (
Text.ContentEquals), mirroring the fast path. A markup-only edit now leaves the fallback declUnchanged, keeping its parse and slow discovery cached.Measured (100 fallback components, warm re-run on a markup edit):
Guarded by
IncrementalCompilation_WhenFallbackComponentMarkupChanges_SlowDiscoveryStaysCached(verified to fail without the comparer). Full SG suite 220 passed / 1 skipped.