@@ -484,21 +484,23 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
484484    /// Resolves a string as a path within a particular namespace. Returns an 
485485/// optional URL fragment in the case of variants and methods. 
486486fn  resolve < ' path > ( 
487-         & self , 
487+         & mut   self , 
488488        path_str :  & ' path  str , 
489489        ns :  Namespace , 
490490        module_id :  DefId , 
491491        extra_fragment :  & Option < String > , 
492492    )  -> Result < ( Res ,  Option < String > ) ,  ErrorKind < ' path > >  { 
493-         let  cx  = & self . cx ; 
493+         let  tcx  = self . cx . tcx ; 
494494
495495        if  let  Some ( res)  = self . resolve_path ( path_str,  ns,  module_id)  { 
496496            match  res { 
497497                // FIXME(#76467): make this fallthrough to lookup the associated 
498498                // item a separate function. 
499499                Res :: Def ( DefKind :: AssocFn  | DefKind :: AssocConst ,  _)  => assert_eq ! ( ns,  ValueNS ) , 
500500                Res :: Def ( DefKind :: AssocTy ,  _)  => assert_eq ! ( ns,  TypeNS ) , 
501-                 Res :: Def ( DefKind :: Variant ,  _)  => return  handle_variant ( cx,  res,  extra_fragment) , 
501+                 Res :: Def ( DefKind :: Variant ,  _)  => { 
502+                     return  handle_variant ( self . cx ,  res,  extra_fragment) ; 
503+                 } 
502504                // Not a trait item; just return what we found. 
503505                Res :: Primitive ( ty)  => { 
504506                    if  extra_fragment. is_some ( )  { 
@@ -565,13 +567,12 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
565567            )  => { 
566568                debug ! ( "looking for associated item named {} for item {:?}" ,  item_name,  did) ; 
567569                // Checks if item_name belongs to `impl SomeItem` 
568-                 let  assoc_item = cx
569-                     . tcx 
570+                 let  assoc_item = tcx
570571                    . inherent_impls ( did) 
571572                    . iter ( ) 
572573                    . flat_map ( |& imp| { 
573-                         cx . tcx . associated_items ( imp) . find_by_name_and_namespace ( 
574-                             cx . tcx , 
574+                         tcx. associated_items ( imp) . find_by_name_and_namespace ( 
575+                             tcx, 
575576                            Ident :: with_dummy_span ( item_name) , 
576577                            ns, 
577578                            imp, 
@@ -587,7 +588,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
587588                    // something like [`ambi_fn`](<SomeStruct as SomeTrait>::ambi_fn) 
588589                    . or_else ( || { 
589590                        let  kind =
590-                             resolve_associated_trait_item ( did,  module_id,  item_name,  ns,  & self . cx ) ; 
591+                             resolve_associated_trait_item ( did,  module_id,  item_name,  ns,  self . cx ) ; 
591592                        debug ! ( "got associated item kind {:?}" ,  kind) ; 
592593                        kind
593594                    } ) ; 
@@ -611,7 +612,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
611612                    debug ! ( "looking for variants or fields named {} for {:?}" ,  item_name,  did) ; 
612613                    // FIXME(jynelson): why is this different from 
613614                    // `variant_field`? 
614-                     match  cx . tcx . type_of ( did) . kind ( )  { 
615+                     match  tcx. type_of ( did) . kind ( )  { 
615616                        ty:: Adt ( def,  _)  => { 
616617                            let  field = if  def. is_enum ( )  { 
617618                                def. all_fields ( ) . find ( |item| item. ident . name  == item_name) 
@@ -652,10 +653,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
652653                    None 
653654                } 
654655            } 
655-             Res :: Def ( DefKind :: Trait ,  did)  => cx
656-                 . tcx 
656+             Res :: Def ( DefKind :: Trait ,  did)  => tcx
657657                . associated_items ( did) 
658-                 . find_by_name_and_namespace ( cx . tcx ,  Ident :: with_dummy_span ( item_name) ,  ns,  did) 
658+                 . find_by_name_and_namespace ( tcx,  Ident :: with_dummy_span ( item_name) ,  ns,  did) 
659659                . map ( |item| { 
660660                    let  kind = match  item. kind  { 
661661                        ty:: AssocKind :: Const  => "associatedconstant" , 
@@ -699,7 +699,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
699699/// This returns the `Res` even if it was erroneous for some reason 
700700/// (such as having invalid URL fragments or being in the wrong namespace). 
701701fn  check_full_res ( 
702-         & self , 
702+         & mut   self , 
703703        ns :  Namespace , 
704704        path_str :  & str , 
705705        module_id :  DefId , 
@@ -733,7 +733,7 @@ fn resolve_associated_trait_item(
733733    module :  DefId , 
734734    item_name :  Symbol , 
735735    ns :  Namespace , 
736-     cx :  & DocContext < ' _ > , 
736+     cx :  & mut   DocContext < ' _ > , 
737737)  -> Option < ( ty:: AssocKind ,  DefId ) >  { 
738738    // FIXME: this should also consider blanket impls (`impl<T> X for T`). Unfortunately 
739739    // `get_auto_trait_and_blanket_impls` is broken because the caching behavior is wrong. In the 
@@ -758,10 +758,10 @@ fn resolve_associated_trait_item(
758758/// 
759759/// NOTE: this cannot be a query because more traits could be available when more crates are compiled! 
760760/// So it is not stable to serialize cross-crate. 
761- fn  traits_implemented_by ( cx :  & DocContext < ' _ > ,  type_ :  DefId ,  module :  DefId )  -> FxHashSet < DefId >  { 
762-     let  mut  cache  = cx. module_trait_cache . borrow_mut ( ) ; 
763-     let  in_scope_traits = cache . entry ( module) . or_insert_with ( || { 
764-         cx . enter_resolver ( |resolver| { 
761+ fn  traits_implemented_by ( cx :  & mut   DocContext < ' _ > ,  type_ :  DefId ,  module :  DefId )  -> FxHashSet < DefId >  { 
762+     let  mut  resolver  = cx. resolver . borrow_mut ( ) ; 
763+     let  in_scope_traits = cx . module_trait_cache . entry ( module) . or_insert_with ( || { 
764+         resolver . access ( |resolver| { 
765765            let  parent_scope = & ParentScope :: module ( resolver. get_module ( module) ,  resolver) ; 
766766            resolver
767767                . traits_in_scope ( None ,  parent_scope,  SyntaxContext :: root ( ) ,  None ) 
@@ -771,13 +771,14 @@ fn traits_implemented_by(cx: &DocContext<'_>, type_: DefId, module: DefId) -> Fx
771771        } ) 
772772    } ) ; 
773773
774-     let  ty = cx. tcx . type_of ( type_) ; 
774+     let  tcx = cx. tcx ; 
775+     let  ty = tcx. type_of ( type_) ; 
775776    let  iter = in_scope_traits. iter ( ) . flat_map ( |& trait_| { 
776777        trace ! ( "considering explicit impl for trait {:?}" ,  trait_) ; 
777778
778779        // Look at each trait implementation to see if it's an impl for `did` 
779-         cx . tcx . find_map_relevant_impl ( trait_,  ty,  |impl_| { 
780-             let  trait_ref = cx . tcx . impl_trait_ref ( impl_) . expect ( "this is not an inherent impl" ) ; 
780+         tcx. find_map_relevant_impl ( trait_,  ty,  |impl_| { 
781+             let  trait_ref = tcx. impl_trait_ref ( impl_) . expect ( "this is not an inherent impl" ) ; 
781782            // Check if these are the same type. 
782783            let  impl_type = trait_ref. self_ty ( ) ; 
783784            trace ! ( 
@@ -1146,7 +1147,7 @@ impl LinkCollector<'_, '_> {
11461147                suggest_disambiguator ( resolved,  diag,  path_str,  dox,  sp,  & ori_link. range ) ; 
11471148            } ; 
11481149            report_diagnostic ( 
1149-                 self . cx , 
1150+                 self . cx . tcx , 
11501151                BROKEN_INTRA_DOC_LINKS , 
11511152                & msg, 
11521153                & item, 
@@ -1220,7 +1221,7 @@ impl LinkCollector<'_, '_> {
12201221                        && !self . cx . tcx . features ( ) . intra_doc_pointers 
12211222                    { 
12221223                        let  span = super :: source_span_for_markdown_range ( 
1223-                             self . cx , 
1224+                             self . cx . tcx , 
12241225                            dox, 
12251226                            & ori_link. range , 
12261227                            & item. attrs , 
@@ -1308,7 +1309,7 @@ impl LinkCollector<'_, '_> {
13081309    /// After parsing the disambiguator, resolve the main part of the link. 
13091310// FIXME(jynelson): wow this is just so much 
13101311    fn  resolve_with_disambiguator ( 
1311-         & self , 
1312+         & mut   self , 
13121313        key :  & ResolutionInfo , 
13131314        diag :  DiagnosticInfo < ' _ > , 
13141315    )  -> Option < ( Res ,  Option < String > ) >  { 
@@ -1674,15 +1675,15 @@ impl Suggestion {
16741675/// parameter of the callback will contain it, and the primary span of the diagnostic will be set 
16751676/// to it. 
16761677fn  report_diagnostic ( 
1677-     cx :   & DocContext < ' _ > , 
1678+     tcx :   TyCtxt < ' _ > , 
16781679    lint :  & ' static  Lint , 
16791680    msg :  & str , 
16801681    item :  & Item , 
16811682    dox :  & str , 
16821683    link_range :  & Range < usize > , 
16831684    decorate :  impl  FnOnce ( & mut  DiagnosticBuilder < ' _ > ,  Option < rustc_span:: Span > ) , 
16841685)  { 
1685-     let  hir_id = match  cx . as_local_hir_id ( item. def_id )  { 
1686+     let  hir_id = match  DocContext :: as_local_hir_id ( tcx ,   item. def_id )  { 
16861687        Some ( hir_id)  => hir_id, 
16871688        None  => { 
16881689            // If non-local, no need to check anything. 
@@ -1694,10 +1695,10 @@ fn report_diagnostic(
16941695    let  attrs = & item. attrs ; 
16951696    let  sp = span_of_attrs ( attrs) . unwrap_or ( item. source . span ( ) ) ; 
16961697
1697-     cx . tcx . struct_span_lint_hir ( lint,  hir_id,  sp,  |lint| { 
1698+     tcx. struct_span_lint_hir ( lint,  hir_id,  sp,  |lint| { 
16981699        let  mut  diag = lint. build ( msg) ; 
16991700
1700-         let  span = super :: source_span_for_markdown_range ( cx ,  dox,  link_range,  attrs) ; 
1701+         let  span = super :: source_span_for_markdown_range ( tcx ,  dox,  link_range,  attrs) ; 
17011702
17021703        if  let  Some ( sp)  = span { 
17031704            diag. set_span ( sp) ; 
@@ -1732,7 +1733,7 @@ fn report_diagnostic(
17321733/// handled earlier. For example, if passed `Item::Crate(std)` and `path_str` 
17331734/// `std::io::Error::x`, this will resolve `std::io::Error`. 
17341735fn  resolution_failure ( 
1735-     collector :  & LinkCollector < ' _ ,  ' _ > , 
1736+     collector :  & mut   LinkCollector < ' _ ,  ' _ > , 
17361737    item :  & Item , 
17371738    path_str :  & str , 
17381739    disambiguator :  Option < Disambiguator > , 
@@ -1742,7 +1743,7 @@ fn resolution_failure(
17421743)  { 
17431744    let  tcx = collector. cx . tcx ; 
17441745    report_diagnostic ( 
1745-         collector . cx , 
1746+         tcx , 
17461747        BROKEN_INTRA_DOC_LINKS , 
17471748        & format ! ( "unresolved link to `{}`" ,  path_str) , 
17481749        item, 
@@ -1973,7 +1974,7 @@ fn anchor_failure(
19731974        ) , 
19741975    } ; 
19751976
1976-     report_diagnostic ( cx,  BROKEN_INTRA_DOC_LINKS ,  & msg,  item,  dox,  & link_range,  |diag,  sp| { 
1977+     report_diagnostic ( cx. tcx ,  BROKEN_INTRA_DOC_LINKS ,  & msg,  item,  dox,  & link_range,  |diag,  sp| { 
19771978        if  let  Some ( sp)  = sp { 
19781979            diag. span_label ( sp,  "contains invalid anchor" ) ; 
19791980        } 
@@ -2013,7 +2014,7 @@ fn ambiguity_error(
20132014        } 
20142015    } 
20152016
2016-     report_diagnostic ( cx,  BROKEN_INTRA_DOC_LINKS ,  & msg,  item,  dox,  & link_range,  |diag,  sp| { 
2017+     report_diagnostic ( cx. tcx ,  BROKEN_INTRA_DOC_LINKS ,  & msg,  item,  dox,  & link_range,  |diag,  sp| { 
20172018        if  let  Some ( sp)  = sp { 
20182019            diag. span_label ( sp,  "ambiguous link" ) ; 
20192020        }  else  { 
@@ -2066,7 +2067,7 @@ fn privacy_error(cx: &DocContext<'_>, item: &Item, path_str: &str, dox: &str, li
20662067    let  msg =
20672068        format ! ( "public documentation for `{}` links to private item `{}`" ,  item_name,  path_str) ; 
20682069
2069-     report_diagnostic ( cx,  PRIVATE_INTRA_DOC_LINKS ,  & msg,  item,  dox,  & link. range ,  |diag,  sp| { 
2070+     report_diagnostic ( cx. tcx ,  PRIVATE_INTRA_DOC_LINKS ,  & msg,  item,  dox,  & link. range ,  |diag,  sp| { 
20702071        if  let  Some ( sp)  = sp { 
20712072            diag. span_label ( sp,  "this item is private" ) ; 
20722073        } 
0 commit comments