public void WarningRaised(object sender, BuildWarningEventArgs args) { try { lock (syncLock) { TreeNode parent = FindParent(args.BuildEventContext); if (parent == null) { parent = Build; } var warning = new Warning(); string text = args.Message; if (parent is ResolveAssemblyReferenceTask rar) { var match = Strings.IsFoundConflicts(text); if (match.Success) { string details = match.Groups[2].Value; // https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/443 ItemGroupParser.ParseThereWasAConflict(warning, details, stringTable); text = text.GetFirstLine(); } } parent = parent.GetOrCreateNodeWithName <Folder>(Strings.Warnings); Populate(warning, args, text); parent.AddChild(warning); } } catch (Exception ex) { HandleException(ex); } }
private bool ProcessRAR(ResolveAssemblyReferenceTask task, ref TreeNode node, string message) { Folder inputs = task.Inputs; Folder results = task.Results; node = results ?? inputs; if (message.StartsWith(" ", StringComparison.Ordinal)) { message = message.Substring(4); var parameter = node?.FindLastChild <Parameter>(); if (parameter != null) { bool thereWasAConflict = Strings.IsThereWasAConflictPrefix(parameter.Name); if (thereWasAConflict) { if (construction.Build.IsMSBuildVersionAtLeast(16, 9)) { // https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/443 ItemGroupParser.ParseThereWasAConflict(parameter, message, stringTable); } else { HandleThereWasAConflict(parameter, message, stringTable); } return(true); } if (!string.IsNullOrWhiteSpace(message)) { node = parameter; if (message.StartsWith(" ", StringComparison.Ordinal)) { 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 // also don't indent if it's under AssemblyFoldersEx in Results if (lastItem != null && !Strings.ForSearchPathPrefix.IsMatch(message) && !parameter.Name.StartsWith("AssemblyFoldersEx", StringComparison.Ordinal)) { node = lastItem; } } if (!string.IsNullOrEmpty(message)) { var equals = message.IndexOf('='); if (equals != -1 && message.IndexOfFirstLineBreak() == -1) { var kvp = TextUtilities.ParseNameValue(message); var metadata = new Metadata { Name = Intern(kvp.Key.TrimEnd(space)), Value = Intern(kvp.Value.TrimStart(space)) }; node.Children.Add(metadata); metadata.Parent = node; } else { node.AddChild(new Item { Text = Intern(message) }); } } } return(true); } } else { if (results == null) { bool isResult = Strings.UnifiedPrimaryReferencePrefix.IsMatch(message) || Strings.PrimaryReferencePrefix.IsMatch(message) || Strings.DependencyPrefix.IsMatch(message) || Strings.UnifiedDependencyPrefix.IsMatch(message) || Strings.AssemblyFoldersExLocation.IsMatch(message) || Strings.IsThereWasAConflictPrefix(message); if (isResult) { results = task.GetOrCreateNodeWithName <Folder>(Strings.Results); task.Results = results; node = results; } else { if (inputs == null) { inputs = task.GetOrCreateNodeWithName <Folder>(Strings.Inputs); task.Inputs = inputs; } node = inputs; } } else { node = results; } var parameter = new Parameter(); string parameterName; if (Strings.IsThereWasAConflictPrefix(message)) { ItemGroupParser.ParseThereWasAConflict(parameter, message, stringTable); parameterName = message.GetFirstLine(); } else { parameterName = message.TrimEnd(':'); } parameter.Name = Intern(parameterName); node.AddChild(parameter); return(true); } return(false); }