Skip to content

Commit b31ca33

Browse files
committed
Stripped-down C# code generator.
1 parent fe33a1b commit b31ca33

1 file changed

Lines changed: 29 additions & 50 deletions

File tree

ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs

Lines changed: 29 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ReClassNET.CodeGenerator
1111
{
1212
public class CSharpCodeGenerator : ICodeGenerator
1313
{
14-
private readonly Dictionary<Type, string> typeToTypedefMap = new Dictionary<Type, string>
14+
private static readonly Dictionary<Type, string> typeToTypedefMap = new Dictionary<Type, string>
1515
{
1616
[typeof(DoubleNode)] = "double",
1717
[typeof(FloatNode)] = "float",
@@ -40,7 +40,7 @@ public string GenerateCode(IEnumerable<ClassNode> classes, ILogger logger)
4040
var sb = new StringBuilder();
4141
sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}");
4242
sb.AppendLine();
43-
sb.AppendLine("// Warning: The code doesn't contain arrays and instances!");
43+
sb.AppendLine("// Warning: The code generator doesn't support all node types!");
4444
sb.AppendLine();
4545
sb.AppendLine("using System.Runtime.InteropServices;");
4646
sb.AppendLine();
@@ -65,8 +65,8 @@ public string GenerateCode(IEnumerable<ClassNode> classes, ILogger logger)
6565
csb.AppendLine(
6666
string.Join(
6767
Environment.NewLine + Environment.NewLine,
68-
YieldMemberDefinitions(c.Nodes, logger)
69-
.Select(m => $"\t{GetFieldDecorator(m)}{Environment.NewLine}\t{GetFieldDefinition(m)}")
68+
GetTypeDeclerationsForNodes(c.Nodes, logger)
69+
.Select(t => $"\t{t.Item1}{Environment.NewLine}\t{t.Item2}")
7070
)
7171
);
7272
csb.Append("}");
@@ -78,70 +78,49 @@ public string GenerateCode(IEnumerable<ClassNode> classes, ILogger logger)
7878
return sb.ToString();
7979
}
8080

81-
private IEnumerable<MemberDefinition> YieldMemberDefinitions(IEnumerable<BaseNode> members, ILogger logger)
81+
private static IEnumerable<Tuple<string, string>> GetTypeDeclerationsForNodes(IEnumerable<BaseNode> members, ILogger logger)
8282
{
8383
Contract.Requires(members != null);
8484
Contract.Requires(Contract.ForAll(members, m => m != null));
85-
Contract.Ensures(Contract.Result<IEnumerable<MemberDefinition>>() != null);
86-
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<MemberDefinition>>(), d => d != null));
85+
Contract.Requires(logger != null);
86+
Contract.Ensures(Contract.Result<IEnumerable<Tuple<string, string>>>() != null);
87+
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<Tuple<string, string>>>(), t => t != null));
8788

8889
foreach (var member in members.WhereNot(n => n is BaseHexNode))
8990
{
90-
if (member is BitFieldNode bitFieldNode)
91+
var type = GetTypeForNode(member, logger);
92+
if (type != null)
9193
{
92-
string type;
93-
switch (bitFieldNode.Bits)
94-
{
95-
default:
96-
type = typeToTypedefMap[typeof(UInt8Node)];
97-
break;
98-
case 16:
99-
type = typeToTypedefMap[typeof(UInt16Node)];
100-
break;
101-
case 32:
102-
type = typeToTypedefMap[typeof(UInt32Node)];
103-
break;
104-
case 64:
105-
type = typeToTypedefMap[typeof(UInt64Node)];
106-
break;
107-
}
108-
109-
yield return new MemberDefinition(member, type);
94+
yield return Tuple.Create(
95+
$"[FieldOffset({member.Offset.ToInt32()})]",
96+
$"public {type} {member.Name}; //0x{member.Offset.ToInt32():X04} {member.Comment}".Trim()
97+
);
11098
}
11199
else
112100
{
113-
if (typeToTypedefMap.TryGetValue(member.GetType(), out var type))
114-
{
115-
yield return new MemberDefinition(member, type);
116-
}
117-
else
118-
{
119-
var generator = CustomCodeGenerator.GetGenerator(member, Language);
120-
if (generator != null)
121-
{
122-
yield return generator.GetMemberDefinition(member, Language, logger);
123-
124-
continue;
125-
}
126-
127-
logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}");
128-
}
101+
logger.Log(LogLevel.Warning, $"Skipping node with unhandled type: {member.GetType()}");
129102
}
130103
}
131104
}
132105

133-
private string GetFieldDecorator(MemberDefinition member)
106+
private static string GetTypeForNode(BaseNode node, ILogger logger)
134107
{
135-
Contract.Requires(member != null);
108+
Contract.Requires(node != null);
109+
Contract.Requires(logger != null);
136110

137-
return $"[FieldOffset({member.Offset})]";
138-
}
111+
if (node is BitFieldNode bitFieldNode)
112+
{
113+
var underlayingNode = bitFieldNode.GetUnderlayingNode();
114+
underlayingNode.CopyFromNode(node);
115+
node = underlayingNode;
116+
}
139117

140-
private string GetFieldDefinition(MemberDefinition member)
141-
{
142-
Contract.Requires(member != null);
118+
if (typeToTypedefMap.TryGetValue(node.GetType(), out var type))
119+
{
120+
return type;
121+
}
143122

144-
return $"public {member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim();
123+
return null;
145124
}
146125
}
147126
}

0 commit comments

Comments
 (0)