@@ -172,34 +172,50 @@ impl<'ra> EarlyDocLinkResolver<'_, 'ra> {
172172 }
173173
174174 fn resolve_doc_links_extern_impl(&mut self, def_id: DefId, is_inherent: bool) {
175- self.resolve_doc_links_extern_outer (def_id, def_id);
175+ self.resolve_doc_links_extern_outer_fixme (def_id, def_id);
176176 let assoc_item_def_ids = Vec::from_iter(
177177 self.resolver.cstore().associated_item_def_ids_untracked(def_id, self.sess),
178178 );
179179 for assoc_def_id in assoc_item_def_ids {
180180 if !is_inherent || self.resolver.cstore().visibility_untracked(assoc_def_id).is_public()
181181 {
182- self.resolve_doc_links_extern_outer (assoc_def_id, def_id);
182+ self.resolve_doc_links_extern_outer_fixme (assoc_def_id, def_id);
183183 }
184184 }
185185 }
186186
187- fn resolve_doc_links_extern_outer(&mut self, def_id: DefId, scope_id: DefId) {
187+ // FIXME: replace all uses with `resolve_doc_links_extern_outer` to actually resolve links, not
188+ // just add traits in scope. This may be expensive and require benchmarking and optimization.
189+ fn resolve_doc_links_extern_outer_fixme(&mut self, def_id: DefId, scope_id: DefId) {
188190 if !self.resolver.cstore().may_have_doc_links_untracked(def_id) {
189191 return;
190192 }
191- // FIXME: actually resolve links, not just add traits in scope.
192193 if let Some(parent_id) = self.resolver.opt_parent(scope_id) {
193194 self.add_traits_in_scope(parent_id);
194195 }
195196 }
196197
198+ fn resolve_doc_links_extern_outer(&mut self, def_id: DefId, scope_id: DefId) {
199+ if !self.resolver.cstore().may_have_doc_links_untracked(def_id) {
200+ return;
201+ }
202+ let attrs = Vec::from_iter(self.resolver.cstore().item_attrs_untracked(def_id, self.sess));
203+ let parent_scope = ParentScope::module(
204+ self.resolver.get_nearest_non_block_module(
205+ self.resolver.opt_parent(scope_id).unwrap_or(scope_id),
206+ ),
207+ self.resolver,
208+ );
209+ self.resolve_doc_links(doc_attrs(attrs.iter()), parent_scope);
210+ }
211+
197212 fn resolve_doc_links_extern_inner(&mut self, def_id: DefId) {
198213 if !self.resolver.cstore().may_have_doc_links_untracked(def_id) {
199214 return;
200215 }
201- // FIXME: actually resolve links, not just add traits in scope.
202- self.add_traits_in_scope(def_id);
216+ let attrs = Vec::from_iter(self.resolver.cstore().item_attrs_untracked(def_id, self.sess));
217+ let parent_scope = ParentScope::module(self.resolver.expect_module(def_id), self.resolver);
218+ self.resolve_doc_links(doc_attrs(attrs.iter()), parent_scope);
203219 }
204220
205221 fn resolve_doc_links_local(&mut self, attrs: &[ast::Attribute]) {
@@ -253,9 +269,16 @@ impl<'ra> EarlyDocLinkResolver<'_, 'ra> {
253269 }
254270 }
255271
256- // FIXME: Resolve all prefixes for type-relative resolution or for diagnostics.
257- if (need_assoc || !any_resolved) && pinfo.path_str.contains("::") {
258- need_traits_in_scope = true;
272+ // Resolve all prefixes for type-relative resolution or for diagnostics.
273+ if need_assoc || !any_resolved {
274+ let mut path = &pinfo.path_str[..];
275+ while let Some(idx) = path.rfind("::") {
276+ path = &path[..idx];
277+ need_traits_in_scope = true;
278+ for ns in [TypeNS, ValueNS, MacroNS] {
279+ self.resolve_and_cache(path, ns, &parent_scope);
280+ }
281+ }
259282 }
260283 }
261284 }
0 commit comments