/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Workspaces/Remote/ServiceHub/Services/EditAndContinue/EditAndContinueLogReporter.cs
75 строк
3 KB
Tomáš Matoušek
Fixes Hot reload logging in DevKit (#84179)
20 июн 2026, 02:32
Не верифицирован
20 июн 2026, 02:32
db649bc
Код
Авторство
О чём код?
// 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.Composition; using System.Threading; using Microsoft.CodeAnalysis.BrokeredServices; using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.CodeAnalysis.Threading; using Microsoft.ServiceHub.Framework; using Microsoft.VisualStudio.Debugger.Contracts.HotReload; namespace Microsoft.CodeAnalysis.EditAndContinue; internal sealed class EditAndContinueLogReporter : IEditAndContinueLogReporter { [ExportWorkspaceServiceFactory(typeof(IEditAndContinueLogReporter), ServiceLayer.Host), Shared] [method: ImportingConstructor] [method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] internal sealed class Factory( IAsynchronousOperationListenerProvider listenerProvider) : IWorkspaceServiceFactory { public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices) { var serviceBrokerProvider = workspaceServices.GetRequiredService<IServiceBrokerProvider>(); return new EditAndContinueLogReporter(serviceBrokerProvider.ServiceBroker, listenerProvider); } } private const string ComponentSymbol = "🔣"; private readonly AsyncBatchingWorkQueue<HotReloadLogMessage> _queue; public EditAndContinueLogReporter( IServiceBroker serviceBroker, IAsynchronousOperationListenerProvider listenerProvider) { var logger = new HotReloadLoggerProxy(serviceBroker); _queue = new AsyncBatchingWorkQueue<HotReloadLogMessage>( delay: TimeSpan.Zero, async (messages, cancellationToken) => { try { foreach (var message in messages) { await logger.LogAsync(message, cancellationToken).ConfigureAwait(false); } } catch { // Ignore. When running OOP the connection to the debugger log service might have been terminated. } }, listenerProvider.GetListener(FeatureAttribute.EditAndContinue), CancellationToken.None); } public void Report(string message, LogMessageSeverity severity) { var (verbosity, errorLevel) = severity switch { LogMessageSeverity.Info => (HotReloadVerbosity.Diagnostic, HotReloadDiagnosticErrorLevel.Info), LogMessageSeverity.Warning => (HotReloadVerbosity.Minimal, HotReloadDiagnosticErrorLevel.Warning), LogMessageSeverity.Error => (HotReloadVerbosity.Minimal, HotReloadDiagnosticErrorLevel.Error), _ => throw ExceptionUtilities.UnexpectedValue(severity), }; _queue.AddWork(new HotReloadLogMessage(verbosity, message, errorLevel: errorLevel, category: ComponentSymbol)); } }