public void StatusEventRaised(object sender, BuildStatusEventArgs e) { try { lock (syncLock) { // This happens when we consume args created by us (deserialized) if (e is ProjectEvaluationStartedEventArgs projectEvaluationStarted) { var projectName = projectEvaluationStarted.ProjectFile; var project = EvaluationFolder.GetOrCreateNodeWithName <Project>(projectName); project.Id = e.BuildEventContext.ProjectContextId; } else if (e is ProjectEvaluationFinishedEventArgs projectEvaluationFinished) { } // this happens during live build using MSBuild 15.3 or newer else if (e.GetType().Name == "ProjectEvaluationStartedEventArgs") { var projectName = Utilities.ParseQuotedSubstring(e.Message); var project = EvaluationFolder.GetOrCreateNodeWithName <Project>(projectName); project.Id = Reflector.GetEvaluationId(e.BuildEventContext); } } } catch (Exception ex) { HandleException(ex); } }
private void Write(BuildEventContext buildEventContext) { Write(buildEventContext.NodeId); Write(buildEventContext.ProjectContextId); Write(buildEventContext.TargetId); Write(buildEventContext.TaskId); Write(buildEventContext.SubmissionId); Write(buildEventContext.ProjectInstanceId); Write(Reflector.GetEvaluationId(buildEventContext)); }
public void StatusEventRaised(object sender, BuildStatusEventArgs e) { try { lock (syncLock) { // This happens when we consume args created by us (deserialized) if (e is ProjectEvaluationStartedEventArgs projectEvaluationStarted) { EvaluationFolder = Build.GetOrCreateNodeWithName <Folder>(Intern("Evaluation")); var evaluationId = -e.BuildEventContext.ProjectContextId; var projectName = Intern(projectEvaluationStarted.ProjectFile); var nodeName = Intern(GetEvaluationProjectName(evaluationId, projectName)); var project = EvaluationFolder.GetOrCreateNodeWithName <Project>(nodeName); if (project.ProjectFile == null) { project.ProjectFile = projectName; } // we stash the evaluation Id as a negative ProjectContextId project.Id = evaluationId; } else if (e is ProjectEvaluationFinishedEventArgs projectEvaluationFinished) { EvaluationFolder = Build.GetOrCreateNodeWithName <Folder>("Evaluation"); var projectName = Intern(projectEvaluationFinished.ProjectFile); var profilerResult = projectEvaluationFinished.ProfilerResult; if (profilerResult != null && projectName != null) { var nodeName = Intern(GetEvaluationProjectName(-projectEvaluationFinished.BuildEventContext.ProjectContextId, projectName)); var project = EvaluationFolder.GetOrCreateNodeWithName <Project>(nodeName); ConstructProfilerResult(project, profilerResult.Value); } } // this happens during live build using MSBuild 15.3 or newer else if (e.GetType().Name == "ProjectEvaluationStartedEventArgs") { var projectName = Intern(TextUtilities.ParseQuotedSubstring(e.Message)); var nodeName = Intern(GetEvaluationProjectName(-e.BuildEventContext.ProjectContextId, projectName)); var project = EvaluationFolder.GetOrCreateNodeWithName <Project>(nodeName); project.Id = Reflector.GetEvaluationId(e.BuildEventContext); if (project.ProjectFile == null) { project.ProjectFile = projectName; } } } } catch (Exception ex) { HandleException(ex); } }
/// <summary> /// Handles a generic BuildMessage event and assigns it to the appropriate logging node. /// </summary> /// <param name="args">The <see cref="BuildMessageEventArgs"/> instance containing the event data.</param> public void AddMessage(LazyFormattedBuildEventArgs args, string message) { message = stringTable.Intern(message); TreeNode node = null; var messageNode = new Message { Text = message, Timestamp = args.Timestamp }; object nodeToAdd = messageNode; if (args.BuildEventContext?.TaskId > 0) { node = construction .GetOrAddProject(args.BuildEventContext.ProjectContextId) .GetTargetById(args.BuildEventContext.TargetId) .GetTaskById(args.BuildEventContext.TaskId); var task = node as Task; if (task != null) { if (task.Name == "ResolveAssemblyReference") { Folder inputs = task.GetOrCreateNodeWithName <Folder>("Inputs"); Folder results = task.FindChild <Folder>("Results"); node = results ?? inputs; if (message.StartsWith(" ")) { message = message.Substring(4); var parameter = node.FindLastChild <Parameter>(); if (parameter != null) { if (!string.IsNullOrWhiteSpace(message)) { node = parameter; if (message.StartsWith(" ")) { message = message.Substring(4); var lastItem = parameter.FindLastChild <Item>(); // only indent if it's not a "For SearchPath..." message - that one needs to be directly under parameter if (lastItem != null && !message.StartsWith("For SearchPath")) { node = lastItem; } } if (!string.IsNullOrEmpty(message)) { if (message.IndexOf('=') != -1) { var kvp = Utilities.ParseNameValue(message); node.AddChild(new Metadata { Name = stringTable.Intern(kvp.Key.TrimEnd(space)), Value = stringTable.Intern(kvp.Value.TrimStart(space)) }); } else { node.AddChild(new Item() { Text = stringTable.Intern(message) }); } } } return; } } else { if (results == null) { bool isResult = message.StartsWith("Unified primary reference ") || message.StartsWith("Primary reference ") || message.StartsWith("Dependency ") || message.StartsWith("Unified Dependency "); if (isResult) { results = task.GetOrCreateNodeWithName <Folder>("Results"); node = results; } else { node = inputs; } } else { node = results; } node.GetOrCreateNodeWithName <Parameter>(stringTable.Intern(message.TrimEnd(':'))); return; } } else if (task.Name == "MSBuild") { if (message.StartsWith("Global Properties") || message.StartsWith("Additional Properties") || message.StartsWith("Overriding Global Properties") || message.StartsWith("Removing Properties")) { node.GetOrCreateNodeWithName <Folder>(message); return; } node = node.FindLastChild <Folder>(); if (message[0] == ' ' && message[1] == ' ') { message = message.Substring(2); } var kvp = Utilities.ParseNameValue(message); if (kvp.Value == "") { nodeToAdd = new Item { Text = stringTable.Intern(kvp.Key) }; } else { nodeToAdd = new Property { Name = stringTable.Intern(kvp.Key), Value = stringTable.Intern(kvp.Value) }; } } } } else if (args.BuildEventContext?.TargetId > 0) { node = construction .GetOrAddProject(args.BuildEventContext.ProjectContextId) .GetTargetById(args.BuildEventContext.TargetId); if (message.StartsWith("Task") && message.Contains("skipped")) { messageNode.IsLowRelevance = true; } } else if (args.BuildEventContext?.ProjectContextId > 0) { var project = construction.GetOrAddProject(args.BuildEventContext.ProjectContextId); node = project; if (message.StartsWith("Target") && message.Contains("skipped")) { var targetName = stringTable.Intern(Utilities.ParseQuotedSubstring(message)); if (targetName != null) { node = project.GetOrAddTargetByName(targetName); messageNode.IsLowRelevance = true; } } } else if (Reflector.GetEvaluationId(args.BuildEventContext) is int evaluationId && evaluationId != -1) { var evaluation = construction.EvaluationFolder; var project = evaluation.FindChild <Project>(p => p.Id == evaluationId); node = project; if (node != null && node.FindChild <Message>(message) != null) { // avoid duplicate messages return; } } if (node == null) { node = construction.Build; if (IsEvaluationMessage(message)) { if (!evaluationMessagesAlreadySeen.Add(message)) { return; } node = construction.EvaluationFolder; } else if (message.StartsWith("The target") && message.Contains("does not exist in the project, and will be ignored")) { var folder = construction.EvaluationFolder; node = folder; messageNode.IsLowRelevance = true; } else if (args.BuildEventContext != null && (args.BuildEventContext.NodeId == 0 && args.BuildEventContext.ProjectContextId == 0 && args.BuildEventContext.ProjectInstanceId == 0 && args.BuildEventContext.TargetId == 0 && args.BuildEventContext.TaskId == 0)) { // must be Detailed Build Summary // https://github.com/Microsoft/msbuild/blob/master/src/XMakeBuildEngine/BackEnd/Components/Scheduler/Scheduler.cs#L509 node = construction.Build.GetOrCreateNodeWithName <Folder>("DetailedSummary"); } } node.AddChild(nodeToAdd); }