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();
}
}