Skip to content

Commit ccc87b6

Browse files
committed
Added enum code generation.
1 parent 0f22f0d commit ccc87b6

File tree

6 files changed

+60
-15
lines changed

6 files changed

+60
-15
lines changed

ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using ReClassNET.Extensions;
77
using ReClassNET.Logger;
88
using ReClassNET.Nodes;
9+
using ReClassNET.Project;
910

1011
namespace ReClassNET.CodeGenerator
1112
{
@@ -35,7 +36,7 @@ public class CSharpCodeGenerator : ICodeGenerator
3536

3637
public Language Language => Language.CSharp;
3738

38-
public string GenerateCode(IEnumerable<ClassNode> classes, ILogger logger)
39+
public string GenerateCode(IReadOnlyList<ClassNode> classes, IReadOnlyList<EnumDescription> enums, ILogger logger)
3940
{
4041
var sb = new StringBuilder();
4142
sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}");

ReClass.NET/CodeGenerator/CppCodeGenerator.cs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,50 @@ public CppCodeGenerator(CppTypeMapping typeMapping)
108108
};
109109
}
110110

111-
public string GenerateCode(IReadOnlyList<ClassNode> classes, ILogger logger)
111+
public string GenerateCode(IReadOnlyList<ClassNode> classes, IReadOnlyList<EnumDescription> enums, ILogger logger)
112112
{
113113
var classNodes = classes;
114114

115115
var sb = new StringBuilder();
116116
sb.AppendLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}");
117117
sb.AppendLine();
118+
sb.AppendLine(
119+
string.Join(
120+
Environment.NewLine + Environment.NewLine,
121+
enums.Select(e =>
122+
{
123+
var esb = new StringBuilder();
124+
esb.Append("enum class ");
125+
esb.Append(e.Name);
126+
esb.Append(" : ");
127+
switch (e.Size)
128+
{
129+
case EnumDescription.UnderlyingTypeSize.OneByte:
130+
esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int8Node)]);
131+
break;
132+
case EnumDescription.UnderlyingTypeSize.TwoBytes:
133+
esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int16Node)]);
134+
break;
135+
case EnumDescription.UnderlyingTypeSize.FourBytes:
136+
esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int32Node)]);
137+
break;
138+
case EnumDescription.UnderlyingTypeSize.EightBytes:
139+
esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int64Node)]);
140+
break;
141+
}
142+
esb.AppendLine("{");
143+
esb.AppendLine(
144+
string.Join(
145+
"," + Environment.NewLine,
146+
e.Values.Select(kv => $"\t{kv.Key} = {kv.Value}")
147+
)
148+
);
149+
esb.AppendLine("};");
150+
151+
return esb.ToString();
152+
})
153+
)
154+
);
118155
sb.AppendLine(
119156
string.Join(
120157
Environment.NewLine + Environment.NewLine,
@@ -297,6 +334,10 @@ private string GetTypeDefinition(BaseNode node, ILogger logger)
297334
{
298335
return $"class {classInstanceNode.InnerNode.Name}";
299336
}
337+
if (node is EnumNode enumNode)
338+
{
339+
return enumNode.Enum.Name;
340+
}
300341

301342
return null;
302343
}

ReClass.NET/CodeGenerator/ICodeGenerator.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics.Contracts;
44
using ReClassNET.Logger;
55
using ReClassNET.Nodes;
6+
using ReClassNET.Project;
67

78
namespace ReClassNET.CodeGenerator
89
{
@@ -16,15 +17,15 @@ public interface ICodeGenerator
1617
/// <param name="classes">The classes to generate code from.</param>
1718
/// <param name="logger">The logger used to output messages.</param>
1819
/// <returns>The code for the classes.</returns>
19-
string GenerateCode(IReadOnlyList<ClassNode> classes, ILogger logger);
20+
string GenerateCode(IReadOnlyList<ClassNode> classes, IReadOnlyList<EnumDescription> enums, ILogger logger);
2021
}
2122

2223
[ContractClassFor(typeof(ICodeGenerator))]
2324
internal abstract class CodeGeneratorContract : ICodeGenerator
2425
{
2526
public Language Language => throw new NotImplementedException();
2627

27-
public string GenerateCode(IReadOnlyList<ClassNode> classes, ILogger logger)
28+
public string GenerateCode(IReadOnlyList<ClassNode> classes, IReadOnlyList<EnumDescription> enums, ILogger logger)
2829
{
2930
Contract.Requires(classes != null);
3031
Contract.Requires(Contract.ForAll(classes, c => c != null));

ReClass.NET/Forms/CodeForm.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,25 @@
1111
using ReClassNET.Extensions;
1212
using ReClassNET.Logger;
1313
using ReClassNET.Nodes;
14+
using ReClassNET.Project;
1415
using ReClassNET.UI;
15-
using ReClassNET.Util;
1616
using ReClassNET.Util.Rtf;
1717

1818
namespace ReClassNET.Forms
1919
{
2020
public partial class CodeForm : IconForm
2121
{
22-
public CodeForm(ICodeGenerator generator, IReadOnlyList<ClassNode> classes, ILogger logger)
22+
public CodeForm(ICodeGenerator generator, IReadOnlyList<ClassNode> classes, IReadOnlyList<EnumDescription> enums, ILogger logger)
2323
{
2424
Contract.Requires(generator != null);
2525
Contract.Requires(classes != null);
26+
Contract.Requires(enums != null);
2627

2728
InitializeComponent();
2829

2930
codeRichTextBox.SetInnerPadding(5, 5, 5, 5);
3031

31-
var code = generator.GenerateCode(classes, logger);
32+
var code = generator.GenerateCode(classes, enums, logger);
3233

3334
var buffer = new StringBuilder(code.Length * 2);
3435
using (var writer = new StringWriter(buffer))

ReClass.NET/Forms/MainForm.Functions.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,27 @@ namespace ReClassNET.Forms
2222
{
2323
public partial class MainForm
2424
{
25-
public void ShowDefaultCodeGeneratorForm(IReadOnlyList<ClassNode> classes)
25+
public void ShowPartialCodeGeneratorForm(IReadOnlyList<ClassNode> partialClasses)
2626
{
27-
Contract.Requires(classes != null);
27+
Contract.Requires(partialClasses != null);
2828

29-
ShowCodeGeneratorForm(classes, new CppCodeGenerator(currentProject.TypeMapping));
29+
ShowCodeGeneratorForm(partialClasses, new EnumDescription[0], new CppCodeGenerator(currentProject.TypeMapping));
3030
}
3131

3232
public void ShowCodeGeneratorForm(ICodeGenerator generator)
3333
{
3434
Contract.Requires(generator != null);
3535

36-
ShowCodeGeneratorForm(currentProject.Classes, generator);
36+
ShowCodeGeneratorForm(currentProject.Classes, currentProject.Enums, generator);
3737
}
3838

39-
public void ShowCodeGeneratorForm(IReadOnlyList<ClassNode> classes, ICodeGenerator generator)
39+
public void ShowCodeGeneratorForm(IReadOnlyList<ClassNode> classes, IReadOnlyList<EnumDescription> enums, ICodeGenerator generator)
4040
{
4141
Contract.Requires(classes != null);
4242
Contract.Requires(generator != null);
43+
Contract.Requires(enums != null);
4344

44-
new CodeForm(generator, classes, Program.Logger).Show();
45+
new CodeForm(generator, classes, enums, Program.Logger).Show();
4546
}
4647

4748
public void AttachToProcess(string processName)

ReClass.NET/Forms/MainForm.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e)
679679
{
680680
if (memoryViewControl.GetSelectedNodes().FirstOrDefault()?.Node is ClassNode node)
681681
{
682-
ShowDefaultCodeGeneratorForm(new[] { node });
682+
ShowPartialCodeGeneratorForm(new[] { node });
683683
}
684684
}
685685

@@ -895,7 +895,7 @@ private void showCodeOfClassToolStripMenuItem2_Click(object sender, EventArgs e)
895895
return;
896896
}
897897

898-
ShowDefaultCodeGeneratorForm(new[] { classNode });
898+
ShowPartialCodeGeneratorForm(new[] { classNode });
899899
}
900900

901901
private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs e)

0 commit comments

Comments
 (0)