private void ShowErrorWarningSummary()

in TeamCity.MSBuild.Logger/EventHandlers/BuildFinishedHandler.cs [206:274]


        private void ShowErrorWarningSummary<T>([CanBeNull] IEnumerable<T> events) where T : BuildEventArgs
        {
            if (events == null)
            {
                return;
            }

            var dictionary = new Dictionary<ErrorWarningSummaryDictionaryKey, List<T>>();
            foreach (var warningEventArgs in events)
            {
                string targetName = null;
                var targetStartedEvent = _buildEventManager.GetTargetStartedEvent(warningEventArgs.BuildEventContext);
                if (targetStartedEvent != null)
                {
                    targetName = targetStartedEvent.TargetName;
                }

                var key = new ErrorWarningSummaryDictionaryKey(warningEventArgs.BuildEventContext, targetName);
                if (!dictionary.TryGetValue(key, out var list))
                {
                    list = new List<T>();
                    dictionary.Add(key, list);
                }

                list.Add(warningEventArgs);
            }

            BuildEventContext buildEventContext = null;
            string curTargetName = null;
            foreach (var keyValuePair in dictionary)
            {
                if (buildEventContext != keyValuePair.Key.EntryPointContext)
                {
                    _messageWriter.WriteNewLine();
                    foreach (var message in _buildEventManager.ProjectCallStackFromProject(keyValuePair.Key.EntryPointContext))
                    {
                        _messageWriter.WriteMessageAligned(message, false);
                    }

                    buildEventContext = keyValuePair.Key.EntryPointContext;
                }

                if (string.Compare(curTargetName, keyValuePair.Key.TargetName, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    if (!string.IsNullOrEmpty(keyValuePair.Key.TargetName))
                    {
                        _messageWriter.WriteMessageAligned(_stringService.FormatResourceString("ErrorWarningInTarget", keyValuePair.Key.TargetName), false);
                    }

                    curTargetName = keyValuePair.Key.TargetName;
                }

                foreach (var obj in keyValuePair.Value)
                {
                    switch (obj)
                    {
                        case BuildErrorEventArgs errorEventArgs:
                            _messageWriter.WriteMessageAligned("  " + _eventFormatter.FormatEventMessage(errorEventArgs, false, _context.Parameters.ShowProjectFile), false);
                            continue;

                        case BuildWarningEventArgs warningEventArgs:
                            _messageWriter.WriteMessageAligned("  " + _eventFormatter.FormatEventMessage(warningEventArgs, false, _context.Parameters.ShowProjectFile), false);
                            break;
                    }
                }

                _messageWriter.WriteNewLine();
            }
        }