Skip to content

Commit 219bedf

Browse files
committed
Added code generator.
Added node converter.
1 parent 6f6b6d0 commit 219bedf

File tree

4 files changed

+180
-2
lines changed

4 files changed

+180
-2
lines changed

CodeGenerator.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using ReClassNET.CodeGenerator;
3+
using ReClassNET.Logger;
4+
using ReClassNET.Nodes;
5+
using UnrealEngineClassesPlugin.Nodes;
6+
7+
namespace UnrealEngineClassesPlugin
8+
{
9+
public class CodeGenerator : ICustomCodeGenerator
10+
{
11+
/// <summary>Checks if the language is C++ and the node is a WeakPtrNode.</summary>
12+
/// <param name="node">The node to check.</param>
13+
/// <param name="language">The language to check.</param>
14+
/// <returns>True if we can generate code, false if not.</returns>
15+
public bool CanGenerateCode(BaseNode node, Language language)
16+
{
17+
if (language != Language.Cpp)
18+
{
19+
return false;
20+
}
21+
22+
switch (node)
23+
{
24+
case FDateTimeNode _:
25+
case FGuidNode _:
26+
case FQWordNode _:
27+
case FStringNode _:
28+
case TArrayNode _:
29+
case TSharedPtrNode _:
30+
return true;
31+
}
32+
33+
return false;
34+
}
35+
36+
/// <summary>Gets the member definition of the node.</summary>
37+
/// <param name="node">The member node.</param>
38+
/// <param name="language">The language to generate.</param>
39+
/// <returns>The member definition of the node.</returns>
40+
public MemberDefinition GetMemberDefinition(BaseNode node, Language language, ILogger logger)
41+
{
42+
switch (node)
43+
{
44+
case FDateTimeNode _:
45+
return new MemberDefinition(node, "FDateTime");
46+
case FGuidNode _:
47+
return new MemberDefinition(node, "FGuid");
48+
case FQWordNode _:
49+
return new MemberDefinition(node, "FQWord");
50+
case FStringNode _:
51+
return new MemberDefinition(node, "FString");
52+
case TArrayNode arrayNode:
53+
return new MemberDefinition(node, $"TArray<{arrayNode.InnerNode.Name}>");
54+
case TSharedPtrNode sharedPtrNode:
55+
return new MemberDefinition(node, $"TSharedPtr<{sharedPtrNode.InnerNode.Name}>");
56+
}
57+
58+
throw new InvalidOperationException("Can not handle node: " + node.GetType());
59+
}
60+
}
61+
}

