public void AddMessage()

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