in src/StructuredLogger/Construction/MessageProcessor.cs [387:624]
public void AddMessage(LazyFormattedBuildEventArgs args, string message)
{
TreeNode parent = null;
BaseNode nodeToAdd = null;
bool lowRelevance = false;
var buildEventContext = args.BuildEventContext;
if (buildEventContext != null && buildEventContext.TaskId > 0)
{
parent = GetTask(args);
if (parent is Task task)
{
if (args is AssemblyLoadBuildEventArgs)
{
nodeToAdd = new Message() { Text = Intern(message), IsLowRelevance = lowRelevance };
}
else if (task is ResolveAssemblyReferenceTask rar)
{
if (ProcessRAR(rar, ref parent, message))
{
return;
}
}
else if (string.Equals(task.Name, "MSBuild", StringComparison.OrdinalIgnoreCase))
{
if (ProcessMSBuildTask(task, ref parent, ref nodeToAdd, message))
{
return;
}
}
else if (string.Equals(task.Name, "RestoreTask", StringComparison.OrdinalIgnoreCase))
{
if (ProcessRestoreTask(task, ref parent, message))
{
return;
}
}
else if (string.Equals(task.Name, "Mmp", StringComparison.OrdinalIgnoreCase))
{
if (ProcessMmp(task, ref parent, message))
{
return;
}
}
}
}
else if (buildEventContext != null && buildEventContext.TargetId > 0)
{
parent = GetTarget(args);
if (message.Contains(Strings.TaskSkippedFalseCondition) && Strings.TaskSkippedFalseConditionRegex.IsMatch(message))
{
lowRelevance = true;
}
}
else if (buildEventContext != null && buildEventContext.ProjectContextId > 0)
{
var project = construction.GetOrAddProject(buildEventContext.ProjectContextId);
parent = project;
if (message.Equals("Building with tools version \"Current\".", StringComparison.Ordinal))
{
// this is useless so just drop it on the floor
return;
}
var targetSkipReason = Strings.GetTargetSkipReason(message);
if (targetSkipReason != TargetSkipReason.None)
{
// Target skipped was a simple message before this PR:
// https://github.com/dotnet/msbuild/pull/6402
var targetName = Intern(TextUtilities.ParseQuotedSubstring(message));
if (targetName != null)
{
var args2 = new TargetSkippedEventArgs2(message);
args2.TargetName = targetName;
args2.BuildEventContext = args.BuildEventContext;
args2.SkipReason = targetSkipReason;
args2.OriginallySucceeded = targetSkipReason != TargetSkipReason.PreviouslyBuiltUnsuccessfully;
Reflector.BuildEventArgs_timestamp.SetValue(args2, args.Timestamp);
construction.TargetSkipped(args2);
return;
}
}
}
else if (buildEventContext != null && buildEventContext.EvaluationId != -1)
{
parent = construction.EvaluationFolder;
var evaluationId = buildEventContext.EvaluationId;
var evaluation = construction.Build.FindEvaluation(evaluationId);
if (evaluation != null)
{
parent = evaluation;
}
if (args is PropertyReassignmentEventArgs || (message.Contains(Strings.PropertyReassignment) && Strings.PropertyReassignmentRegex.IsMatch(message)))
{
TimedNode properties;
if (evaluation != null)
{
properties = evaluation.PropertyReassignmentFolder;
}
else
{
properties = parent.GetOrCreateNodeWithName<TimedNode>(Strings.PropertyReassignmentFolder, addAtBeginning: true);
}
var propertyName = Strings.GetPropertyName(message);
parent = properties.GetOrCreateNodeWithName<Folder>(propertyName);
}
else if (parent == evaluation && parent.FindChild<Message>(message) != null)
{
// avoid duplicate messages
return;
}
}
else if (args.Message.StartsWith(Strings.NodesReusal, StringComparison.Ordinal))
{
parent = construction.Build.GetOrCreateNodeWithName<Folder>(Strings.NodesManagementNode);
}
if (parent == null)
{
parent = construction.Build;
if (construction.Build.FileFormatVersion < 9 && Strings.IsEvaluationMessage(message))
{
if (!evaluationMessagesAlreadySeen.Add(message))
{
return;
}
parent = construction.EvaluationFolder;
}
else if (construction.Build.FileFormatVersion < 9 && message.Contains(Strings.PropertyReassignment) && Strings.PropertyReassignmentRegex.IsMatch(message))
{
if (!evaluationMessagesAlreadySeen.Add(message))
{
return;
}
var properties = construction.EvaluationFolder.GetOrCreateNodeWithName<Folder>(Strings.PropertyReassignmentFolder);
parent = properties.GetOrCreateNodeWithName<Folder>(Strings.GetPropertyName(message));
}
else if (Strings.IsTargetDoesNotExistAndWillBeSkipped(message))
{
var folder = construction.EvaluationFolder;
parent = folder;
lowRelevance = true;
}
else if (
buildEventContext != null &&
buildEventContext.NodeId == 0 &&
buildEventContext.ProjectContextId == 0 &&
buildEventContext.ProjectInstanceId == 0 &&
buildEventContext.TargetId == 0 &&
buildEventContext.TaskId == 0)
{
// must be Detailed Build Summary
// https://github.com/dotnet/msbuild/blob/d797c48da13aaa4dc7ae440ed7603c990cd44317/src/Build/BackEnd/Components/Scheduler/Scheduler.cs#L546
// Make sure to trim it otherwise it takes forever to load for huge builds
// and at that data volume it's just not useful
if (DetailedSummary.Length < 20_000_000)
{
DetailedSummary.AppendLine(message);
}
return;
}
else if (
buildEventContext != null &&
buildEventContext.NodeId == -2 &&
buildEventContext.ProjectContextId == -2 &&
buildEventContext.ProjectInstanceId == -1)
{
if (message.StartsWith(Strings.MSBuildVersionPrefix))
{
var version = message.Substring(Strings.MSBuildVersionPrefix.Length);
construction.Build.MSBuildVersion = version;
}
else if (message.StartsWith(Strings.MSBuildExecutablePathPrefix))
{
var executablePath = message.Substring(Strings.MSBuildExecutablePathPrefix.Length);
construction.Build.MSBuildExecutablePath = executablePath;
}
}
}
if (args is EnvironmentVariableReadEventArgs envArgs)
{
string environmentVariableName = Intern(envArgs.EnvironmentVariableName);
string environmentVariableValue = Intern(message);
nodeToAdd = new Property { Name = environmentVariableName, Value = environmentVariableValue };
construction.AddEnvironmentVariable(environmentVariableName, environmentVariableValue);
}
else if (nodeToAdd == null)
{
message = Intern(message);
if (args is CriticalBuildMessageEventArgs criticalArgs)
{
var critical = new CriticalBuildMessage();
critical.Text = message;
critical.Timestamp = args.Timestamp;
critical.Code = Intern(criticalArgs.Code);
critical.ColumnNumber = criticalArgs.ColumnNumber;
critical.EndColumnNumber = criticalArgs.EndColumnNumber;
critical.EndLineNumber = criticalArgs.EndLineNumber;
critical.LineNumber = criticalArgs.LineNumber;
critical.File = Intern(criticalArgs.File);
critical.ProjectFile = Intern(criticalArgs.ProjectFile);
critical.Subcategory = Intern(criticalArgs.Subcategory);
nodeToAdd = critical;
}
else if (parent is Task task && task is CppAnalyzer.CppTask)
{
nodeToAdd = new TimedMessage
{
Text = message,
Timestamp = args.Timestamp,
IsLowRelevance = lowRelevance
};
}
else
{
nodeToAdd = new Message
{
Text = message,
IsLowRelevance = lowRelevance
};
}
}
parent.AddChild(nodeToAdd);
}