@@ -154,76 +154,73 @@ public CppCodeGenerator(CppTypeMapping typeMapping)
154154
155155 public string GenerateCode ( IReadOnlyList < ClassNode > classes , IReadOnlyList < EnumDescription > enums , ILogger logger )
156156 {
157- using ( var sw = new StringWriter ( ) )
157+ using var sw = new StringWriter ( ) ;
158+ using var iw = new IndentedTextWriter ( sw , "\t " ) ;
159+
160+ iw . WriteLine ( $ "// Created with { Constants . ApplicationName } { Constants . ApplicationVersion } by { Constants . Author } ") ;
161+ iw . WriteLine ( ) ;
162+
163+ using ( var en = enums . GetEnumerator ( ) )
158164 {
159- using ( var iw = new IndentedTextWriter ( sw , " \t " ) )
165+ if ( en . MoveNext ( ) )
160166 {
161- iw . WriteLine ( $ "// Created with { Constants . ApplicationName } { Constants . ApplicationVersion } by { Constants . Author } ") ;
162- iw . WriteLine ( ) ;
167+ WriteEnum ( iw , en . Current ) ;
163168
164- using ( var en = enums . GetEnumerator ( ) )
169+ while ( en . MoveNext ( ) )
165170 {
166- if ( en . MoveNext ( ) )
167- {
168- WriteEnum ( iw , en . Current ) ;
171+ iw . WriteLine ( ) ;
169172
170- while ( en . MoveNext ( ) )
171- {
172- iw . WriteLine ( ) ;
173+ WriteEnum ( iw , en . Current ) ;
174+ }
173175
174- WriteEnum ( iw , en . Current ) ;
175- }
176+ iw . WriteLine ( ) ;
177+ }
178+ }
176179
177- iw . WriteLine ( ) ;
178- }
179- }
180+ var alreadySeen = new HashSet < ClassNode > ( ) ;
180181
181- var alreadySeen = new HashSet < ClassNode > ( ) ;
182+ IEnumerable < ClassNode > GetReversedClassHierarchy ( ClassNode node )
183+ {
184+ Contract . Requires ( node != null ) ;
185+ Contract . Ensures ( Contract . Result < IEnumerable < ClassNode > > ( ) != null ) ;
182186
183- IEnumerable < ClassNode > GetReversedClassHierarchy ( ClassNode node )
184- {
185- Contract . Requires ( node != null ) ;
186- Contract . Ensures ( Contract . Result < IEnumerable < ClassNode > > ( ) != null ) ;
187+ if ( ! alreadySeen . Add ( node ) )
188+ {
189+ return Enumerable . Empty < ClassNode > ( ) ;
190+ }
187191
188- if ( ! alreadySeen . Add ( node ) )
189- {
190- return Enumerable . Empty < ClassNode > ( ) ;
191- }
192+ var classNodes = node . Nodes
193+ . OfType < BaseWrapperNode > ( )
194+ . Where ( w => ! w . IsNodePresentInChain < PointerNode > ( ) ) // Pointers are forward declared
195+ . Select ( w => w . ResolveMostInnerNode ( ) as ClassNode )
196+ . Where ( n => n != null ) ;
192197
193- var classNodes = node . Nodes
194- . OfType < BaseWrapperNode > ( )
195- . Where ( w => ! w . IsNodePresentInChain < PointerNode > ( ) ) // Pointers are forward declared
196- . Select ( w => w . ResolveMostInnerNode ( ) as ClassNode )
197- . Where ( n => n != null ) ;
198+ return classNodes
199+ . SelectMany ( GetReversedClassHierarchy )
200+ . Append ( node ) ;
201+ }
198202
199- return classNodes
200- . SelectMany ( GetReversedClassHierarchy )
201- . Append ( node ) ;
202- }
203+ var classesToWrite = classes
204+ . Where ( c => c . Nodes . None ( n => n is FunctionNode ) ) // Skip class which contains FunctionNodes because these are not data classes.
205+ . SelectMany ( GetReversedClassHierarchy ) // Order the classes by their use hierarchy.
206+ . Distinct ( ) ;
203207
204- var classesToWrite = classes
205- . Where ( c => c . Nodes . None ( n => n is FunctionNode ) ) // Skip class which contains FunctionNodes because these are not data classes.
206- . SelectMany ( GetReversedClassHierarchy ) // Order the classes by their use hierarchy.
207- . Distinct ( ) ;
208+ using ( var en = classesToWrite . GetEnumerator ( ) )
209+ {
210+ if ( en . MoveNext ( ) )
211+ {
212+ WriteClass ( iw , en . Current , classes , logger ) ;
208213
209- using ( var en = classesToWrite . GetEnumerator ( ) )
214+ while ( en . MoveNext ( ) )
210215 {
211- if ( en . MoveNext ( ) )
212- {
213- WriteClass ( iw , en . Current , classes , logger ) ;
214-
215- while ( en . MoveNext ( ) )
216- {
217- iw . WriteLine ( ) ;
216+ iw . WriteLine ( ) ;
218217
219- WriteClass ( iw , en . Current , classes , logger ) ;
220- }
221- }
218+ WriteClass ( iw , en . Current , classes , logger ) ;
222219 }
223220 }
224-
225- return sw . ToString ( ) ;
226221 }
222+
223+ return sw . ToString ( ) ;
227224 }
228225
229226 /// <summary>
@@ -366,7 +363,7 @@ private void WriteNodes(IndentedTextWriter writer, IEnumerable<BaseNode> nodes,
366363 var fill = 0 ;
367364 var fillStart = 0 ;
368365
369- BaseNode CreatePaddingMember ( int offset , int count )
366+ static BaseNode CreatePaddingMember ( int offset , int count )
370367 {
371368 var node = new ArrayNode
372369 {
@@ -496,7 +493,7 @@ private static BaseNode TransformNode(BaseNode node)
496493 return custom . TransformNode ( node ) ;
497494 }
498495
499- BaseNode GetCharacterNodeForEncoding ( Encoding encoding )
496+ static BaseNode GetCharacterNodeForEncoding ( Encoding encoding )
500497 {
501498 if ( encoding . IsSameCodePage ( Encoding . Unicode ) )
502499 {
@@ -509,35 +506,35 @@ BaseNode GetCharacterNodeForEncoding(Encoding encoding)
509506 return new Utf8CharacterNode ( ) ;
510507 }
511508
512- if ( node is BaseTextNode textNode )
513- {
514- var arrayNode = new ArrayNode { Count = textNode . Length } ;
515- arrayNode . CopyFromNode ( node ) ;
516- arrayNode . ChangeInnerNode ( GetCharacterNodeForEncoding ( textNode . Encoding ) ) ;
517- return arrayNode ;
518- }
519-
520- if ( node is BaseTextPtrNode textPtrNode )
521- {
522- var pointerNode = new PointerNode ( ) ;
523- pointerNode . CopyFromNode ( node ) ;
524- pointerNode . ChangeInnerNode ( GetCharacterNodeForEncoding ( textPtrNode . Encoding ) ) ;
525- return pointerNode ;
526- }
527-
528- if ( node is BitFieldNode bitFieldNode )
529- {
530- var underlayingNode = bitFieldNode . GetUnderlayingNode ( ) ;
531- underlayingNode . CopyFromNode ( node ) ;
532- return underlayingNode ;
533- }
534-
535- if ( node is BaseHexNode hexNode )
509+ switch ( node )
536510 {
537- var arrayNode = new ArrayNode { Count = hexNode . MemorySize } ;
538- arrayNode . CopyFromNode ( node ) ;
539- arrayNode . ChangeInnerNode ( new Utf8CharacterNode ( ) ) ;
540- return arrayNode ;
511+ case BaseTextNode textNode :
512+ {
513+ var arrayNode = new ArrayNode { Count = textNode . Length } ;
514+ arrayNode . CopyFromNode ( node ) ;
515+ arrayNode . ChangeInnerNode ( GetCharacterNodeForEncoding ( textNode . Encoding ) ) ;
516+ return arrayNode ;
517+ }
518+ case BaseTextPtrNode textPtrNode :
519+ {
520+ var pointerNode = new PointerNode ( ) ;
521+ pointerNode . CopyFromNode ( node ) ;
522+ pointerNode . ChangeInnerNode ( GetCharacterNodeForEncoding ( textPtrNode . Encoding ) ) ;
523+ return pointerNode ;
524+ }
525+ case BitFieldNode bitFieldNode :
526+ {
527+ var underlayingNode = bitFieldNode . GetUnderlayingNode ( ) ;
528+ underlayingNode . CopyFromNode ( node ) ;
529+ return underlayingNode ;
530+ }
531+ case BaseHexNode hexNode :
532+ {
533+ var arrayNode = new ArrayNode { Count = hexNode . MemorySize } ;
534+ arrayNode . CopyFromNode ( node ) ;
535+ arrayNode . ChangeInnerNode ( new Utf8CharacterNode ( ) ) ;
536+ return arrayNode ;
537+ }
541538 }
542539
543540 return node ;
@@ -564,13 +561,12 @@ private string GetTypeDefinition(BaseNode node, ILogger logger)
564561 return type ;
565562 }
566563
567- if ( node is ClassInstanceNode classInstanceNode )
568- {
569- return $ "class { classInstanceNode . InnerNode . Name } ";
570- }
571- if ( node is EnumNode enumNode )
564+ switch ( node )
572565 {
573- return enumNode . Enum . Name ;
566+ case ClassInstanceNode classInstanceNode :
567+ return $ "class { classInstanceNode . InnerNode . Name } ";
568+ case EnumNode enumNode :
569+ return enumNode . Enum . Name ;
574570 }
575571
576572 return null ;
0 commit comments