@@ -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) => {
@@ -559,13 +563,10 @@ 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 ( ) ) ;
568+ if self_generic_inverted_index. len ( ) <= size {
569+ self_generic_inverted_index. resize ( size + 1 , Vec :: new ( ) ) ;
569570 }
570571 self_generic_inverted_index[ size] . extend (
571572 other_list
@@ -1819,20 +1820,23 @@ pub(crate) fn build_index(
18191820 tcx,
18201821 ) ;
18211822 }
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- }
1823+ let used_in_constraints = search_type
1824+ . where_clause
1825+ . iter_mut ( )
1826+ . map ( |constraint| {
1827+ let mut used_in_constraint = BTreeSet :: new ( ) ;
1828+ for trait_ in constraint {
1829+ convert_render_type (
1830+ trait_,
1831+ cache,
1832+ & mut serialized_index,
1833+ & mut used_in_constraint,
1834+ tcx,
1835+ ) ;
1836+ }
1837+ used_in_constraint
1838+ } )
1839+ . collect :: < Vec < _ > > ( ) ;
18361840 loop {
18371841 let mut inserted_any = false ;
18381842 for ( i, used_in_constraint) in used_in_constraints. iter ( ) . enumerate ( ) {
@@ -1873,16 +1877,18 @@ pub(crate) fn build_index(
18731877 . inverted_function_inputs_index
18741878 } else {
18751879 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 ( ) ) ;
1880+ if serialized_index. generic_inverted_index . len ( ) <= generic_id {
1881+ serialized_index. generic_inverted_index . resize ( generic_id + 1 , Vec :: new ( ) ) ;
18781882 }
18791883 & mut serialized_index. generic_inverted_index [ generic_id]
18801884 } ;
1881- while postings. len ( ) <= search_type_size {
1882- postings. push ( Vec :: new ( ) ) ;
1885+ if postings. len ( ) <= search_type_size {
1886+ // FIXME(yotamofek): last item should have capacity of 1
1887+ postings. resize ( search_type_size + 1 , Vec :: new ( ) ) ;
18831888 }
1884- if postings[ search_type_size] . last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1885- postings[ search_type_size] . push ( new_entry_id as u32 ) ;
1889+ let posting = & mut postings[ search_type_size] ;
1890+ if posting. last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1891+ posting. push ( new_entry_id as u32 ) ;
18861892 }
18871893 }
18881894 for index in used_in_function_output {
@@ -1899,11 +1905,13 @@ pub(crate) fn build_index(
18991905 }
19001906 & mut serialized_index. generic_inverted_index [ generic_id]
19011907 } ;
1902- while postings. len ( ) <= search_type_size {
1903- postings. push ( Vec :: new ( ) ) ;
1908+ // FIXME(yotamofek): last item should have capacity of 1
1909+ if postings. len ( ) <= search_type_size {
1910+ postings. resize ( search_type_size + 1 , Vec :: new ( ) ) ;
19041911 }
1905- if postings[ search_type_size] . last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1906- postings[ search_type_size] . push ( new_entry_id as u32 ) ;
1912+ let posting = & mut postings[ search_type_size] ;
1913+ if posting. last ( ) != Some ( & ( new_entry_id as u32 ) ) {
1914+ posting. push ( new_entry_id as u32 ) ;
19071915 }
19081916 }
19091917 }
0 commit comments