11pub ( crate )  mod  encode; 
2+ mod  serde; 
23
34use  std:: collections:: BTreeSet ; 
45use  std:: collections:: hash_map:: Entry ; 
56use  std:: path:: Path ; 
67
8+ use  :: serde:: de:: { self ,  Deserializer ,  Error  as  _} ; 
9+ use  :: serde:: ser:: { SerializeSeq ,  Serializer } ; 
10+ use  :: serde:: { Deserialize ,  Serialize } ; 
711use  rustc_ast:: join_path_syms; 
812use  rustc_data_structures:: fx:: { FxHashMap ,  FxHashSet ,  FxIndexMap } ; 
913use  rustc_hir:: attrs:: AttributeKind ; 
@@ -12,9 +16,6 @@ use rustc_middle::ty::TyCtxt;
1216use  rustc_span:: def_id:: DefId ; 
1317use  rustc_span:: sym; 
1418use  rustc_span:: symbol:: { Symbol ,  kw} ; 
15- use  serde:: de:: { self ,  Deserializer ,  Error  as  _} ; 
16- use  serde:: ser:: { SerializeSeq ,  Serializer } ; 
17- use  serde:: { Deserialize ,  Serialize } ; 
1819use  stringdex:: internals as  stringdex_internals; 
1920use  thin_vec:: ThinVec ; 
2021use  tracing:: instrument; 
@@ -34,7 +35,7 @@ pub(crate) struct SerializedSearchIndex {
3435    path_data :  Vec < Option < PathData > > , 
3536    entry_data :  Vec < Option < EntryData > > , 
3637    descs :  Vec < String > , 
37-     function_data :  Vec < Option < FunctionData > > , 
38+     function_data :  Vec < Option < IndexItemFunctionType > > , 
3839    alias_pointers :  Vec < Option < usize > > , 
3940    // inverted index for concrete types and generics 
4041    type_data :  Vec < Option < TypeData > > , 
@@ -61,7 +62,7 @@ impl SerializedSearchIndex {
6162        let  mut  path_data:  Vec < Option < PathData > >  = Vec :: new ( ) ; 
6263        let  mut  entry_data:  Vec < Option < EntryData > >  = Vec :: new ( ) ; 
6364        let  mut  descs:  Vec < String >  = Vec :: new ( ) ; 
64-         let  mut  function_data:  Vec < Option < FunctionData > >  = Vec :: new ( ) ; 
65+         let  mut  function_data:  Vec < Option < IndexItemFunctionType > >  = Vec :: new ( ) ; 
6566        let  mut  type_data:  Vec < Option < TypeData > >  = Vec :: new ( ) ; 
6667        let  mut  alias_pointers:  Vec < Option < usize > >  = Vec :: new ( ) ; 
6768
@@ -207,7 +208,7 @@ impl SerializedSearchIndex {
207208        path_data :  Option < PathData > , 
208209        entry_data :  Option < EntryData > , 
209210        desc :  String , 
210-         function_data :  Option < FunctionData > , 
211+         function_data :  Option < IndexItemFunctionType > , 
211212        type_data :  Option < TypeData > , 
212213        alias_pointer :  Option < usize > , 
213214    )  -> usize  { 
@@ -446,73 +447,62 @@ impl SerializedSearchIndex {
446447                        ..other_entry_data. clone ( ) 
447448                    } ) , 
448449                    other. descs [ other_entryid] . clone ( ) , 
449-                     other. function_data [ other_entryid] . as_ref ( ) . map ( |function_data| FunctionData  { 
450-                         function_signature :  { 
451-                             let  ( mut  func,  _offset)  =
452-                                 IndexItemFunctionType :: read_from_string_without_param_names ( 
453-                                     function_data. function_signature . as_bytes ( ) , 
454-                                 ) ; 
455-                             fn  map_fn_sig_item ( 
456-                                 map_other_pathid_to_self_pathid :  & mut  Vec < usize > , 
457-                                 ty :  & mut  RenderType , 
458-                             )  { 
459-                                 match  ty. id  { 
460-                                     None  => { } 
461-                                     Some ( RenderTypeId :: Index ( generic) )  if  generic < 0  => { } 
462-                                     Some ( RenderTypeId :: Index ( id) )  => { 
463-                                         let  id = usize:: try_from ( id) . unwrap ( ) ; 
464-                                         let  id = map_other_pathid_to_self_pathid[ id] ; 
465-                                         assert ! ( id != !0 ) ; 
466-                                         ty. id  =
467-                                             Some ( RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) ) ; 
468-                                     } 
469-                                     _ => unreachable ! ( ) , 
450+                     other. function_data [ other_entryid] . clone ( ) . map ( |mut  func| { 
451+                         fn  map_fn_sig_item ( 
452+                             map_other_pathid_to_self_pathid :  & mut  Vec < usize > , 
453+                             ty :  & mut  RenderType , 
454+                         )  { 
455+                             match  ty. id  { 
456+                                 None  => { } 
457+                                 Some ( RenderTypeId :: Index ( generic) )  if  generic < 0  => { } 
458+                                 Some ( RenderTypeId :: Index ( id) )  => { 
459+                                     let  id = usize:: try_from ( id) . unwrap ( ) ; 
460+                                     let  id = map_other_pathid_to_self_pathid[ id] ; 
461+                                     assert ! ( id != !0 ) ; 
462+                                     ty. id  = Some ( RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) ) ; 
470463                                } 
471-                                 if  let  Some ( generics)  = & mut  ty. generics  { 
472-                                     for  generic in  generics { 
473-                                         map_fn_sig_item ( map_other_pathid_to_self_pathid,  generic) ; 
474-                                     } 
464+                                 _ => unreachable ! ( ) , 
465+                             } 
466+                             if  let  Some ( generics)  = & mut  ty. generics  { 
467+                                 for  generic in  generics { 
468+                                     map_fn_sig_item ( map_other_pathid_to_self_pathid,  generic) ; 
475469                                } 
476-                                 if  let  Some ( bindings)  = & mut  ty. bindings  { 
477-                                     for  ( param,  constraints)  in  bindings { 
478-                                         * param = match  * param { 
479-                                             param @ RenderTypeId :: Index ( generic)  if  generic < 0  => { 
480-                                                 param
481-                                             } 
482-                                             RenderTypeId :: Index ( id)  => { 
483-                                                 let  id = usize:: try_from ( id) . unwrap ( ) ; 
484-                                                 let  id = map_other_pathid_to_self_pathid[ id] ; 
485-                                                 assert ! ( id != !0 ) ; 
486-                                                 RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) 
487-                                             } 
488-                                             _ => unreachable ! ( ) , 
489-                                         } ; 
490-                                         for  constraint in  constraints { 
491-                                             map_fn_sig_item ( 
492-                                                 map_other_pathid_to_self_pathid, 
493-                                                 constraint, 
494-                                             ) ; 
470+                             } 
471+                             if  let  Some ( bindings)  = & mut  ty. bindings  { 
472+                                 for  ( param,  constraints)  in  bindings { 
473+                                     * param = match  * param { 
474+                                         param @ RenderTypeId :: Index ( generic)  if  generic < 0  => { 
475+                                             param
476+                                         } 
477+                                         RenderTypeId :: Index ( id)  => { 
478+                                             let  id = usize:: try_from ( id) . unwrap ( ) ; 
479+                                             let  id = map_other_pathid_to_self_pathid[ id] ; 
480+                                             assert ! ( id != !0 ) ; 
481+                                             RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) 
495482                                        } 
483+                                         _ => unreachable ! ( ) , 
484+                                     } ; 
485+                                     for  constraint in  constraints { 
486+                                         map_fn_sig_item ( 
487+                                             map_other_pathid_to_self_pathid, 
488+                                             constraint, 
489+                                         ) ; 
496490                                    } 
497491                                } 
498492                            } 
499-                              for  input  in   & mut  func . inputs   { 
500-                                  map_fn_sig_item ( & mut  map_other_pathid_to_self_pathid ,  input ) ; 
501-                             } 
502-                              for  output  in   & mut  func . output   { 
503-                                  map_fn_sig_item ( & mut  map_other_pathid_to_self_pathid ,   output) ; 
504-                             } 
505-                              for  clause  in   & mut  func . where_clause   { 
506-                                  for  entry  in  clause  { 
507-                                      map_fn_sig_item ( & mut  map_other_pathid_to_self_pathid ,  entry ) ; 
508-                                 } 
493+                         } 
494+                         for  input  in   & mut  func . inputs   { 
495+                             map_fn_sig_item ( & mut  map_other_pathid_to_self_pathid ,  input ) ; 
496+                         } 
497+                         for  output  in   & mut  func . output   { 
498+                             map_fn_sig_item ( & mut  map_other_pathid_to_self_pathid ,  output ) ; 
499+                         } 
500+                         for  clause  in  & mut  func . where_clause  { 
501+                             for  entry  in  clause  { 
502+                                 map_fn_sig_item ( & mut  map_other_pathid_to_self_pathid ,  entry ) ; 
509503                            } 
510-                             let  mut  result =
511-                                 String :: with_capacity ( function_data. function_signature . len ( ) ) ; 
512-                             func. write_to_string_without_param_names ( & mut  result) ; 
513-                             result
514-                         } , 
515-                         param_names :  function_data. param_names . clone ( ) , 
504+                         } 
505+                         func
516506                    } ) , 
517507                    other. type_data [ other_entryid] . as_ref ( ) . map ( |type_data| TypeData  { 
518508                        inverted_function_inputs_index :  type_data
@@ -626,69 +616,55 @@ impl SerializedSearchIndex {
626616                    } , 
627617                ) , 
628618                self . descs [ id] . clone ( ) , 
629-                 self . function_data [ id] . as_ref ( ) . map ( 
630-                     |FunctionData  {  function_signature,  param_names } | FunctionData  { 
631-                         function_signature :  { 
632-                             let  ( mut  func,  _offset)  =
633-                                 IndexItemFunctionType :: read_from_string_without_param_names ( 
634-                                     function_signature. as_bytes ( ) , 
635-                                 ) ; 
636-                             fn  map_fn_sig_item ( map :  & FxHashMap < usize ,  usize > ,  ty :  & mut  RenderType )  { 
637-                                 match  ty. id  { 
638-                                     None  => { } 
639-                                     Some ( RenderTypeId :: Index ( generic) )  if  generic < 0  => { } 
640-                                     Some ( RenderTypeId :: Index ( id) )  => { 
619+                 self . function_data [ id] . clone ( ) . map ( |mut  func| { 
620+                     fn  map_fn_sig_item ( map :  & FxHashMap < usize ,  usize > ,  ty :  & mut  RenderType )  { 
621+                         match  ty. id  { 
622+                             None  => { } 
623+                             Some ( RenderTypeId :: Index ( generic) )  if  generic < 0  => { } 
624+                             Some ( RenderTypeId :: Index ( id) )  => { 
625+                                 let  id = usize:: try_from ( id) . unwrap ( ) ; 
626+                                 let  id = * map. get ( & id) . unwrap ( ) ; 
627+                                 assert ! ( id != !0 ) ; 
628+                                 ty. id  = Some ( RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) ) ; 
629+                             } 
630+                             _ => unreachable ! ( ) , 
631+                         } 
632+                         if  let  Some ( generics)  = & mut  ty. generics  { 
633+                             for  generic in  generics { 
634+                                 map_fn_sig_item ( map,  generic) ; 
635+                             } 
636+                         } 
637+                         if  let  Some ( bindings)  = & mut  ty. bindings  { 
638+                             for  ( param,  constraints)  in  bindings { 
639+                                 * param = match  * param { 
640+                                     param @ RenderTypeId :: Index ( generic)  if  generic < 0  => param, 
641+                                     RenderTypeId :: Index ( id)  => { 
641642                                        let  id = usize:: try_from ( id) . unwrap ( ) ; 
642643                                        let  id = * map. get ( & id) . unwrap ( ) ; 
643644                                        assert ! ( id != !0 ) ; 
644-                                         ty. id  =
645-                                             Some ( RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) ) ; 
645+                                         RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) 
646646                                    } 
647647                                    _ => unreachable ! ( ) , 
648+                                 } ; 
649+                                 for  constraint in  constraints { 
650+                                     map_fn_sig_item ( map,  constraint) ; 
648651                                } 
649-                                 if  let  Some ( generics)  = & mut  ty. generics  { 
650-                                     for  generic in  generics { 
651-                                         map_fn_sig_item ( map,  generic) ; 
652-                                     } 
653-                                 } 
654-                                 if  let  Some ( bindings)  = & mut  ty. bindings  { 
655-                                     for  ( param,  constraints)  in  bindings { 
656-                                         * param = match  * param { 
657-                                             param @ RenderTypeId :: Index ( generic)  if  generic < 0  => { 
658-                                                 param
659-                                             } 
660-                                             RenderTypeId :: Index ( id)  => { 
661-                                                 let  id = usize:: try_from ( id) . unwrap ( ) ; 
662-                                                 let  id = * map. get ( & id) . unwrap ( ) ; 
663-                                                 assert ! ( id != !0 ) ; 
664-                                                 RenderTypeId :: Index ( isize:: try_from ( id) . unwrap ( ) ) 
665-                                             } 
666-                                             _ => unreachable ! ( ) , 
667-                                         } ; 
668-                                         for  constraint in  constraints { 
669-                                             map_fn_sig_item ( map,  constraint) ; 
670-                                         } 
671-                                     } 
672-                                 } 
673-                             } 
674-                             for  input in  & mut  func. inputs  { 
675-                                 map_fn_sig_item ( & map,  input) ; 
676-                             } 
677-                             for  output in  & mut  func. output  { 
678-                                 map_fn_sig_item ( & map,  output) ; 
679652                            } 
680-                             for  clause in  & mut  func. where_clause  { 
681-                                 for  entry in  clause { 
682-                                     map_fn_sig_item ( & map,  entry) ; 
683-                                 } 
684-                             } 
685-                             let  mut  result = String :: with_capacity ( function_signature. len ( ) ) ; 
686-                             func. write_to_string_without_param_names ( & mut  result) ; 
687-                             result
688-                         } , 
689-                         param_names :  param_names. clone ( ) , 
690-                     } , 
691-                 ) , 
653+                         } 
654+                     } 
655+                     for  input in  & mut  func. inputs  { 
656+                         map_fn_sig_item ( & map,  input) ; 
657+                     } 
658+                     for  output in  & mut  func. output  { 
659+                         map_fn_sig_item ( & map,  output) ; 
660+                     } 
661+                     for  clause in  & mut  func. where_clause  { 
662+                         for  entry in  clause { 
663+                             map_fn_sig_item ( & map,  entry) ; 
664+                         } 
665+                     } 
666+                     func
667+                 } ) , 
692668                self . type_data [ id] . as_ref ( ) . map ( 
693669                    |TypeData  { 
694670                         search_unbox, 
@@ -1259,48 +1235,6 @@ impl<'de> Deserialize<'de> for SerializedOptional32 {
12591235    } 
12601236} 
12611237
1262- #[ derive( Clone ,  Debug ) ]  
1263- pub  struct  FunctionData  { 
1264-     function_signature :  String , 
1265-     param_names :  Vec < String > , 
1266- } 
1267- 
1268- impl  Serialize  for  FunctionData  { 
1269-     fn  serialize < S > ( & self ,  serializer :  S )  -> Result < S :: Ok ,  S :: Error > 
1270-     where 
1271-         S :  Serializer , 
1272-     { 
1273-         let  mut  seq = serializer. serialize_seq ( None ) ?; 
1274-         seq. serialize_element ( & self . function_signature ) ?; 
1275-         seq. serialize_element ( & self . param_names ) ?; 
1276-         seq. end ( ) 
1277-     } 
1278- } 
1279- 
1280- impl < ' de >  Deserialize < ' de >  for  FunctionData  { 
1281-     fn  deserialize < D > ( deserializer :  D )  -> Result < FunctionData ,  D :: Error > 
1282-     where 
1283-         D :  Deserializer < ' de > , 
1284-     { 
1285-         struct  FunctionDataVisitor ; 
1286-         impl < ' de >  de:: Visitor < ' de >  for  FunctionDataVisitor  { 
1287-             type  Value  = FunctionData ; 
1288-             fn  expecting ( & self ,  formatter :  & mut  std:: fmt:: Formatter < ' _ > )  -> std:: fmt:: Result  { 
1289-                 write ! ( formatter,  "fn data" ) 
1290-             } 
1291-             fn  visit_seq < A :  de:: SeqAccess < ' de > > ( self ,  mut  v :  A )  -> Result < FunctionData ,  A :: Error >  { 
1292-                 let  function_signature:  String  = v
1293-                     . next_element ( ) ?
1294-                     . ok_or_else ( || A :: Error :: missing_field ( "function_signature" ) ) ?; 
1295-                 let  param_names:  Vec < String >  =
1296-                     v. next_element ( ) ?. ok_or_else ( || A :: Error :: missing_field ( "param_names" ) ) ?; 
1297-                 Ok ( FunctionData  {  function_signature,  param_names } ) 
1298-             } 
1299-         } 
1300-         deserializer. deserialize_any ( FunctionDataVisitor ) 
1301-     } 
1302- } 
1303- 
13041238/// Builds the search index from the collected metadata 
13051239pub ( crate )  fn  build_index ( 
13061240    krate :  & clean:: Crate , 
@@ -1927,18 +1861,7 @@ pub(crate) fn build_index(
19271861                // because the postings list has to fill in an empty array for each 
19281862                // unoccupied size. 
19291863                if  item. ty . is_fn_like ( )  {  0  }  else  {  16  } ; 
1930-             serialized_index. function_data [ new_entry_id]  = Some ( FunctionData  { 
1931-                 function_signature :  { 
1932-                     let  mut  function_signature = String :: new ( ) ; 
1933-                     search_type. write_to_string_without_param_names ( & mut  function_signature) ; 
1934-                     function_signature
1935-                 } , 
1936-                 param_names :  search_type
1937-                     . param_names 
1938-                     . iter ( ) 
1939-                     . map ( |sym| sym. map ( |sym| sym. to_string ( ) ) . unwrap_or ( String :: new ( ) ) ) 
1940-                     . collect :: < Vec < String > > ( ) , 
1941-             } ) ; 
1864+             serialized_index. function_data [ new_entry_id]  = Some ( search_type. clone ( ) ) ; 
19421865            for  index in  used_in_function_inputs { 
19431866                let  postings = if  index >= 0  { 
19441867                    assert ! ( serialized_index. path_data[ index as  usize ] . is_some( ) ) ; 
0 commit comments