@@ -1811,9 +1811,39 @@ void InitializeVTableFixups() {
18111811 void AddExportedTypes ( ) {
18121812 using var _ = errorContext . SetSource ( "exported types" ) ;
18131813 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 ;
18151845 for ( int i = 0 ; i < count ; i ++ )
1816- AddExportedType ( exportedTypes [ i ] ) ;
1846+ AddExportedType ( sortedTypes [ i ] ) ;
18171847 }
18181848
18191849 /// <summary>
0 commit comments