From 8e78f6a8e7dc37d171eb9e5d6cc569d0e6a8e898 Mon Sep 17 00:00:00 2001 From: Tomas Matousek Date: Fri, 3 Oct 2025 10:21:09 -0700 Subject: [PATCH 1/3] Move Watch EA to a separate assembly Microsoft.CodeAnalysis.ExternalAccess.HotReload --- Roslyn.sln | 20 +- .../Microsoft.CodeAnalysis.CSharp.csproj | 1 + ...crosoft.CodeAnalysis.Test.Utilities.csproj | 1 + .../Microsoft.CodeAnalysis.Features.csproj | 7 +- .../ExternalAccess/HotReload/.editorconfig | 2 + .../HotReload/Api/HotReloadService.cs | 268 ++++++++++++++++++ .../HotReload/InternalAPI.Shipped.txt | 1 + .../HotReload/InternalAPI.Unshipped.txt | 52 ++++ ...deAnalysis.ExternalAccess.HotReload.csproj | 42 +++ .../HotReload/PublicAPI.Shipped.txt | 0 .../HotReload/PublicAPI.Unshipped.txt | 1 + .../ExternalAccessAspNetCoreResources.cs.xlf | 6 + .../ExternalAccessAspNetCoreResources.de.xlf | 6 + .../ExternalAccessAspNetCoreResources.es.xlf | 6 + .../ExternalAccessAspNetCoreResources.fr.xlf | 6 + .../ExternalAccessAspNetCoreResources.it.xlf | 6 + .../ExternalAccessAspNetCoreResources.ja.xlf | 6 + .../ExternalAccessAspNetCoreResources.ko.xlf | 6 + .../ExternalAccessAspNetCoreResources.pl.xlf | 6 + ...xternalAccessAspNetCoreResources.pt-BR.xlf | 6 + .../ExternalAccessAspNetCoreResources.ru.xlf | 6 + .../ExternalAccessAspNetCoreResources.tr.xlf | 6 + ...ernalAccessAspNetCoreResources.zh-Hans.xlf | 6 + ...ernalAccessAspNetCoreResources.zh-Hant.xlf | 6 + .../HotReloadTest/HotReloadServiceTests.cs} | 46 +-- ....ExternalAccess.HotReload.UnitTests.csproj | 19 ++ ...odeAnalysis.Features.Test.Utilities.csproj | 1 + .../Microsoft.CodeAnalysis.Workspaces.csproj | 2 + 28 files changed, 514 insertions(+), 27 deletions(-) create mode 100644 src/Features/ExternalAccess/HotReload/.editorconfig create mode 100644 src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs create mode 100644 src/Features/ExternalAccess/HotReload/InternalAPI.Shipped.txt create mode 100644 src/Features/ExternalAccess/HotReload/InternalAPI.Unshipped.txt create mode 100644 src/Features/ExternalAccess/HotReload/Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj create mode 100644 src/Features/ExternalAccess/HotReload/PublicAPI.Shipped.txt create mode 100644 src/Features/ExternalAccess/HotReload/PublicAPI.Unshipped.txt create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.cs.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.de.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.es.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.fr.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.it.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ja.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ko.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pl.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pt-BR.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ru.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.tr.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hans.xlf create mode 100644 src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hant.xlf rename src/Features/{Test/EditAndContinue/WatchHotReloadServiceTests.cs => ExternalAccess/HotReloadTest/HotReloadServiceTests.cs} (82%) create mode 100644 src/Features/ExternalAccess/HotReloadTest/Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj diff --git a/Roslyn.sln b/Roslyn.sln index 09b0cc37519be..1b7f5590d91a8 100644 --- a/Roslyn.sln +++ b/Roslyn.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36203.30 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11101.28 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RoslynDeployment", "src\Deployment\RoslynDeployment.csproj", "{600AF682-E097-407B-AD85-EE3CED37E680}" EndProject @@ -727,7 +727,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Build.Tasks.CodeA EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.BuildClient.Package", "src\NuGet\Microsoft.CodeAnalysis.BuildClient.Package\Microsoft.CodeAnalysis.BuildClient.Package.csproj", "{5E4F7448-B00B-4F5B-859F-6ED0354253D5}" EndProject -Project("{9a19103f-16f7-4668-be54-9a1e7a4f7556}") = "Microsoft.CodeAnalysis.SemanticSearch.Extensions", "src\Tools\SemanticSearch\Extensions\Microsoft.CodeAnalysis.SemanticSearch.Extensions.csproj", "{66C8265C-2C79-F259-9807-3E97CA586F1E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.SemanticSearch.Extensions", "src\Tools\SemanticSearch\Extensions\Microsoft.CodeAnalysis.SemanticSearch.Extensions.csproj", "{66C8265C-2C79-F259-9807-3E97CA586F1E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CodeAnalysis.ExternalAccess.HotReload", "src\Features\ExternalAccess\HotReload\Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj", "{FDDC4384-F466-DB42-61A7-E21DF5EB84BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests", "src\Features\ExternalAccess\HotReloadTest\Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj", "{D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1803,6 +1807,14 @@ Global {66C8265C-2C79-F259-9807-3E97CA586F1E}.Debug|Any CPU.Build.0 = Debug|Any CPU {66C8265C-2C79-F259-9807-3E97CA586F1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {66C8265C-2C79-F259-9807-3E97CA586F1E}.Release|Any CPU.Build.0 = Release|Any CPU + {FDDC4384-F466-DB42-61A7-E21DF5EB84BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDDC4384-F466-DB42-61A7-E21DF5EB84BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDDC4384-F466-DB42-61A7-E21DF5EB84BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDDC4384-F466-DB42-61A7-E21DF5EB84BB}.Release|Any CPU.Build.0 = Release|Any CPU + {D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2144,6 +2156,8 @@ Global {5399BBCC-417F-C710-46DE-EB0C0074C34D} = {A41D1B99-F489-4C43-BBDF-96D61B19A6B9} {5E4F7448-B00B-4F5B-859F-6ED0354253D5} = {C52D8057-43AF-40E6-A01B-6CDBB7301985} {66C8265C-2C79-F259-9807-3E97CA586F1E} = {52ABB0E4-C3A1-4897-B51B-18EDA83F5D20} + {FDDC4384-F466-DB42-61A7-E21DF5EB84BB} = {58A2876A-618D-4AE6-A136-E44B42BBDE11} + {D03262C0-4AE6-1ED5-7B38-4150DACFF9D8} = {58A2876A-618D-4AE6-A136-E44B42BBDE11} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {604E6B91-7BC0-4126-AE07-D4D2FEFC3D29} diff --git a/src/Compilers/CSharp/Portable/Microsoft.CodeAnalysis.CSharp.csproj b/src/Compilers/CSharp/Portable/Microsoft.CodeAnalysis.CSharp.csproj index a3e31151c8b61..5c8e121997444 100644 --- a/src/Compilers/CSharp/Portable/Microsoft.CodeAnalysis.CSharp.csproj +++ b/src/Compilers/CSharp/Portable/Microsoft.CodeAnalysis.CSharp.csproj @@ -86,6 +86,7 @@ + diff --git a/src/Compilers/Test/Core/Microsoft.CodeAnalysis.Test.Utilities.csproj b/src/Compilers/Test/Core/Microsoft.CodeAnalysis.Test.Utilities.csproj index 96908065e364d..15950e766f40c 100644 --- a/src/Compilers/Test/Core/Microsoft.CodeAnalysis.Test.Utilities.csproj +++ b/src/Compilers/Test/Core/Microsoft.CodeAnalysis.Test.Utilities.csproj @@ -71,6 +71,7 @@ + diff --git a/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj b/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj index 869a972ba0c00..1417818e08cf5 100644 --- a/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj +++ b/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj @@ -53,6 +53,8 @@ + + @@ -105,7 +107,7 @@ - + @@ -143,6 +145,9 @@ + + + diff --git a/src/Features/ExternalAccess/HotReload/.editorconfig b/src/Features/ExternalAccess/HotReload/.editorconfig new file mode 100644 index 0000000000000..13691bc74e7d8 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/.editorconfig @@ -0,0 +1,2 @@ +[**] +dotnet_public_api_analyzer.skip_namespaces = Microsoft.CodeAnalysis.ExternalAccess.AspNetCore.Internal \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs b/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs new file mode 100644 index 0000000000000..55f79f705400a --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/Api/HotReloadService.cs @@ -0,0 +1,268 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Contracts.EditAndContinue; +using Microsoft.CodeAnalysis.EditAndContinue; +using Microsoft.CodeAnalysis.Host; + +namespace Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api; + +internal sealed class HotReloadService(SolutionServices services, Func>> capabilitiesProvider) +{ + private sealed class DebuggerService(Func>> capabilitiesProvider) : IManagedHotReloadService + { + public ValueTask> GetActiveStatementsAsync(CancellationToken cancellationToken) + => ValueTask.FromResult(ImmutableArray.Empty); + + public ValueTask GetAvailabilityAsync(Guid module, CancellationToken cancellationToken) + => ValueTask.FromResult(new ManagedHotReloadAvailability(ManagedHotReloadAvailabilityStatus.Available)); + + public ValueTask> GetCapabilitiesAsync(CancellationToken cancellationToken) + => capabilitiesProvider(); + + public ValueTask PrepareModuleForUpdateAsync(Guid module, CancellationToken cancellationToken) + => ValueTask.CompletedTask; + } + + public readonly struct Update + { + public readonly Guid ModuleId; + public readonly ProjectId ProjectId; + public readonly ImmutableArray ILDelta; + public readonly ImmutableArray MetadataDelta; + public readonly ImmutableArray PdbDelta; + public readonly ImmutableArray UpdatedTypes; + public readonly ImmutableArray RequiredCapabilities; + + internal Update( + Guid moduleId, + ProjectId projectId, + ImmutableArray ilDelta, + ImmutableArray metadataDelta, + ImmutableArray pdbDelta, + ImmutableArray updatedTypes, + ImmutableArray requiredCapabilities) + { + ModuleId = moduleId; + ProjectId = projectId; + ILDelta = ilDelta; + MetadataDelta = metadataDelta; + PdbDelta = pdbDelta; + UpdatedTypes = updatedTypes; + RequiredCapabilities = requiredCapabilities; + } + } + + public readonly struct RunningProjectInfo + { + public required bool RestartWhenChangesHaveNoEffect { get; init; } + } + + public enum Status + { + /// + /// No significant changes made that need to be applied. + /// + NoChangesToApply, + + /// + /// Changes can be applied either via updates or restart. + /// + ReadyToApply, + + /// + /// Some changes are errors that block rebuild of the module. + /// This means that the code is in a broken state that cannot be resolved by restarting the application. + /// + Blocked, + } + + public readonly struct Updates + { + /// + /// Status of the updates. + /// + public readonly Status Status { get; init; } + + /// + /// Returns all diagnostics that can't be addressed by rebuilding/restarting the project. + /// Syntactic, semantic and emit diagnostics. + /// + /// + /// is if these diagnostics contain any errors. + /// + public required ImmutableArray PersistentDiagnostics { get; init; } + + /// + /// Transient diagnostics (rude edits) per project. + /// All diagnostics that can be addressed by rebuilding/restarting the project. + /// + public required ImmutableArray<(ProjectId project, ImmutableArray diagnostics)> TransientDiagnostics { get; init; } + + /// + /// Updates to be applied to modules. Empty if there are blocking rude edits. + /// Only updates to projects that are not included in are listed. + /// + public required ImmutableArray ProjectUpdates { get; init; } + + /// + /// Running projects that need to be restarted due to rude edits in order to apply changes. + /// + public required ImmutableDictionary> ProjectsToRestart { get; init; } + + /// + /// Projects with changes that need to be rebuilt in order to apply changes. + /// + public required ImmutableArray ProjectsToRebuild { get; init; } + + /// + /// Projects whose dependencies need to be deployed to their output directory, if not already present. + /// + public required ImmutableArray ProjectsToRedeploy { get; init; } + } + + private static readonly ActiveStatementSpanProvider s_solutionActiveStatementSpanProvider = + (_, _, _) => ValueTask.FromResult(ImmutableArray.Empty); + + private readonly IEditAndContinueService _encService = services.GetRequiredService().Service; + + private DebuggingSessionId _sessionId; + + public HotReloadService(HostWorkspaceServices services, ImmutableArray capabilities) + : this(services.SolutionServices, () => ValueTask.FromResult(AddImplicitDotNetCapabilities(capabilities))) + { + } + + private DebuggingSessionId GetDebuggingSession() + { + var sessionId = _sessionId; + Contract.ThrowIfFalse(sessionId != default, "Session has not started"); + return sessionId; + } + + /// + /// Adds capabilities that are available by default on runtimes supported by dotnet-watch: .NET and Mono + /// and not on .NET Framework (they are not in . + /// + private static ImmutableArray AddImplicitDotNetCapabilities(ImmutableArray capabilities) + => capabilities.Add(nameof(EditAndContinueCapabilities.AddExplicitInterfaceImplementation)); + + /// + /// Starts the watcher. + /// + /// Solution that represents sources that match the built binaries on disk. + public async Task StartSessionAsync(Solution solution, CancellationToken cancellationToken) + { + var newSessionId = await _encService.StartDebuggingSessionAsync( + solution, + new DebuggerService(capabilitiesProvider), + NullPdbMatchingSourceTextProvider.Instance, + captureMatchingDocuments: [], + captureAllMatchingDocuments: true, + reportDiagnostics: false, + cancellationToken).ConfigureAwait(false); + Contract.ThrowIfFalse(_sessionId == default, "Session already started"); + _sessionId = newSessionId; + } + + /// + /// Invoke when capabilities have changed. + /// + public void CapabilitiesChanged() + { + _encService.BreakStateOrCapabilitiesChanged(GetDebuggingSession(), inBreakState: null); + } + + /// + /// Returns TFM of a given project. + /// + public static string? GetTargetFramework(Project project) + => project.State.NameAndFlavor.flavor; + + /// + /// Emits updates for all projects that differ between the given snapshot and the one given to the previous successful call or + /// the one passed to for the first invocation. + /// + /// Solution snapshot. + /// Identifies projects that launched a process. + /// + /// Updates (one for each changed project) and Rude Edit diagnostics. Does not include syntax or semantic diagnostics. + /// May include both updates and Rude Edits for different projects. + /// + public async Task GetUpdatesAsync(Solution solution, ImmutableDictionary runningProjects, CancellationToken cancellationToken) + { + var sessionId = GetDebuggingSession(); + + var runningProjectsImpl = runningProjects.ToImmutableDictionary( + static e => e.Key, + static e => new RunningProjectOptions() + { + RestartWhenChangesHaveNoEffect = e.Value.RestartWhenChangesHaveNoEffect + }); + + var results = await _encService.EmitSolutionUpdateAsync(sessionId, solution, runningProjectsImpl, s_solutionActiveStatementSpanProvider, cancellationToken).ConfigureAwait(false); + + return new Updates + { + Status = results.ModuleUpdates.Status switch + { + ModuleUpdateStatus.None => Status.NoChangesToApply, + ModuleUpdateStatus.Ready => Status.ReadyToApply, + ModuleUpdateStatus.Blocked => Status.Blocked, + _ => throw ExceptionUtilities.UnexpectedValue(results.ModuleUpdates.Status) + }, + PersistentDiagnostics = results.GetPersistentDiagnostics(), + TransientDiagnostics = results.GetTransientDiagnostics(), + ProjectUpdates = results.ModuleUpdates.Updates.SelectAsArray(static update => new Update( + update.Module, + update.ProjectId, + update.ILDelta, + update.MetadataDelta, + update.PdbDelta, + update.UpdatedTypes, + update.RequiredCapabilities)), + ProjectsToRestart = results.ProjectsToRestart, + ProjectsToRebuild = results.ProjectsToRebuild, + ProjectsToRedeploy = results.ProjectsToRedeploy, + }; + } + + public void CommitUpdate() + { + var sessionId = GetDebuggingSession(); + _encService.CommitSolutionUpdate(sessionId); + } + + public void DiscardUpdate() + { + var sessionId = GetDebuggingSession(); + _encService.DiscardSolutionUpdate(sessionId); + } + + public void EndSession() + { + _encService.EndDebuggingSession(GetDebuggingSession()); + _sessionId = default; + } + + // access to internal API: + public static Solution WithProjectInfo(Solution solution, ProjectInfo info) + => solution.WithProjectInfo(info); + + internal TestAccessor GetTestAccessor() + => new(this); + + internal readonly struct TestAccessor(HotReloadService instance) + { + public DebuggingSessionId SessionId + => instance._sessionId; + + public IEditAndContinueService EncService + => instance._encService; + } +} diff --git a/src/Features/ExternalAccess/HotReload/InternalAPI.Shipped.txt b/src/Features/ExternalAccess/HotReload/InternalAPI.Shipped.txt new file mode 100644 index 0000000000000..7dc5c58110bfa --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/InternalAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Features/ExternalAccess/HotReload/InternalAPI.Unshipped.txt b/src/Features/ExternalAccess/HotReload/InternalAPI.Unshipped.txt new file mode 100644 index 0000000000000..8ed94ecba7306 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/InternalAPI.Unshipped.txt @@ -0,0 +1,52 @@ +#nullable enable +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.CapabilitiesChanged() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.CommitUpdate() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.DiscardUpdate() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.EndSession() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.GetTestAccessor() -> Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.TestAccessor +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.GetUpdatesAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableDictionary! runningProjects, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.HotReloadService(Microsoft.CodeAnalysis.Host.HostWorkspaceServices! services, System.Collections.Immutable.ImmutableArray capabilities) -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.HotReloadService(Microsoft.CodeAnalysis.Host.SolutionServices! services, System.Func>>! capabilitiesProvider) -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.RunningProjectInfo +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.RunningProjectInfo.RestartWhenChangesHaveNoEffect.get -> bool +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.RunningProjectInfo.RestartWhenChangesHaveNoEffect.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.RunningProjectInfo.RunningProjectInfo() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.StartSessionAsync(Microsoft.CodeAnalysis.Solution! solution, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status.Blocked = 2 -> Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status.NoChangesToApply = 0 -> Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status.ReadyToApply = 1 -> Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.TestAccessor +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.TestAccessor.EncService.get -> Microsoft.CodeAnalysis.EditAndContinue.IEditAndContinueService! +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.TestAccessor.SessionId.get -> Microsoft.CodeAnalysis.EditAndContinue.DebuggingSessionId +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.TestAccessor.TestAccessor() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.TestAccessor.TestAccessor(Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService! instance) -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.Update() -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.Update(System.Guid moduleId, Microsoft.CodeAnalysis.ProjectId! projectId, System.Collections.Immutable.ImmutableArray ilDelta, System.Collections.Immutable.ImmutableArray metadataDelta, System.Collections.Immutable.ImmutableArray pdbDelta, System.Collections.Immutable.ImmutableArray updatedTypes, System.Collections.Immutable.ImmutableArray requiredCapabilities) -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.PersistentDiagnostics.get -> System.Collections.Immutable.ImmutableArray +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.PersistentDiagnostics.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectsToRebuild.get -> System.Collections.Immutable.ImmutableArray +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectsToRebuild.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectsToRedeploy.get -> System.Collections.Immutable.ImmutableArray +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectsToRedeploy.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectsToRestart.get -> System.Collections.Immutable.ImmutableDictionary>! +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectsToRestart.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectUpdates.get -> System.Collections.Immutable.ImmutableArray +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.ProjectUpdates.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.Status.get -> Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Status +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.Status.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.TransientDiagnostics.get -> System.Collections.Immutable.ImmutableArray<(Microsoft.CodeAnalysis.ProjectId! project, System.Collections.Immutable.ImmutableArray diagnostics)> +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.TransientDiagnostics.init -> void +Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Updates.Updates() -> void +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.ILDelta -> System.Collections.Immutable.ImmutableArray +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.MetadataDelta -> System.Collections.Immutable.ImmutableArray +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.ModuleId -> System.Guid +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.PdbDelta -> System.Collections.Immutable.ImmutableArray +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.ProjectId -> Microsoft.CodeAnalysis.ProjectId! +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.RequiredCapabilities -> System.Collections.Immutable.ImmutableArray +readonly Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.Update.UpdatedTypes -> System.Collections.Immutable.ImmutableArray +static Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.GetTargetFramework(Microsoft.CodeAnalysis.Project! project) -> string? +static Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api.HotReloadService.WithProjectInfo(Microsoft.CodeAnalysis.Solution! solution, Microsoft.CodeAnalysis.ProjectInfo! info) -> Microsoft.CodeAnalysis.Solution! diff --git a/src/Features/ExternalAccess/HotReload/Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj b/src/Features/ExternalAccess/HotReload/Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj new file mode 100644 index 0000000000000..430a2a2f4ae21 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj @@ -0,0 +1,42 @@ + + + + + Microsoft.CodeAnalysis.ExternalAccess.HotReload + $(NetRoslyn) + + + true + Microsoft.CodeAnalysis.ExternalAccess.HotReload + + A supporting package for dotnet-watch and HotReloadUtils: + https://github.com/dotnet/sdk + https://github.com/dotnet/hotreload-utils + + + false + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Features/ExternalAccess/HotReload/PublicAPI.Shipped.txt b/src/Features/ExternalAccess/HotReload/PublicAPI.Shipped.txt new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/src/Features/ExternalAccess/HotReload/PublicAPI.Unshipped.txt b/src/Features/ExternalAccess/HotReload/PublicAPI.Unshipped.txt new file mode 100644 index 0000000000000..8b137891791fe --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ + diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.cs.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.cs.xlf new file mode 100644 index 0000000000000..a36dd41ea43da --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.cs.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.de.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.de.xlf new file mode 100644 index 0000000000000..60aae0e94304a --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.de.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.es.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.es.xlf new file mode 100644 index 0000000000000..b6986a36b8294 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.es.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.fr.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.fr.xlf new file mode 100644 index 0000000000000..a2dd7dc8c6d70 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.fr.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.it.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.it.xlf new file mode 100644 index 0000000000000..70c721d2c08ae --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.it.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ja.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ja.xlf new file mode 100644 index 0000000000000..e239cc4d9819f --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ja.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ko.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ko.xlf new file mode 100644 index 0000000000000..c8c1da7c28cce --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ko.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pl.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pl.xlf new file mode 100644 index 0000000000000..8a27ae6dd7a7a --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pl.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pt-BR.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pt-BR.xlf new file mode 100644 index 0000000000000..9845fc1e050a0 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.pt-BR.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ru.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ru.xlf new file mode 100644 index 0000000000000..cf901467574fa --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.ru.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.tr.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.tr.xlf new file mode 100644 index 0000000000000..f494ba9c379d6 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.tr.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hans.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hans.xlf new file mode 100644 index 0000000000000..f52802bfdfde6 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hans.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hant.xlf b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hant.xlf new file mode 100644 index 0000000000000..a0156a0a05d56 --- /dev/null +++ b/src/Features/ExternalAccess/HotReload/xlf/ExternalAccessAspNetCoreResources.zh-Hant.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Features/Test/EditAndContinue/WatchHotReloadServiceTests.cs b/src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs similarity index 82% rename from src/Features/Test/EditAndContinue/WatchHotReloadServiceTests.cs rename to src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs index 8b1c1e1c1c1ab..572e3bab19e9e 100644 --- a/src/Features/Test/EditAndContinue/WatchHotReloadServiceTests.cs +++ b/src/Features/ExternalAccess/HotReloadTest/HotReloadServiceTests.cs @@ -13,7 +13,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.ExternalAccess.Watch.Api; +using Microsoft.CodeAnalysis.ExternalAccess.HotReload.Api; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Test.Utilities; using Microsoft.CodeAnalysis.Text; @@ -25,9 +25,9 @@ namespace Microsoft.CodeAnalysis.EditAndContinue.UnitTests; [UseExportProvider] -public sealed class WatchHotReloadServiceTests : EditAndContinueWorkspaceTestBase +public sealed class HotReloadServiceTests : EditAndContinueWorkspaceTestBase { - private static Task GetCommittedDocumentTextAsync(WatchHotReloadService service, DocumentId documentId) + private static Task GetCommittedDocumentTextAsync(HotReloadService service, DocumentId documentId) => ((EditAndContinueService)service.GetTestAccessor().EncService) .GetTestAccessor() .GetActiveDebuggingSessions() @@ -62,7 +62,7 @@ public async Task Test() loader: new WorkspaceFileTextLoader(solution.Services, sourceFileA.Path, Encoding.UTF8), filePath: sourceFileA.Path)); - var hotReload = new WatchHotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); + var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); await hotReload.StartSessionAsync(solution, CancellationToken.None); @@ -77,9 +77,9 @@ public async Task Test() // Valid update: solution = solution.WithDocumentText(documentIdA, CreateText(source2)); - var result = await hotReload.GetUpdatesAsync(solution, runningProjects: ImmutableDictionary.Empty, CancellationToken.None); - Assert.Empty(result.CompilationDiagnostics); - Assert.Empty(result.RudeEdits); + var result = await hotReload.GetUpdatesAsync(solution, runningProjects: ImmutableDictionary.Empty, CancellationToken.None); + Assert.Empty(result.PersistentDiagnostics); + Assert.Empty(result.TransientDiagnostics); Assert.Equal(1, result.ProjectUpdates.Length); AssertEx.Equal([0x02000002], result.ProjectUpdates[0].UpdatedTypes); @@ -91,11 +91,11 @@ public async Task Test() // Insignificant change: solution = solution.WithDocumentText(documentIdA, CreateText(source3)); - result = await hotReload.GetUpdatesAsync(solution, runningProjects: ImmutableDictionary.Empty, CancellationToken.None); - Assert.Empty(result.CompilationDiagnostics); - Assert.Empty(result.RudeEdits); + result = await hotReload.GetUpdatesAsync(solution, runningProjects: ImmutableDictionary.Empty, CancellationToken.None); + Assert.Empty(result.PersistentDiagnostics); + Assert.Empty(result.TransientDiagnostics); Assert.Empty(result.ProjectUpdates); - Assert.Equal(WatchHotReloadService.Status.NoChangesToApply, result.Status); + Assert.Equal(HotReloadService.Status.NoChangesToApply, result.Status); updatedText = await GetCommittedDocumentTextAsync(hotReload, documentIdA); Assert.Equal(source3, updatedText.ToString()); @@ -103,14 +103,14 @@ public async Task Test() // Rude edit: solution = solution.WithDocumentText(documentIdA, CreateText("class C { void M() { System.Console.WriteLine(2); } }")); - var runningProjects = ImmutableDictionary.Empty - .Add(projectId, new WatchHotReloadService.RunningProjectInfo() { RestartWhenChangesHaveNoEffect = true }); + var runningProjects = ImmutableDictionary.Empty + .Add(projectId, new HotReloadService.RunningProjectInfo() { RestartWhenChangesHaveNoEffect = true }); result = await hotReload.GetUpdatesAsync(solution, runningProjects, CancellationToken.None); - Assert.Empty(result.CompilationDiagnostics); + Assert.Empty(result.PersistentDiagnostics); AssertEx.Equal( [$"P: {sourceFileA.Path}: (0,17)-(0,18): Error ENC0110: {string.Format(FeaturesResources.Changing_the_signature_of_0_requires_restarting_the_application_because_it_is_not_supported_by_the_runtime, FeaturesResources.method)}"], - InspectDiagnostics(result.RudeEdits)); + InspectDiagnostics(result.TransientDiagnostics)); Assert.Empty(result.ProjectUpdates); AssertEx.SetEqual(["P"], result.ProjectsToRestart.Select(p => solution.GetRequiredProject(p.Key).Name)); AssertEx.SetEqual(["P"], result.ProjectsToRebuild.Select(p => solution.GetRequiredProject(p).Name)); @@ -128,7 +128,7 @@ public async Task Test() result = await hotReload.GetUpdatesAsync(solution, runningProjects, CancellationToken.None); AssertEx.Equal( [$"{sourceFileA.Path}: (0,72)-(0,73): Error CS1002: {CSharpResources.ERR_SemicolonExpected}"], - InspectDiagnostics(result.CompilationDiagnostics)); + InspectDiagnostics(result.PersistentDiagnostics)); Assert.Empty(result.ProjectUpdates); Assert.Empty(result.ProjectsToRestart); Assert.Empty(result.ProjectsToRebuild); @@ -144,14 +144,14 @@ public async Task Test() [ $"{sourceFileA.Path}: (0,21)-(0,28): Error CS0103: {string.Format(CSharpResources.ERR_NameNotInContext, "Unknown")}", $"{sourceFileA.Path}: (0,51)-(0,52): Warning CS0219: {string.Format(CSharpResources.WRN_UnreferencedVarAssg, "x")}", - ], InspectDiagnostics(result.CompilationDiagnostics)); + ], InspectDiagnostics(result.PersistentDiagnostics)); // TODO: https://github.com/dotnet/roslyn/issues/79017 //AssertEx.Equal( //[ // $"P: {sourceFileA.Path}: (0,34)-(0,44): Warning ENC0118: {string.Format(FeaturesResources.Changing_0_might_not_have_any_effect_until_the_application_is_restarted, FeaturesResources.static_constructor)}", - //], InspectDiagnostics(result.RudeEdits)); - AssertEx.Empty(result.RudeEdits); + //], InspectDiagnostics(result.TransientDiagnostics)); + AssertEx.Empty(result.TransientDiagnostics); Assert.Empty(result.ProjectUpdates); Assert.Empty(result.ProjectsToRestart); @@ -201,17 +201,17 @@ public async Task SourceGeneratorFailure() var generatorDiagnostics = await solution.CompilationState.GetSourceGeneratorDiagnosticsAsync(project.State, CancellationToken.None); Assert.Empty(generatorDiagnostics); - var hotReload = new WatchHotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); + var hotReload = new HotReloadService(workspace.Services, ["Baseline", "AddDefinitionToExistingType", "NewTypeDefinition"]); await hotReload.StartSessionAsync(solution, CancellationToken.None); solution = solution.WithAdditionalDocumentText(aId, CreateText("updated text")); - var runningProjects = ImmutableDictionary.Empty - .Add(projectId, new WatchHotReloadService.RunningProjectInfo() { RestartWhenChangesHaveNoEffect = false }); + var runningProjects = ImmutableDictionary.Empty + .Add(projectId, new HotReloadService.RunningProjectInfo() { RestartWhenChangesHaveNoEffect = false }); var result = await hotReload.GetUpdatesAsync(solution, runningProjects, CancellationToken.None); - var diagnostic = result.CompilationDiagnostics.Single(); + var diagnostic = result.PersistentDiagnostics.Single(); Assert.Equal("CS8785", diagnostic.Id); Assert.Contains("Source generator failed", diagnostic.GetMessage()); hotReload.EndSession(); diff --git a/src/Features/ExternalAccess/HotReloadTest/Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj b/src/Features/ExternalAccess/HotReloadTest/Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj new file mode 100644 index 0000000000000..7fdea1cd4c11a --- /dev/null +++ b/src/Features/ExternalAccess/HotReloadTest/Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj @@ -0,0 +1,19 @@ + + + + + Library + Microsoft.CodeAnalysis.UnitTests + $(NetRoslyn) + true + + + + + + + + + + + \ No newline at end of file diff --git a/src/Features/TestUtilities/Microsoft.CodeAnalysis.Features.Test.Utilities.csproj b/src/Features/TestUtilities/Microsoft.CodeAnalysis.Features.Test.Utilities.csproj index 766f43532bf19..87019edd23f59 100644 --- a/src/Features/TestUtilities/Microsoft.CodeAnalysis.Features.Test.Utilities.csproj +++ b/src/Features/TestUtilities/Microsoft.CodeAnalysis.Features.Test.Utilities.csproj @@ -43,6 +43,7 @@ + diff --git a/src/Workspaces/Core/Portable/Microsoft.CodeAnalysis.Workspaces.csproj b/src/Workspaces/Core/Portable/Microsoft.CodeAnalysis.Workspaces.csproj index 6ef5edb3aa3de..e3a83ddc1970c 100644 --- a/src/Workspaces/Core/Portable/Microsoft.CodeAnalysis.Workspaces.csproj +++ b/src/Workspaces/Core/Portable/Microsoft.CodeAnalysis.Workspaces.csproj @@ -61,6 +61,8 @@ + + From 1235ac5296c8b1fd2499fdb3f9362466f021f4d8 Mon Sep 17 00:00:00 2001 From: Tomas Matousek Date: Fri, 3 Oct 2025 13:03:17 -0700 Subject: [PATCH 2/3] Feedback --- eng/config/PublishData.json | 1 + .../Core/Portable/Microsoft.CodeAnalysis.Features.csproj | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/eng/config/PublishData.json b/eng/config/PublishData.json index d0e1ff8ed9455..9d9973bf54329 100644 --- a/eng/config/PublishData.json +++ b/eng/config/PublishData.json @@ -61,6 +61,7 @@ "Microsoft.CodeAnalysis.ExternalAccess.EditorConfigGenerator": "vs-impl", "Microsoft.CodeAnalysis.ExternalAccess.Extensions": "vs-impl", "Microsoft.CodeAnalysis.ExternalAccess.FSharp": "vs-impl", + "Microsoft.CodeAnalysis.ExternalAccess.HotReload": "arcade", "Microsoft.CodeAnalysis.ExternalAccess.OmniSharp": "arcade", "Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.CSharp": "arcade", "Microsoft.CodeAnalysis.ExternalAccess.AspNetCore": "vs-impl", diff --git a/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj b/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj index 1417818e08cf5..eadc937833d6c 100644 --- a/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj +++ b/src/Features/Core/Portable/Microsoft.CodeAnalysis.Features.csproj @@ -145,9 +145,6 @@ - - - From cd66511eb7fb918a59603c78d9de34ee843685fd Mon Sep 17 00:00:00 2001 From: Tomas Matousek Date: Tue, 7 Oct 2025 08:49:46 -0700 Subject: [PATCH 3/3] Fix --- Roslyn.sln | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Roslyn.sln b/Roslyn.sln index 1b7f5590d91a8..a3ca9c3aea827 100644 --- a/Roslyn.sln +++ b/Roslyn.sln @@ -729,9 +729,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.Buil EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.SemanticSearch.Extensions", "src\Tools\SemanticSearch\Extensions\Microsoft.CodeAnalysis.SemanticSearch.Extensions.csproj", "{66C8265C-2C79-F259-9807-3E97CA586F1E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CodeAnalysis.ExternalAccess.HotReload", "src\Features\ExternalAccess\HotReload\Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj", "{FDDC4384-F466-DB42-61A7-E21DF5EB84BB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.ExternalAccess.HotReload", "src\Features\ExternalAccess\HotReload\Microsoft.CodeAnalysis.ExternalAccess.HotReload.csproj", "{FDDC4384-F466-DB42-61A7-E21DF5EB84BB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests", "src\Features\ExternalAccess\HotReloadTest\Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj", "{D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests", "src\Features\ExternalAccess\HotReloadTest\Microsoft.CodeAnalysis.ExternalAccess.HotReload.UnitTests.csproj", "{D03262C0-4AE6-1ED5-7B38-4150DACFF9D8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution