namespace TeamCity.MSBuild.Logger.EventHandlers { using System; using System.Collections.Generic; using JetBrains.Annotations; using Microsoft.Build.Framework; // ReSharper disable once ClassNeverInstantiated.Global internal class MessageHandler : IBuildEventHandler { [NotNull] private readonly IBuildEventManager _buildEventManager; [NotNull] private readonly IDeferredMessageWriter _deferredMessageWriter; [NotNull] private readonly IMessageWriter _messageWriter; [NotNull] private readonly ILoggerContext _context; public MessageHandler( [NotNull] ILoggerContext context, [NotNull] IMessageWriter messageWriter, [NotNull] IDeferredMessageWriter deferredMessageWriter, [NotNull] IBuildEventManager buildEventManager) { _buildEventManager = buildEventManager ?? throw new ArgumentNullException(nameof(buildEventManager)); _deferredMessageWriter = deferredMessageWriter ?? throw new ArgumentNullException(nameof(deferredMessageWriter)); _messageWriter = messageWriter ?? throw new ArgumentNullException(nameof(messageWriter)); _context = context ?? throw new ArgumentNullException(nameof(context)); } public void Handle(BuildMessageEventArgs e) { if (e == null) throw new ArgumentNullException(nameof(e)); if (_context.Parameters.ShowOnlyErrors || _context.Parameters.ShowOnlyWarnings) { return; } if (e == null) throw new ArgumentNullException(nameof(e)); if (e.BuildEventContext == null) throw new ArgumentException(nameof(e)); bool showMessages; var lightenText = false; if (e is TaskCommandLineEventArgs) { if (_context.Parameters.ShowCommandLine != true && !_context.IsVerbosityAtLeast(LoggerVerbosity.Normal)) { return; } showMessages = true; } else { switch (e.Importance) { case MessageImportance.High: showMessages = _context.IsVerbosityAtLeast(LoggerVerbosity.Minimal); break; case MessageImportance.Normal: showMessages = _context.IsVerbosityAtLeast(LoggerVerbosity.Normal); lightenText = true; break; case MessageImportance.Low: showMessages = _context.IsVerbosityAtLeast(LoggerVerbosity.Detailed); lightenText = true; break; default: throw new InvalidOperationException("Impossible"); } } if (!showMessages) { return; } if (_context.HasBuildStarted && e.BuildEventContext.ProjectContextId != -2 && _buildEventManager.GetProjectStartedEvent(e.BuildEventContext) == null && _context.IsVerbosityAtLeast(LoggerVerbosity.Normal)) { if (!_context.DeferredMessages.TryGetValue(e.BuildEventContext, out var messageEventArgsList)) { messageEventArgsList = new List(); _context.DeferredMessages.Add(e.BuildEventContext, messageEventArgsList); } messageEventArgsList.Add(e); } else { _deferredMessageWriter.DisplayDeferredStartedEvents(e.BuildEventContext); _messageWriter.PrintMessage(e, lightenText); _deferredMessageWriter.ShownBuildEventContext(e.BuildEventContext); } } } }