From 1f56e3cf0e52f9c3f43dd325cdfa1d3e36f35ba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Matou=C5=A1ek?= Date: Mon, 6 Jul 2026 08:37:10 -0700 Subject: [PATCH 1/2] Set EnableProjectLevelAnalysis in all constructors of HotReloadService --- .../HotReload/Api/HotReloadService.cs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs b/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs index 9a96a8ce31ed2..721f27bbe1392 100644 --- a/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs +++ b/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs @@ -3,9 +3,7 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Contracts.EditAndContinue; @@ -14,7 +12,7 @@ namespace Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api; -internal sealed class HotReloadService(SolutionServices services, Func>> capabilitiesProvider) +internal sealed class HotReloadService { private sealed class DebuggerService(Func>> capabilitiesProvider) : IManagedHotReloadService { @@ -131,14 +129,21 @@ public readonly struct Updates private static readonly ActiveStatementSpanProvider s_solutionActiveStatementSpanProvider = (_, _, _) => ValueTask.FromResult(ImmutableArray.Empty); - private readonly IEditAndContinueService _encService = services.GetRequiredService().Service; - + private readonly IEditAndContinueService _encService; + private readonly Func>> _capabilitiesProvider; private DebuggingSessionId _sessionId; + public HotReloadService(SolutionServices services, Func>> capabilitiesProvider) + { + AbstractEditAndContinueAnalyzer.EnableProjectLevelAnalysis = true; + + _capabilitiesProvider = capabilitiesProvider; + _encService = services.GetRequiredService().Service; + } + public HotReloadService(HostWorkspaceServices services, ImmutableArray capabilities) : this(services.SolutionServices, () => ValueTask.FromResult(capabilities)) { - AbstractEditAndContinueAnalyzer.EnableProjectLevelAnalysis = true; } private DebuggingSessionId GetDebuggingSession() @@ -160,7 +165,7 @@ public async Task StartSessionAsync(Solution solution, CancellationToken cancell var newSessionId = _encService.StartDebuggingSession( solution, - new DebuggerService(capabilitiesProvider), + new DebuggerService(_capabilitiesProvider), NullPdbMatchingSourceTextProvider.Instance, reportDiagnostics: false); From a8c77b69c03166863d3639359b57ca55302d3d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Matou=C5=A1ek?= Date: Mon, 6 Jul 2026 08:51:07 -0700 Subject: [PATCH 2/2] Remove legacy overload --- .../HotReload/Api/HotReloadService.cs | 5 ----- .../HotReloadTest/HotReloadServiceTests.cs | 17 ++++++++++------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs b/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs index 721f27bbe1392..ec917a27bfea9 100644 --- a/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs +++ b/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs @@ -141,11 +141,6 @@ public HotReloadService(SolutionServices services, Func().Service; } - public HotReloadService(HostWorkspaceServices services, ImmutableArray capabilities) - : this(services.SolutionServices, () => ValueTask.FromResult(capabilities)) - { - } - private DebuggingSessionId GetDebuggingSession() { var sessionId = _sessionId; diff --git a/src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs b/src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs index 2a63a717e8750..af694fcf45b30 100644 --- a/src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs +++ b/src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs @@ -36,6 +36,9 @@ private static Task GetCommittedDocumentTextAsync(HotReloadService s .GetRequiredDocument(documentId) .GetTextAsync(); + private static HotReloadService CreateHotReloadService(Workspace workspace, ImmutableArray capabilities) + => new(workspace.Services.SolutionServices, () => ValueTask.FromResult(capabilities)); + [Fact] public async Task Test() { @@ -53,7 +56,7 @@ public async Task Test() EmitLibrary(solution.GetRequiredProject(projectId)); - var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -188,7 +191,7 @@ public async Task SourceGeneratorFailure() var generatorDiagnostics = await solution.CompilationState.GetSourceGeneratorDiagnosticsAsync(project.State, CancellationToken.None); Assert.Empty(generatorDiagnostics); - var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -232,7 +235,7 @@ public async Task AdditionalFile() EmitLibrary(solution.GetRequiredProject(projectId)); - var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline", "AddDefinitionToExistingType"]); await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -278,7 +281,7 @@ public async Task AnalyzerConfigFile() EmitLibrary(solution.GetRequiredProject(projectId)); - var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline", "AddDefinitionToExistingType"]); await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -318,7 +321,7 @@ public async Task StaleSource(string language) sourceFileA.WriteAllText(source2, Encoding.UTF8); - var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); // loads source text V2 from disk: await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -375,7 +378,7 @@ public async Task StaleSource_AdditionalFile() additionalFileA.WriteAllText(source2); - var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline", "AddDefinitionToExistingType"]); // V2 of the text is loaded from disk: await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -411,7 +414,7 @@ public async Task HydrateDocumentsAsync(string language) sourceFileA.WriteAllText("source", Encoding.UTF8); - var hotReload = new HotReloadService(workspace.Services, ["Baseline"]); + var hotReload = CreateHotReloadService(workspace, ["Baseline"]); await hotReload.StartSessionAsync(solution, CancellationToken.None);