namespace TeamCity.MSBuild.Logger { using System; using System.Collections.Generic; using JetBrains.Annotations; using Microsoft.Build.Framework; // ReSharper disable once ClassNeverInstantiated.Global internal class LoggerContext: ILoggerContext { [NotNull] private readonly IBuildEventManager _buildEventManager; public LoggerContext( [NotNull] IBuildEventManager buildEventManager) { _buildEventManager = buildEventManager ?? throw new ArgumentNullException(nameof(buildEventManager)); ResetConsoleLoggerState(); } public LoggerVerbosity Verbosity => Parameters.Verbosity; public Parameters Parameters { get; private set; } public int CurrentIndentLevel => 0; public int NumberOfProcessors { get; private set; } public bool SkipProjectStartedText { get; private set; } [CanBeNull] public IList ErrorList { get; private set; } [CanBeNull] public IList WarningList { get; private set; } public IDictionary> DeferredMessages { get; } = new Dictionary>(ComparerContextNodeId.Shared); public IDictionary ProjectPerformanceCounters { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public IDictionary TargetPerformanceCounters { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public IDictionary TaskPerformanceCounters { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public bool HasBuildStarted { get; set; } public DateTime BuildStarted { get; set; } public int ErrorCount { get; set; } public int WarningCount { get; set; } public BuildEventContext LastDisplayedBuildEventContext { get; set; } public int PrefixWidth { get; set; } public ProjectFullKey LastProjectFullKey { get; set; } public void Initialize( int numberOfProcessors, bool skipProjectStartedText, Parameters parameters) { NumberOfProcessors = numberOfProcessors; SkipProjectStartedText = skipProjectStartedText; Parameters = parameters; if (parameters.ShowSummary ?? false) { ErrorList = new List(); WarningList = new List(); } else { ErrorList = null; WarningList = null; } } public bool IsVerbosityAtLeast(LoggerVerbosity checkVerbosity) { return Verbosity >= checkVerbosity; } public void ResetConsoleLoggerState() { ErrorCount = 0; WarningCount = 0; _buildEventManager.Reset(); PrefixWidth = 0; LastDisplayedBuildEventContext = null; LastProjectFullKey = new ProjectFullKey(-1, -1); HasBuildStarted = false; BuildStarted = default; PrefixWidth = 0; ProjectPerformanceCounters.Clear(); TargetPerformanceCounters.Clear(); TaskPerformanceCounters.Clear(); } public ProjectFullKey GetFullProjectKey(BuildEventContext e) { ProjectStartedEventMinimumFields eventMinimumFields = null; if (e != null) { eventMinimumFields = _buildEventManager.GetProjectStartedEvent(e); } // ReSharper disable once ConvertIfStatementToReturnStatement if (eventMinimumFields == null) { return new ProjectFullKey(0, 0); } return new ProjectFullKey(eventMinimumFields.ProjectKey, eventMinimumFields.EntryPointKey); } } }