Skip to content

Commit c64b0fb

Browse files
committed
Updated CreateNodeFromElement.
1 parent 4e939e3 commit c64b0fb

File tree

1 file changed

+17
-63
lines changed

1 file changed

+17
-63
lines changed

Diff for: NodeConverter.cs

+17-63
Original file line numberDiff line numberDiff line change
@@ -14,78 +14,32 @@ public class NodeConverter : ICustomNodeSerializer
1414
/// <summary>Name of the type used in the XML data.</summary>
1515
private const string XmlTypePrefix = "UnrealEngineClasses.";
1616

17+
private static readonly Dictionary<string, Type> stringToTypeMap = new[]
18+
{
19+
typeof(FDateTimeNode),
20+
typeof(FGuidNode),
21+
typeof(FQWordNode),
22+
typeof(TArrayNode),
23+
typeof(TSharedPtrNode)
24+
}.ToDictionary(t => XmlTypePrefix + t.Name, t => t);
25+
26+
private static readonly Dictionary<Type, string> typeToStringMap = stringToTypeMap.ToDictionary(kv => kv.Value, kv => kv.Key);
27+
1728
public bool CanHandleNode(BaseNode node) => node is FDateTimeNode || node is FGuidNode || node is FQWordNode || node is FStringNode || node is TArrayNode || node is TSharedPtrNode;
1829

1930
public bool CanHandleElement(XElement element) => element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value.StartsWith(XmlTypePrefix) == true;
2031

21-
public bool TryCreateNodeFromElement(XElement element, BaseNode parent, IEnumerable<ClassNode> classes, ILogger logger, CreateNodeFromElementHandler defaultHandler, out BaseNode node)
32+
public BaseNode CreateNodeFromElement(XElement element, BaseNode parent, IEnumerable<ClassNode> classes, ILogger logger, CreateNodeFromElementHandler createNodeFromElement)
2233
{
23-
node = null;
24-
25-
var type = element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value;
26-
switch (type)
34+
if (!stringToTypeMap.TryGetValue(element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value ?? string.Empty, out var nodeType))
2735
{
28-
case XmlTypePrefix + "FDateTime":
29-
node = new FDateTimeNode();
30-
break;
31-
case XmlTypePrefix + "FGuid":
32-
node = new FGuidNode();
33-
break;
34-
case XmlTypePrefix + "FQWord":
35-
node = new FQWordNode();
36-
break;
37-
case XmlTypePrefix + "FString":
38-
node = new FStringNode();
39-
break;
40-
case XmlTypePrefix + "TArray":
41-
case XmlTypePrefix + "TSharedPtr":
42-
{
43-
if (type == XmlTypePrefix + "TArray")
44-
{
45-
node = new TArrayNode();
46-
}
47-
else
48-
{
49-
node = new TSharedPtrNode();
50-
}
51-
52-
BaseNode innerNode = null;
53-
var innerElement = element.Elements().FirstOrDefault();
54-
if (innerElement != null)
55-
{
56-
innerNode = defaultHandler(innerElement, node, logger);
57-
}
58-
59-
var wrapperNode = (BaseWrapperNode)node;
60-
if (wrapperNode.CanChangeInnerNodeTo(innerNode))
61-
{
62-
var rootWrapperNode = node.GetRootWrapperNode();
63-
if (rootWrapperNode.ShouldPerformCycleCheckForInnerNode()
64-
&& innerNode is ClassNode classNode
65-
&& ClassUtil.IsCyclicIfClassIsAccessibleFromParent(node.GetParentClass(), classNode, classes))
66-
{
67-
logger.Log(LogLevel.Error, $"Skipping node with cyclic class reference: {node.GetParentClass().Name}->{rootWrapperNode.Name}");
68-
69-
return false;
70-
}
36+
logger.Log(LogLevel.Error, $"Skipping node with unknown type: {element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value}");
37+
logger.Log(LogLevel.Warning, element.ToString());
7138

72-
wrapperNode.ChangeInnerNode(innerNode);
73-
}
74-
else
75-
{
76-
return false;
77-
}
78-
79-
break;
80-
}
81-
default:
82-
throw new InvalidOperationException("Can not handle node type: " + type);
39+
return null;
8340
}
8441

85-
node.Name = element.Attribute(ReClassNetFile.XmlNameAttribute)?.Value ?? string.Empty;
86-
node.Comment = element.Attribute(ReClassNetFile.XmlCommentAttribute)?.Value ?? string.Empty;
87-
88-
return true;
42+
return BaseNode.CreateInstanceFromType(nodeType, false);
8943
}
9044

9145
public XElement CreateElementFromNode(BaseNode node, ILogger logger, CreateElementFromNodeHandler defaultHandler)

0 commit comments

Comments
 (0)