@@ -1811,9 +1811,39 @@ void InitializeVTableFixups() {
1811
1811
void AddExportedTypes ( ) {
1812
1812
using var _ = errorContext . SetSource ( "exported types" ) ;
1813
1813
var exportedTypes = module . ExportedTypes ;
1814
- int count = exportedTypes . Count ;
1814
+
1815
+ var nestedTypeDict = new Dictionary < ExportedType , List < ExportedType > > ( ) ;
1816
+ for ( var i = 0 ; i < exportedTypes . Count ; i ++ ) {
1817
+ var exportedType = exportedTypes [ i ] ;
1818
+ if ( exportedType . Implementation is not ExportedType decl )
1819
+ continue ;
1820
+ if ( ! nestedTypeDict . TryGetValue ( decl , out var nestedTypes ) )
1821
+ nestedTypes = nestedTypeDict [ decl ] = new List < ExportedType > ( ) ;
1822
+ nestedTypes . Add ( exportedType ) ;
1823
+ }
1824
+
1825
+ var sortedTypes = new List < ExportedType > ( exportedTypes . Count ) ;
1826
+ var visited = new Dictionary < ExportedType , bool > ( ) ;
1827
+ var stack = new Stack < IEnumerator < ExportedType > > ( ) ;
1828
+ stack . Push ( exportedTypes . GetEnumerator ( ) ) ;
1829
+ while ( stack . Count > 0 ) {
1830
+ var enumerator = stack . Pop ( ) ;
1831
+ while ( enumerator . MoveNext ( ) ) {
1832
+ var type = enumerator . Current ;
1833
+ if ( visited . ContainsKey ( type ) )
1834
+ continue ;
1835
+ visited [ type ] = true ;
1836
+ sortedTypes . Add ( type ) ;
1837
+ if ( nestedTypeDict . TryGetValue ( type , out var nested ) && nested . Count > 0 ) {
1838
+ stack . Push ( enumerator ) ;
1839
+ enumerator = nested . GetEnumerator ( ) ;
1840
+ }
1841
+ }
1842
+ }
1843
+
1844
+ int count = sortedTypes . Count ;
1815
1845
for ( int i = 0 ; i < count ; i ++ )
1816
- AddExportedType ( exportedTypes [ i ] ) ;
1846
+ AddExportedType ( sortedTypes [ i ] ) ;
1817
1847
}
1818
1848
1819
1849
/// <summary>
0 commit comments