Skip to content

Commit 51345a8

Browse files
committed
Go back to loading all external crates unconditionally
This *continues* to cause regressions. This code will be unnecessary once access to the resolver happens fully before creating the tyctxt (#83761), so load all crates unconditionally for now.
1 parent cdafe99 commit 51345a8

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

src/librustdoc/core.rs

+34-2
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ use rustc_middle::hir::map::Map;
1616
use rustc_middle::middle::privacy::AccessLevels;
1717
use rustc_middle::ty::{ParamEnv, Ty, TyCtxt};
1818
use rustc_resolve as resolve;
19+
use rustc_resolve::Namespace::TypeNS;
1920
use rustc_session::config::{self, CrateType, ErrorOutputType};
2021
use rustc_session::lint;
2122
use rustc_session::DiagnosticOutput;
2223
use rustc_session::Session;
24+
use rustc_span::def_id::CRATE_DEF_INDEX;
2325
use rustc_span::source_map;
2426
use rustc_span::symbol::sym;
25-
use rustc_span::Span;
27+
use rustc_span::{Span, DUMMY_SP};
2628

2729
use std::cell::RefCell;
2830
use std::lazy::SyncLazy;
@@ -299,13 +301,43 @@ crate fn create_config(
299301
}
300302

301303
crate fn create_resolver<'a>(
304+
externs: config::Externs,
302305
queries: &Queries<'a>,
303306
sess: &Session,
304307
) -> Rc<RefCell<interface::BoxedResolver>> {
305308
let (krate, resolver, _) = &*abort_on_err(queries.expansion(), sess).peek();
306309
let resolver = resolver.clone();
307310

308-
crate::passes::collect_intra_doc_links::load_intra_link_crates(resolver, krate)
311+
let resolver = crate::passes::collect_intra_doc_links::load_intra_link_crates(resolver, krate);
312+
313+
// FIXME: somehow rustdoc is still missing crates even though we loaded all
314+
// the known necessary crates. Load them all unconditionally until we find a way to fix this.
315+
// DO NOT REMOVE THIS without first testing on the reproducer in
316+
// https://github.com/jyn514/objr/commit/edcee7b8124abf0e4c63873e8422ff81beb11ebb
317+
let extern_names: Vec<String> = externs
318+
.iter()
319+
.filter(|(_, entry)| entry.add_prelude)
320+
.map(|(name, _)| name)
321+
.cloned()
322+
.collect();
323+
resolver.borrow_mut().access(|resolver| {
324+
sess.time("load_extern_crates", || {
325+
for extern_name in &extern_names {
326+
debug!("loading extern crate {}", extern_name);
327+
if let Err(()) = resolver
328+
.resolve_str_path_error(
329+
DUMMY_SP,
330+
extern_name,
331+
TypeNS,
332+
LocalDefId { local_def_index: CRATE_DEF_INDEX }.to_def_id(),
333+
) {
334+
warn!("unable to resolve external crate {} (do you have an unused `--extern` crate?)", extern_name)
335+
}
336+
}
337+
});
338+
});
339+
340+
resolver
309341
}
310342

311343
crate fn run_global_ctxt(

src/librustdoc/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,7 @@ fn main_options(options: config::Options) -> MainResult {
755755
let default_passes = options.default_passes;
756756
let output_format = options.output_format;
757757
// FIXME: fix this clone (especially render_options)
758+
let externs = options.externs.clone();
758759
let manual_passes = options.manual_passes.clone();
759760
let render_options = options.render_options.clone();
760761
let scrape_examples_options = options.scrape_examples_options.clone();
@@ -773,7 +774,7 @@ fn main_options(options: config::Options) -> MainResult {
773774
// We need to hold on to the complete resolver, so we cause everything to be
774775
// cloned for the analysis passes to use. Suboptimal, but necessary in the
775776
// current architecture.
776-
let resolver = core::create_resolver(queries, sess);
777+
let resolver = core::create_resolver(externs, queries, sess);
777778

778779
if sess.has_errors() {
779780
sess.fatal("Compilation failed, aborting rustdoc");

0 commit comments

Comments
 (0)