Auto merge of #80090 - jyn514:tcx-in-render, r=GuillaumeGomez · rust-lang/rust@d8d3ab9 (original) (raw)

`@@ -11,7 +11,7 @@ use rustc_hir::{

`

11

11

` intravisit::{self, NestedVisitorMap, Visitor},

`

12

12

`Path,

`

13

13

`};

`

14

``

`-

use rustc_interface::interface;

`

``

14

`+

use rustc_interface::{interface, Queries};

`

15

15

`use rustc_middle::hir::map::Map;

`

16

16

`use rustc_middle::middle:🔏:AccessLevels;

`

17

17

`use rustc_middle::ty::{ParamEnv, Ty, TyCtxt};

`

`@@ -273,12 +273,9 @@ where

`

273

273

`(lint_opts, lint_caps)

`

274

274

`}

`

275

275

``

276

``

`-

crate fn run_core(

`

277

``

`-

options: RustdocOptions,

`

278

``

`-

) -> (clean::Crate, RenderInfo, RenderOptions, Lrc) {

`

279

``

`-

// Parse, resolve, and typecheck the given crate.

`

280

``

-

281

``

`-

let RustdocOptions {

`

``

276

`+

/// Parse, resolve, and typecheck the given crate.

`

``

277

`+

crate fn create_config(

`

``

278

`+

RustdocOptions {

`

282

279

` input,

`

283

280

` crate_name,

`

284

281

` proc_macro_crate,

`

`@@ -294,21 +291,10 @@ crate fn run_core(

`

294

291

` lint_opts,

`

295

292

` describe_lints,

`

296

293

` lint_cap,

`

297

``

`-

default_passes,

`

298

``

`-

manual_passes,

`

299

294

` display_warnings,

`

300

``

`-

render_options,

`

301

``

`-

output_format,

`

302

295

` ..

`

303

``

`-

} = options;

`

304

``

-

305

``

`-

let extern_names: Vec = externs

`

306

``

`-

.iter()

`

307

``

`-

.filter(|(_, entry)| entry.add_prelude)

`

308

``

`-

.map(|(name, _)| name)

`

309

``

`-

.cloned()

`

310

``

`-

.collect();

`

311

``

-

``

296

`+

}: RustdocOptions,

`

``

297

`+

) -> rustc_interface::Config {

`

312

298

`// Add the doc cfg into the doc build.

`

313

299

` cfgs.push("doc".to_string());

`

314

300

``

`@@ -374,7 +360,7 @@ crate fn run_core(

`

374

360

` ..Options::default()

`

375

361

`};

`

376

362

``

377

``

`-

let config = interface::Config {

`

``

363

`+

interface::Config {

`

378

364

`opts: sessopts,

`

379

365

`crate_cfg: interface::parse_cfgspecs(cfgs),

`

380

366

` input,

`

`@@ -417,68 +403,50 @@ crate fn run_core(

`

417

403

`}),

`

418

404

`make_codegen_backend: None,

`

419

405

`registry: rustc_driver::diagnostics_registry(),

`

420

``

`-

};

`

421

``

-

422

``

`-

interface::create_compiler_and_run(config, |compiler| {

`

423

``

`-

compiler.enter(|queries| {

`

424

``

`-

let sess = compiler.session();

`

425

``

-

426

``

`-

// We need to hold on to the complete resolver, so we cause everything to be

`

427

``

`-

// cloned for the analysis passes to use. Suboptimal, but necessary in the

`

428

``

`-

// current architecture.

`

429

``

`-

let resolver = {

`

430

``

`-

let parts = abort_on_err(queries.expansion(), sess).peek();

`

431

``

`-

let resolver = parts.1.borrow();

`

432

``

-

433

``

`-

// Before we actually clone it, let's force all the extern'd crates to

`

434

``

`-

// actually be loaded, just in case they're only referred to inside

`

435

``

`-

// intra-doc-links

`

436

``

`-

resolver.borrow_mut().access(|resolver| {

`

437

``

`-

sess.time("load_extern_crates", || {

`

438

``

`-

for extern_name in &extern_names {

`

439

``

