in src/StructuredLogger/Construction/MessageProcessor.cs [626:755]
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;
}