Fix yaml merging of nodes that define their own overrides.
This commit is contained in:
@@ -257,7 +257,9 @@ namespace OpenRA
|
|||||||
if (!sources.Any())
|
if (!sources.Any())
|
||||||
return new List<MiniYamlNode>();
|
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);
|
.ToDictionary(n => n.Key, n => n.Value);
|
||||||
|
|
||||||
var resolved = new Dictionary<string, MiniYaml>();
|
var resolved = new Dictionary<string, MiniYaml>();
|
||||||
@@ -325,6 +327,42 @@ namespace OpenRA
|
|||||||
return resolved;
|
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)
|
static MiniYaml MergePartial(MiniYaml existingNodes, MiniYaml overrideNodes)
|
||||||
{
|
{
|
||||||
if (existingNodes == null)
|
if (existingNodes == null)
|
||||||
|
|||||||
Reference in New Issue
Block a user