`-

debug!("loading extern crate {}", extern_name);

`

440

``

`-

resolver

`

441

``

`-

.resolve_str_path_error(

`

442

``

`-

DUMMY_SP,

`

443

``

`-

extern_name,

`

444

``

`-

TypeNS,

`

445

``

`-

LocalDefId { local_def_index: CRATE_DEF_INDEX }.to_def_id(),

`

446

``

`-

)

`

447

``

`-

.unwrap_or_else(|()| {

`

448

``

`-

panic!("Unable to resolve external crate {}", extern_name)

`

449

``

`-

});

`

450

``

`-

}

`

451

``

`-

});

`

452

``

`-

});

`

``

406

`+

}

`

``

407

`+

}

`

453

408

``

454

``

`-

// Now we're good to clone the resolver because everything should be loaded

`

455

``

`-

resolver.clone()

`

456

``

`-

};

`

``

409

`+

crate fn create_resolver<'a>(

`

``

410

`+

externs: config::Externs,

`

``

411

`+

queries: &Queries<'a>,

`

``

412

`+

sess: &Session,

`

``

413

`+

) -> Rc<RefCellinterface::BoxedResolver> {

`

``

414

`+

let extern_names: Vec = externs

`

``

415

`+

.iter()

`

``

416

`+

.filter(|(_, entry)| entry.add_prelude)

`

``

417

`+

.map(|(name, _)| name)

`

``

418

`+

.cloned()

`

``

419

`+

.collect();

`

457

420

``

458

``

`-

if sess.has_errors() {

`

459

``

`-

sess.fatal("Compilation failed, aborting rustdoc");

`

``

421

`+

let parts = abort_on_err(queries.expansion(), sess).peek();

`

``

422

`+

let resolver = parts.1.borrow();

`

``

423

+

``

424

`+

// Before we actually clone it, let's force all the extern'd crates to

`

``

425

`+

// actually be loaded, just in case they're only referred to inside

`

``

426

`+

// intra-doc-links

`

``

427

`+

resolver.borrow_mut().access(|resolver| {

`

``

428

`+

sess.time("load_extern_crates", || {

`

``

429

`+

for extern_name in &extern_names {

`

``

430

`+

debug!("loading extern crate {}", extern_name);

`

``

431

`+

resolver

`

``

432

`+

.resolve_str_path_error(

`

``

433

`+

DUMMY_SP,

`

``

434

`+

extern_name,

`

``

435

`+

TypeNS,

`

``

436

`+

LocalDefId { local_def_index: CRATE_DEF_INDEX }.to_def_id(),

`

``

437

`+

)

`

``

438

`+

.unwrap_or_else(|()| {

`

``

439

`+

panic!("Unable to resolve external crate {}", extern_name)

`

``

440

`+

});

`

460

441

`}

`

``

442

`+

});

`

``

443

`+

});

`

461

444

``

462

``

`-

let mut global_ctxt = abort_on_err(queries.global_ctxt(), sess).take();

`

463

``

-

464

``

`-

let (krate, render_info, opts) = sess.time("run_global_ctxt", || {

`

465

``

`-

global_ctxt.enter(|tcx| {

`

466

``

`-

run_global_ctxt(

`

467

``

`-

tcx,

`

468

``

`-

resolver,

`

469

``

`-

default_passes,

`

470

``

`-

manual_passes,

`

471

``

`-

render_options,

`

472

``

`-

output_format,

`

473

``

`-

)

`

474

``

`-

})

`

475

``

`-

});

`

476

``

`-

(krate, render_info, opts, Lrc::clone(sess))

`

477

``

`-

})

`

478

``

`-

})

`

``

445

`+

// Now we're good to clone the resolver because everything should be loaded

`

``

446

`+

resolver.clone()

`

479

447

`}

`

480

448

``

481

``

`-

fn run_global_ctxt(

`

``

449

`+

crate fn run_global_ctxt(

`

482

450

`tcx: TyCtxt<'_>,

`

483

451

`resolver: Rc<RefCellinterface::BoxedResolver>,

`

484

452

`mut default_passes: passes::DefaultPassOption,

`