Fix yaml merging of nodes that define their own overrides.

This commit is contained in:
Paul Chote
2017-09-30 11:13:44 +00:00
committed by reaperrr
parent 18f6317560
commit d170262e09

View File

@@ -257,7 +257,9 @@ namespace OpenRA
if (!sources.Any())
return new List<MiniYamlNode>();
var tree = sources.Where(s => s != null).Aggregate(MergePartial)
var tree = sources.Where(s => s != null)
.Select(MergeSelfPartial)
.Aggregate(MergePartial)
.ToDictionary(n => n.Key, n => n.Value);
var resolved = new Dictionary<string, MiniYaml>();
@@ -325,6 +327,42 @@ namespace OpenRA
return resolved;
}
/// <summary>
/// Merges any duplicate keys that are defined within the same set of nodes.
/// Does not resolve inheritance or node removals.
/// </summary>
static MiniYaml MergeSelfPartial(MiniYaml existingNodes)
{
// Nothing to do
if (existingNodes.Nodes == null || existingNodes.Nodes.Count == 0)
return existingNodes;
return new MiniYaml(existingNodes.Value, MergeSelfPartial(existingNodes.Nodes));
}
/// <summary>
/// Merges any duplicate keys that are defined within the same set of nodes.
/// Does not resolve inheritance or node removals.
/// </summary>
static List<MiniYamlNode> MergeSelfPartial(List<MiniYamlNode> existingNodes)
{
var keys = new HashSet<string>();
var ret = new List<MiniYamlNode>();
foreach (var n in existingNodes)
{
if (keys.Add(n.Key))
ret.Add(n);
else
{
// Node with the same key has already been added: merge new node over the existing one
var original = ret.First(r => r.Key == n.Key);
original.Value = MergePartial(original.Value, n.Value);
}
}
return ret;
}
static MiniYaml MergePartial(MiniYaml existingNodes, MiniYaml overrideNodes)
{
if (existingNodes == null)