@@ -43,7 +43,23 @@ public override bool VisitClassDecl(Class @class)
4343 continue ;
4444
4545 ReplaceField ( @class , i , fieldType ) ;
46- ReplaceLayoutField ( @class , field , fieldType ) ;
46+ fieldType . Fields . Clear ( ) ;
47+ fieldType . ExplicitlyIgnore ( ) ;
48+ }
49+
50+ if ( @class . Layout == null )
51+ return true ;
52+
53+ for ( int i = @class . Layout . Fields . Count - 1 ; i >= 0 ; i -- )
54+ {
55+ LayoutField field = @class . Layout . Fields [ i ] ;
56+ Class fieldType ;
57+ if ( ! string . IsNullOrEmpty ( field . Name ) ||
58+ ! field . QualifiedType . Type . Desugar ( ) . TryGetClass ( out fieldType ) ||
59+ ! string . IsNullOrEmpty ( fieldType . OriginalName ) )
60+ continue ;
61+
62+ ReplaceLayoutField ( @class , i , fieldType ) ;
4763 fieldType . Fields . Clear ( ) ;
4864 fieldType . ExplicitlyIgnore ( ) ;
4965 }
@@ -63,18 +79,23 @@ private static void ReplaceField(Class @class, int i, Class fieldType)
6379 }
6480 }
6581
66- private static void ReplaceLayoutField ( Class @class , Field field , Class fieldType )
82+ private static void ReplaceLayoutField ( Class @class , int i , Class fieldType )
6783 {
68- LayoutField layoutField = @class . Layout . Fields . Find (
69- f => f . FieldPtr == field . OriginalPtr ) ;
70- int layoutIndex = @class . Layout . Fields . IndexOf ( layoutField ) ;
71- @class . Layout . Fields . RemoveAt ( layoutIndex ) ;
84+ uint offset = @class . Layout . Fields [ i ] . Offset ;
85+ @class . Layout . Fields . RemoveAt ( i ) ;
7286
7387 for ( int j = 0 ; j < fieldType . Layout . Fields . Count ; j ++ )
7488 {
75- LayoutField nestedlayoutField = fieldType . Layout . Fields [ j ] ;
76- nestedlayoutField . Offset += layoutField . Offset ;
77- @class . Layout . Fields . Insert ( layoutIndex + j , nestedlayoutField ) ;
89+ LayoutField nestedLayoutField = fieldType . Layout . Fields [ j ] ;
90+ var layoutField = new LayoutField
91+ {
92+ Expression = nestedLayoutField . Expression ,
93+ FieldPtr = nestedLayoutField . FieldPtr ,
94+ Name = nestedLayoutField . Name ,
95+ Offset = nestedLayoutField . Offset + offset ,
96+ QualifiedType = nestedLayoutField . QualifiedType
97+ } ;
98+ @class . Layout . Fields . Insert ( i + j , layoutField ) ;
7899 }
79100 }
80101 }
0 commit comments