@@ -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