@@ -316,7 +316,8 @@ trait ItemTemplate<'a, 'cx: 'a>: rinja::Template + fmt::Display {
316316fn item_module ( w : & mut Buffer , cx : & mut Context < ' _ > , item : & clean:: Item , items : & [ clean:: Item ] ) {
317317 write ! ( w, "{}" , document( cx, item, None , HeadingOffset :: H2 ) ) ;
318318
319- let mut indices = ( 0 ..items. len ( ) ) . filter ( |i| !items[ * i] . is_stripped ( ) ) . collect :: < Vec < usize > > ( ) ;
319+ let mut not_stripped_items =
320+ items. iter ( ) . filter ( |i| !i. is_stripped ( ) ) . enumerate ( ) . collect :: < Vec < _ > > ( ) ;
320321
321322 // the order of item types in the listing
322323 fn reorder ( ty : ItemType ) -> u8 {
@@ -338,37 +339,30 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items:
338339 }
339340 }
340341
341- fn cmp (
342- i1 : & clean:: Item ,
343- i2 : & clean:: Item ,
344- idx1 : usize ,
345- idx2 : usize ,
346- tcx : TyCtxt < ' _ > ,
347- ) -> Ordering {
342+ fn cmp ( i1 : & clean:: Item , i2 : & clean:: Item , tcx : TyCtxt < ' _ > ) -> Ordering {
348343 let ty1 = i1. type_ ( ) ;
349344 let ty2 = i2. type_ ( ) ;
350- if item_ty_to_section ( ty1) != item_ty_to_section ( ty2)
351- || ( ty1 != ty2 && ( ty1 == ItemType :: ExternCrate || ty2 == ItemType :: ExternCrate ) )
352- {
353- return ( reorder ( ty1) , idx1) . cmp ( & ( reorder ( ty2) , idx2) ) ;
354- }
355- let s1 = i1. stability ( tcx) . as_ref ( ) . map ( |s| s. level ) ;
356- let s2 = i2. stability ( tcx) . as_ref ( ) . map ( |s| s. level ) ;
357- if let ( Some ( a) , Some ( b) ) = ( s1, s2) {
358- match ( a. is_stable ( ) , b. is_stable ( ) ) {
359- ( true , true ) | ( false , false ) => { }
360- ( false , true ) => return Ordering :: Greater ,
361- ( true , false ) => return Ordering :: Less ,
345+ if ty1 != ty2 {
346+ return reorder ( ty1) . cmp ( & reorder ( ty2) ) ;
347+ }
348+ let is_stable1 = i1. stability ( tcx) . as_ref ( ) . map ( |s| s. level . is_stable ( ) ) . unwrap_or ( true ) ;
349+ let is_stable2 = i2. stability ( tcx) . as_ref ( ) . map ( |s| s. level . is_stable ( ) ) . unwrap_or ( true ) ;
350+ if is_stable1 != is_stable2 {
351+ if !is_stable1 {
352+ return Ordering :: Greater ;
362353 }
354+ return Ordering :: Less ;
363355 }
364356 let lhs = i1. name . unwrap_or ( kw:: Empty ) ;
365357 let rhs = i2. name . unwrap_or ( kw:: Empty ) ;
366358 compare_names ( lhs. as_str ( ) , rhs. as_str ( ) )
367359 }
368360
361+ let tcx = cx. tcx ( ) ;
362+
369363 match cx. shared . module_sorting {
370364 ModuleSorting :: Alphabetical => {
371- indices . sort_by ( |& i1 , & i2 | cmp ( & items [ i1 ] , & items [ i2 ] , i1 , i2 , cx . tcx ( ) ) ) ;
365+ not_stripped_items . sort_by ( |( _ , i1 ) , ( _ , i2 ) | cmp ( i1 , i2 , tcx) ) ;
372366 }
373367 ModuleSorting :: DeclarationOrder => { }
374368 }
@@ -391,24 +385,19 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items:
391385 // can be identical even if the elements are different (mostly in imports).
392386 // So in case this is an import, we keep everything by adding a "unique id"
393387 // (which is the position in the vector).
394- indices . dedup_by_key ( |i | {
388+ not_stripped_items . dedup_by_key ( |( idx , i ) | {
395389 (
396- items [ * i ] . item_id ,
397- if items [ * i ] . name . is_some ( ) { Some ( full_path ( cx, & items [ * i ] ) ) } else { None } ,
398- items [ * i ] . type_ ( ) ,
399- if items [ * i ] . is_import ( ) { * i } else { 0 } ,
390+ i . item_id ,
391+ if i . name . is_some ( ) { Some ( full_path ( cx, i ) ) } else { None } ,
392+ i . type_ ( ) ,
393+ if i . is_import ( ) { * idx } else { 0 } ,
400394 )
401395 } ) ;
402396
403- debug ! ( "{indices :?}" ) ;
397+ debug ! ( "{not_stripped_items :?}" ) ;
404398 let mut last_section = None ;
405399
406- for & idx in & indices {
407- let myitem = & items[ idx] ;
408- if myitem. is_stripped ( ) {
409- continue ;
410- }
411-
400+ for ( _, myitem) in & not_stripped_items {
412401 let my_section = item_ty_to_section ( myitem. type_ ( ) ) ;
413402 if Some ( my_section) != last_section {
414403 if last_section. is_some ( ) {
@@ -424,7 +413,6 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items:
424413 ) ;
425414 }
426415
427- let tcx = cx. tcx ( ) ;
428416 match * myitem. kind {
429417 clean:: ExternCrateItem { ref src } => {
430418 use crate :: html:: format:: anchor;
@@ -453,7 +441,7 @@ fn item_module(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Item, items:
453441 let stab_tags = if let Some ( import_def_id) = import. source . did {
454442 // Just need an item with the correct def_id and attrs
455443 let import_item =
456- clean:: Item { item_id : import_def_id. into ( ) , ..myitem. clone ( ) } ;
444+ clean:: Item { item_id : import_def_id. into ( ) , ..( * myitem) . clone ( ) } ;
457445
458446 let stab_tags = Some ( extra_info_tags ( & import_item, item, tcx) . to_string ( ) ) ;
459447 stab_tags
@@ -2036,14 +2024,15 @@ pub(crate) fn compare_names(mut lhs: &str, mut rhs: &str) -> Ordering {
20362024 x => return x,
20372025 }
20382026 }
2039- // Then process the numeric part again, but this time as strings.
2040- match lb. cmp ( rb) {
2041- Ordering :: Equal => ( ) ,
2042- x => return x,
2043- }
20442027 }
20452028
2046- Ordering :: Equal
2029+ if lhs. is_empty ( ) && rhs. is_empty ( ) {
2030+ Ordering :: Equal
2031+ } else if lhs. is_empty ( ) {
2032+ Ordering :: Less
2033+ } else {
2034+ Ordering :: Greater
2035+ }
20472036}
20482037
20492038pub ( super ) fn full_path ( cx : & Context < ' _ > , item : & clean:: Item ) -> String {
0 commit comments