private void PostAnalyzeBuild()

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