@@ -14,78 +14,32 @@ public class NodeConverter : ICustomNodeSerializer
14
14
/// <summary>Name of the type used in the XML data.</summary>
15
15
private const string XmlTypePrefix = "UnrealEngineClasses." ;
16
16
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
+
17
28
public bool CanHandleNode ( BaseNode node ) => node is FDateTimeNode || node is FGuidNode || node is FQWordNode || node is FStringNode || node is TArrayNode || node is TSharedPtrNode ;
18
29
19
30
public bool CanHandleElement ( XElement element ) => element . Attribute ( ReClassNetFile . XmlTypeAttribute ) ? . Value . StartsWith ( XmlTypePrefix ) == true ;
20
31
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 )
22
33
{
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 ) )
27
35
{
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 ( ) ) ;
71
38
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 ;
83
40
}
84
41
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 ) ;
89
43
}
90
44
91
45
public XElement CreateElementFromNode ( BaseNode node , ILogger logger , CreateElementFromNodeHandler defaultHandler )
0 commit comments