@@ -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.
486486 fn 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).
701701 fn 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