Skip to content

Commit 5a468be

Browse files
committed
Bring back DeepCopy
Apparently KSP's default implementation fails on badly formed nodes
1 parent 8a81310 commit 5a468be

3 files changed

Lines changed: 76 additions & 1 deletion

File tree

ModuleManager/Extensions/ConfigNodeExtensions.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,18 @@ public static void ShallowCopyFrom(this ConfigNode toNode, ConfigNode fromeNode)
1515
foreach (ConfigNode node in fromeNode.nodes)
1616
toNode.nodes.Add(node);
1717
}
18+
19+
public static ConfigNode DeepCopy(this ConfigNode from)
20+
{
21+
ConfigNode to = new ConfigNode(from.name);
22+
foreach (ConfigNode.Value value in from.values)
23+
to.AddValue(value.name, value.value);
24+
foreach (ConfigNode node in from.nodes)
25+
{
26+
ConfigNode newNode = DeepCopy(node);
27+
to.nodes.Add(newNode);
28+
}
29+
return to;
30+
}
1831
}
1932
}

ModuleManager/MMPatchLoader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1108,7 +1108,7 @@ public IEnumerator ApplyPatch(string Stage)
11081108
// it uses FindConfigNodeIn(src, nodeType, nodeName, nodeTag) to recurse.
11091109
public static ConfigNode ModifyNode(NodeStack original, ConfigNode mod, PatchContext context)
11101110
{
1111-
ConfigNode newNode = original.value.CreateCopy();
1111+
ConfigNode newNode = original.value.DeepCopy();
11121112
NodeStack nodeStack = original.ReplaceValue(newNode);
11131113

11141114
#region Values

ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,67 @@ public void TestShallowCopyFrom()
8383
Assert.Equal(0, innerNode2.nodes[0].values.Count);
8484
Assert.Equal(0, innerNode2.nodes[0].nodes.Count);
8585
}
86+
87+
[Fact]
88+
public void TestDeepCopy()
89+
{
90+
ConfigNode fromNode = new TestConfigNode("SOME_NODE")
91+
{
92+
{ "abc", "def" },
93+
{ "ghi", "jkl" },
94+
new TestConfigNode("INNER_NODE_1")
95+
{
96+
{ "mno", "pqr" },
97+
new TestConfigNode("INNER_INNER_NODE_1"),
98+
},
99+
new TestConfigNode("INNER_NODE_2")
100+
{
101+
{ "stu", "vwx" },
102+
new TestConfigNode("INNER_INNER_NODE_2"),
103+
},
104+
};
105+
106+
ConfigNode toNode = fromNode.DeepCopy();
107+
108+
Assert.Equal("SOME_NODE", toNode.name);
109+
110+
Assert.Equal(2, toNode.values.Count);
111+
112+
Assert.NotSame(fromNode.values[0], toNode.values[0]);
113+
Assert.Equal("abc", toNode.values[0].name);
114+
Assert.Equal("def", toNode.values[0].value);
115+
116+
Assert.NotSame(fromNode.values[1], toNode.values[1]);
117+
Assert.Equal("ghi", toNode.values[1].name);
118+
Assert.Equal("jkl", toNode.values[1].value);
119+
120+
Assert.Equal(2, toNode.nodes.Count);
121+
122+
ConfigNode innerNode1 = toNode.nodes[0];
123+
Assert.NotSame(fromNode.nodes[0], innerNode1);
124+
Assert.Equal("INNER_NODE_1", innerNode1.name);
125+
Assert.Equal(1, innerNode1.values.Count);
126+
Assert.NotSame(fromNode.nodes[0].values[0], innerNode1.values[0]);
127+
Assert.Equal("mno", innerNode1.values[0].name);
128+
Assert.Equal("pqr", innerNode1.values[0].value);
129+
Assert.Equal(1, toNode.nodes[0].nodes.Count);
130+
Assert.NotSame(fromNode.nodes[0].nodes[0], innerNode1.nodes[0]);
131+
Assert.Equal("INNER_INNER_NODE_1", innerNode1.nodes[0].name);
132+
Assert.Equal(0, innerNode1.nodes[0].values.Count);
133+
Assert.Equal(0, innerNode1.nodes[0].nodes.Count);
134+
135+
ConfigNode innerNode2 = toNode.nodes[1];
136+
Assert.NotSame(fromNode.nodes[1], innerNode2);
137+
Assert.Equal("INNER_NODE_2", innerNode2.name);
138+
Assert.Equal(1, innerNode2.values.Count);
139+
Assert.NotSame(fromNode.nodes[1].values[0], innerNode2.values[0]);
140+
Assert.Equal("stu", innerNode2.values[0].name);
141+
Assert.Equal("vwx", innerNode2.values[0].value);
142+
Assert.Equal(1, innerNode2.nodes.Count);
143+
Assert.NotSame(fromNode.nodes[1].nodes[0], innerNode2.nodes[0]);
144+
Assert.Equal("INNER_INNER_NODE_2", innerNode2.nodes[0].name);
145+
Assert.Equal(0, innerNode2.nodes[0].values.Count);
146+
Assert.Equal(0, innerNode2.nodes[0].nodes.Count);
147+
}
86148
}
87149
}

0 commit comments

Comments
 (0)