diff --git a/src/StructuredLogger/Analyzers/BuildAnalyzer.cs b/src/StructuredLogger/Analyzers/BuildAnalyzer.cs index 79c3f6d0..1da1a406 100644 --- a/src/StructuredLogger/Analyzers/BuildAnalyzer.cs +++ b/src/StructuredLogger/Analyzers/BuildAnalyzer.cs @@ -14,6 +14,7 @@ public class BuildAnalyzer private Dictionary ParentDurations)> taskDurations = new Dictionary ParentDurations)>(); private readonly List analyzerReports = new List(); + private readonly List generatorReports = new List(); public BuildAnalyzer(Build build) { @@ -230,6 +231,12 @@ string Intern(string text) var analyzerReportSummary = build.GetOrCreateNodeWithName(Intern($"Analyzer Summary")); CscTaskAnalyzer.CreateMergedReport(analyzerReportSummary, analyzerReports.ToArray()); } + + if (generatorReports.Count > 0) + { + var generatorReportSummary = build.GetOrCreateNodeWithName(Intern($"Generator Summary")); + CscTaskAnalyzer.CreateMergedReport(generatorReportSummary, generatorReports.ToArray()); + } } private void PostAnalyzeProject(Project project) @@ -317,11 +324,16 @@ private void AnalyzeTask(Task task) } else if (task.Name == "Csc") { - var analyzerReport = CscTaskAnalyzer.Analyze(task); + var (analyzerReport, generatorReport) = CscTaskAnalyzer.Analyze(task); if (analyzerReport is not null) { analyzerReports.Add(analyzerReport); } + + if (generatorReport is not null) + { + generatorReports.Add(generatorReport); + } } doubleWritesAnalyzer.AnalyzeTask(task); diff --git a/src/StructuredLogger/Analyzers/CscTaskAnalyzer.cs b/src/StructuredLogger/Analyzers/CscTaskAnalyzer.cs index c54bc3f4..c3c9416d 100644 --- a/src/StructuredLogger/Analyzers/CscTaskAnalyzer.cs +++ b/src/StructuredLogger/Analyzers/CscTaskAnalyzer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -7,9 +7,11 @@ namespace Microsoft.Build.Logging.StructuredLogger { public class CscTaskAnalyzer { - public static Folder Analyze(Task task) + public static (Folder Analyzers, Folder Generators) Analyze(Task task) { Folder analyzerReport = null; + Folder generatorReport = null; + Folder currentReport = null; Folder parent = null; foreach (var message in task.Children.OfType().ToArray()) @@ -21,12 +23,21 @@ public static Folder Analyze(Task task) analyzerReport.Name = Strings.AnalyzerReport; task.AddChild(analyzerReport); parent = analyzerReport; + currentReport = analyzerReport; } - else if (text.Contains(", Version=") && analyzerReport != null) + else if (text.StartsWith(Strings.TotalGeneratorExecutionTime, StringComparison.Ordinal)) + { + generatorReport = new Folder(); + generatorReport.Name = Strings.GeneratorReport; + task.AddChild(generatorReport); + parent = generatorReport; + currentReport = generatorReport; + } + else if (text.Contains(", Version=") && currentReport != null) { var lastAssembly = new Folder(); lastAssembly.Name = text; - analyzerReport.AddChild(lastAssembly); + currentReport.AddChild(lastAssembly); parent = lastAssembly; // Remove the message since we are already using the same text for the containing folder @@ -47,7 +58,7 @@ public static Folder Analyze(Task task) } } - return analyzerReport; + return (analyzerReport, generatorReport); } public static void CreateMergedReport(Folder destination, Folder[] analyzerReports) diff --git a/src/StructuredLogger/Strings/Strings.cs b/src/StructuredLogger/Strings/Strings.cs index d076f57d..0549fe5e 100644 --- a/src/StructuredLogger/Strings/Strings.cs +++ b/src/StructuredLogger/Strings/Strings.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Globalization; using System.Text.RegularExpressions; using Microsoft.Build.Framework; @@ -442,6 +442,7 @@ public static Match IsFoundConflicts(string text) public static string ToFile => "\" to file \""; public static string TotalAnalyzerExecutionTime => "Total analyzer execution time:"; + public static string TotalGeneratorExecutionTime => "Total generator execution time:"; /// /// https://github.com/NuGet/Home/issues/10383 @@ -466,6 +467,7 @@ public static Match IsFoundConflicts(string text) public static string Assemblies => "Assemblies"; public static string TargetOutputs => "TargetOutputs"; public static string AnalyzerReport => "Analyzer Report"; + public static string GeneratorReport => "Generator Report"; public static string Properties => "Properties"; public static string PropertyReassignmentFolder => "Property reassignment"; public static string Global => "Global";