NodeConverter.cs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Xml.Linq;
5+
using ReClassNET.DataExchange.ReClass;
6+
using ReClassNET.Logger;
7+
using ReClassNET.Nodes;
8+
using UnrealEngineClassesPlugin.Nodes;
9+
10+
namespace UnrealEngineClassesPlugin
11+
{
12+
public class NodeConverter : ICustomNodeConverter
13+
{
14+
/// <summary>Name of the type used in the XML data.</summary>
15+
private const string XmlTypePrefix = "UnrealEngineClasses.";
16+
17+
public bool CanHandleNode(BaseNode node) => node is FDateTimeNode || node is FGuidNode || node is FQWordNode || node is FStringNode || node is TArrayNode || node is TSharedPtrNode;
18+
19+
public bool CanHandleElement(XElement element) => element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value.StartsWith(XmlTypePrefix) == true;
20+
21+
public bool TryCreateNodeFromElement(XElement element, ClassNode parent, IEnumerable<ClassNode> classes, ILogger logger, out BaseNode node)
22+
{
23+
node = null;
24+
25+
var type = element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value;
26+
switch (type)
27+
{
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+
var reference = NodeUuid.FromBase64String(element.Attribute(ReClassNetFile.XmlReferenceAttribute)?.Value, false);
44+
var innerClass = classes.FirstOrDefault(c => c.Uuid.Equals(reference));
45+
if (innerClass == null)
46+
{
47+
logger.Log(LogLevel.Warning, $"Skipping node with unknown reference: {reference}");
48+
logger.Log(LogLevel.Warning, element.ToString());
49+
50+
return false;
51+
}
52+
53+
if (type == XmlTypePrefix + "TArray")
54+
{
55+
node = new TArrayNode();
56+
}
57+
else
58+
{
59+
node = new TSharedPtrNode();
60+
}
61+
((BaseReferenceNode)node).ChangeInnerNode(innerClass);
62+
63+
break;
64+
}
65+
default:
66+
throw new InvalidOperationException("Can not handle node type: " + type);
67+
}
68+
69+
node.Name = element.Attribute(ReClassNetFile.XmlNameAttribute)?.Value ?? string.Empty;
70+
node.Comment = element.Attribute(ReClassNetFile.XmlCommentAttribute)?.Value ?? string.Empty;
71+
72+
return true;
73+
}
74+
75+
public XElement CreateElementFromNode(BaseNode node, ILogger logger)
76+
{
77+
var element = new XElement(
78+
ReClassNetFile.XmlNodeElement,
79+
new XAttribute(ReClassNetFile.XmlNameAttribute, node.Name ?? string.Empty),
80+
new XAttribute(ReClassNetFile.XmlCommentAttribute, node.Comment ?? string.Empty)
81+
);
82+
83+
switch (node)
84+
{
85+
case FDateTimeNode _:
86+
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "FDateTime");
87+
break;
88+
case FGuidNode _:
89+
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "FGuid");
90+
break;
91+
case FQWordNode _:
92+
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "FQWord");
93+
break;
94+
case FStringNode _:
95+
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "FString");
96+
break;
97+
case TArrayNode arrayNode:
98+
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "TArray");
99+
element.SetAttributeValue(ReClassNetFile.XmlReferenceAttribute, arrayNode.InnerNode.Uuid.ToBase64String());
100+
break;
101+
case TSharedPtrNode sharedPtrNode:
102+
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "TSharedPtr");
103+
element.SetAttributeValue(ReClassNetFile.XmlReferenceAttribute, sharedPtrNode.InnerNode.Uuid.ToBase64String());
104+
break;
105+
}
106+
107+
return element;
108+
}
109+
}
110+
}

UnrealEngineClassesPlugin.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<Reference Include="System" />
6161
<Reference Include="System.Core" />
6262
<Reference Include="System.Drawing" />
63+
<Reference Include="System.Xml.Linq" />
6364
</ItemGroup>
6465
<ItemGroup>
6566
<Compile Include="Nodes\FDateTimeNode.cs" />
@@ -75,6 +76,8 @@
7576
<DesignTime>True</DesignTime>
7677
<DependentUpon>Resources.resx</DependentUpon>
7778
</Compile>
79+
<Compile Include="CodeGenerator.cs" />
80+
<Compile Include="NodeConverter.cs" />
7881
</ItemGroup>
7982
<ItemGroup>
8083
<EmbeddedResource Include="Properties\Resources.resx">

UnrealEngineClassesPluginExt.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
using System;
22
using System.Drawing;
33
using ReClassNET.Plugins;
4+
using UnrealEngineClassesPlugin.Nodes;
45

56
namespace UnrealEngineClassesPlugin
67
{
7-
public class UnrealPluginExt : Plugin
8+
public class UnrealEngineClassesPluginExt : Plugin
89
{
910
private IPluginHost host;
1011

12+
private readonly NodeConverter converter = new NodeConverter();
13+
private readonly CodeGenerator generator = new CodeGenerator();
14+
1115
public override Image Icon => Properties.Resources.B16x16_Icon;
1216

1317
public override bool Initialize(IPluginHost host)
@@ -21,7 +25,7 @@ public override bool Initialize(IPluginHost host)
2125

2226
this.host = host ?? throw new ArgumentNullException(nameof(host));
2327

24-
28+
host.RegisterNodeType(typeof(TArrayNode), "TArray", Icon, converter, generator);
2529

2630
return true;
2731
}

0 commit comments

Comments
 (0)