@@ -3,9 +3,9 @@ mod serde;
33
44use std:: collections:: BTreeSet ;
55use std:: collections:: hash_map:: Entry ;
6- use std:: io;
76use std:: path:: Path ;
87use std:: string:: FromUtf8Error ;
8+ use std:: { io, iter} ;
99
1010use :: serde:: de:: { self , Deserializer , Error as _} ;
1111use :: serde:: ser:: { SerializeSeq , Serializer } ;
@@ -256,10 +256,14 @@ impl SerializedSearchIndex {
256256 /// The returned ID can be used to attach more data to the search result.
257257 fn add_entry ( & mut self , name : Symbol , entry_data : EntryData , desc : String ) -> usize {
258258 let fqp = if let Some ( module_path_index) = entry_data. module_path {
259- let mut fqp = self . path_data [ module_path_index] . as_ref ( ) . unwrap ( ) . module_path . clone ( ) ;
260- fqp. push ( Symbol :: intern ( & self . names [ module_path_index] ) ) ;
261- fqp. push ( name) ;
262- fqp
259+ self . path_data [ module_path_index]
260+ . as_ref ( )
261+ . unwrap ( )
262+ . module_path
263+ . iter ( )
264+ . copied ( )
265+ . chain ( [ Symbol :: intern ( & self . names [ module_path_index] ) , name] )
266+ . collect ( )
263267 } else {
264268 vec ! [ name]
265269 } ;
@@ -306,13 +310,13 @@ impl SerializedSearchIndex {
306310
307311 pub ( crate ) fn union ( mut self , other : & SerializedSearchIndex ) -> SerializedSearchIndex {
308312 let other_entryid_offset = self . names . len ( ) ;
309- let mut map_other_pathid_to_self_pathid: Vec < usize > = Vec :: new ( ) ;
313+ let mut map_other_pathid_to_self_pathid = Vec :: with_capacity ( other . path_data . len ( ) ) ;
310314 let mut skips = FxHashSet :: default ( ) ;
311315 for ( other_pathid, other_path_data) in other. path_data . iter ( ) . enumerate ( ) {
312316 if let Some ( other_path_data) = other_path_data {
313- let mut fqp = other_path_data. module_path . clone ( ) ;
314317 let name = Symbol :: intern ( & other. names [ other_pathid] ) ;
315- fqp. push ( name) ;
318+ let fqp =
319+ other_path_data. module_path . iter ( ) . copied ( ) . chain ( iter:: once ( name) ) . collect ( ) ;
316320 let self_pathid = other_entryid_offset + other_pathid;
317321 let self_pathid = match self . crate_paths_index . entry ( ( other_path_data. ty , fqp) ) {
318322 Entry :: Vacant ( slot) => {
@@ -458,7 +462,7 @@ impl SerializedSearchIndex {
458462 other. descs [ other_entryid] . clone ( ) ,
459463 other. function_data [ other_entryid] . clone ( ) . map ( |mut func| {
460464 fn map_fn_sig_item (
461- map_other_pathid_to_self_pathid : & mut Vec < usize > ,
465+ map_other_pathid_to_self_pathid : & Vec < usize > ,
462466 ty : & mut RenderType ,
463467 ) {
464468 match ty. id {
@@ -501,14 +505,14 @@ impl SerializedSearchIndex {
501505 }
502506 }
503507 for input in & mut func. inputs {
504- map_fn_sig_item ( & mut map_other_pathid_to_self_pathid, input) ;
508+ map_fn_sig_item ( & map_other_pathid_to_self_pathid, input) ;
505509 }
506510 for output in & mut func. output {
507- map_fn_sig_item ( & mut map_other_pathid_to_self_pathid, output) ;
511+ map_fn_sig_item ( & map_other_pathid_to_self_pathid, output) ;
508512 }
509513 for clause in & mut func. where_clause {
510514 for entry in clause {
511- map_fn_sig_item ( & mut map_other_pathid_to_self_pathid, entry) ;
515+ map_fn_sig_item ( & map_other_pathid_to_self_pathid, entry) ;
512516 }
513517 }
514518 func
@@ -559,14 +563,9 @@ impl SerializedSearchIndex {
559563 for ( size, other_list) in other_generic_inverted_index. iter ( ) . enumerate ( ) {
560564 let self_generic_inverted_index = match self . generic_inverted_index . get_mut ( i) {
561565 Some ( self_generic_inverted_index) => self_generic_inverted_index,
562- None => {
563- self . generic_inverted_index . push ( Vec :: new ( ) ) ;
564- self . generic_inverted_index . last_mut ( ) . unwrap ( )
565- }
566+ None => self . generic_inverted_index . push_mut ( Vec :: new ( ) ) ,
566567 } ;
567- while self_generic_inverted_index. len ( ) <= size {
568- self_generic_inverted_index. push ( Vec :: new ( ) ) ;
569- }
568+ self_generic_inverted_index. resize ( size, Vec :: new ( ) ) ;
570569 self_generic_inverted_index[ size] . extend (
571570 other_list
572571 . iter ( )
@@ -1819,20 +1818,23 @@ pub(crate) fn build_index(
18191818 tcx,
18201819 ) ;
18211820 }
1822- let mut used_in_constraints = Vec :: new ( ) ;
1823- for constraint in & mut search_type. where_clause {
1824- let mut used_in_constraint = BTreeSet :: new ( ) ;
1825- for trait_ in & mut constraint[ ..] {
1826- convert_render_type (
1827- trait_,
1828- cache,
1829- & mut serialized_index,
1830- & mut used_in_constraint,
1831- tcx,
1832- ) ;
1833- }
1834- used_in_constraints. push ( used_in_constraint) ;
1835- }
1821+ let used_in_constraints = search_type
1822+ . where_clause
1823+ . iter_mut ( )
1824+ . map ( |constraint| {
1825+ let mut used_in_constraint = BTreeSet :: new ( ) ;
1826+ for trait_ in constraint {
1827+ convert_render_type (
1828+ trait_,
1829+ cache,
1830+ & mut serialized_index,
1831+ & mut used_in_constraint,
1832+ tcx,
1833+ ) ;
1834+ }
1835+ used_in_constraint
1836+ } )
1837+ . collect :: < Vec < _ > > ( ) ;
18361838 loop {
18371839 let mut inserted_any = false ;
18381840 for ( i, used_in_constraint) in used_in_constraints. iter ( ) . enumerate ( ) {
@@ -1873,16 +1875,14 @@ pub(crate) fn build_index(
18731875 . inverted_function_inputs_index
18741876 } else {
18751877 let generic_id = usize:: try_from ( -index) . unwrap ( ) - 1 ;
1876- for _ in serialized_index. generic_inverted_index . len ( ) ..=generic_id {
1877- serialized_index. generic_inverted_index . push ( Vec :: new ( ) ) ;
1878- }
1878+ serialized_index. generic_inverted_index . resize ( generic_id, Vec :: new ( ) ) ;
18791879 & mut serialized_index. generic_inverted_index [ generic_id]
18801880 } ;
1881- while postings . len ( ) <= search_type_size {
1882- postings. push ( Vec :: new ( ) ) ;
1883- }
1884- if postings [ search_type_size ] . last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1885- postings [ search_type_size ] . push ( new_entry_id as u32 ) ;
1881+ // FIXME(yotamofek): last item should have capacity of 1
1882+ postings. resize ( search_type_size , Vec :: new ( ) ) ;
1883+ let posting = & mut postings [ search_type_size ] ;
1884+ if posting . last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1885+ posting . push ( new_entry_id as u32 ) ;
18861886 }
18871887 }
18881888 for index in used_in_function_output {
@@ -1899,11 +1899,11 @@ pub(crate) fn build_index(
18991899 }
19001900 & mut serialized_index. generic_inverted_index [ generic_id]
19011901 } ;
1902- while postings . len ( ) <= search_type_size {
1903- postings. push ( Vec :: new ( ) ) ;
1904- }
1905- if postings [ search_type_size ] . last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1906- postings [ search_type_size ] . push ( new_entry_id as u32 ) ;
1902+ // FIXME(yotamofek): last item should have capacity of 1
1903+ postings. resize ( search_type_size , Vec :: new ( ) ) ;
1904+ let posting = & mut postings [ search_type_size ] ;
1905+ if posting . last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1906+ posting . push ( new_entry_id as u32 ) ;
19071907 }
19081908 }
19091909 }
0 commit comments