in src/StructuredLogger/Analyzers/BuildAnalyzer.cs [188:262]
private void PostAnalyzeBuild(Build build)
{
string Intern(string text)
{
#if DEBUG
text = build.StringTable.Intern(text);
#endif
return text;
}
if (!build.Succeeded)
{
build.AddChild(new Error { Text = Intern("Build failed.") });
}
else
{
build.AddChild(new Item { Text = Intern("Build succeeded.") });
}
build.AddChild(new Property { Name = Intern(Strings.Duration), Value = Intern(build.DurationText) });
doubleWritesAnalyzer.AppendDoubleWritesFolder(build);
resolveAssemblyReferenceAnalyzer.AppendFinalReport(build);
cppAnalyzer.AppendCppAnalyzer(build);
if (build.LogFilePath != null)
{
build.AddChildAtBeginning(new Item { Text = Intern(build.LogFilePath) });
}
var durations = taskDurations
.OrderByDescending(kvp => kvp.Value.Duration)
.Where(kvp => // no need to include MSBuild and CallTarget tasks as they are not "terminal leaf" tasks
!string.Equals(kvp.Key, "MSBuild", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(kvp.Key, "CallTarget", StringComparison.OrdinalIgnoreCase))
.Take(10)
.ToArray();
if (durations.Length > 0)
{
string folderName = $"Top {durations.Count()} most expensive tasks";
folderName = Intern(folderName);
var top10Tasks = build.GetOrCreateNodeWithName<Folder>(folderName);
foreach (var kvp in durations)
{
var taskItem = new Item
{
Name = Intern(kvp.Key),
Text = Intern($"{TextUtilities.DisplayDuration(kvp.Value.Duration)}, {kvp.Value.Count} calls.")
};
var childNodes = kvp.Value.ChildNodes.OrderByDescending(kv => kv.Value.Duration).Take(10);
foreach (var durationNodes in childNodes)
{
taskItem.AddChild(new Item
{
Name = Intern(durationNodes.Key),
Text = Intern($"{TextUtilities.DisplayDuration(durationNodes.Value.Duration)}, {durationNodes.Value.Count} calls.")
});
}
top10Tasks.AddChild(taskItem);
}
}
if (analyzerReports.Count > 0)
{
var analyzerReportSummary = build.GetOrCreateNodeWithName<Folder>(Intern($"Analyzer Summary"));
CscTaskAnalyzer.CreateMergedReport(analyzerReportSummary, analyzerReports.ToArray());
}
if (generatorReports.Count > 0)
{
var generatorReportSummary = build.GetOrCreateNodeWithName<Folder>(Intern($"Generator Summary"));
CscTaskAnalyzer.CreateMergedReport(generatorReportSummary, generatorReports.ToArray());
}
}