Skip to content

Commit 42f75f1

Browse files
committed
Group some commonly passed together values into a struct
1 parent f5c6014 commit 42f75f1

File tree

7 files changed

+77
-119
lines changed

7 files changed

+77
-119
lines changed

compiler/rustc_driver/src/lib.rs

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use rustc_errors::registry::{InvalidErrorCode, Registry};
2626
use rustc_errors::{ErrorGuaranteed, PResult};
2727
use rustc_feature::find_gated_cfg;
2828
use rustc_hir::def_id::LOCAL_CRATE;
29+
use rustc_interface::interface::CompilerIO;
2930
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
3031
use rustc_interface::{interface, Queries};
3132
use rustc_lint::LintStore;
@@ -262,10 +263,8 @@ fn run_compiler(
262263
let should_stop = print_crate_info(
263264
&***compiler.codegen_backend(),
264265
compiler.session(),
265-
None,
266-
compiler.output_dir(),
267-
compiler.output_file(),
268-
compiler.temps_dir(),
266+
false,
267+
compiler.io(),
269268
);
270269

271270
if should_stop == Compilation::Stop {
@@ -288,18 +287,16 @@ fn run_compiler(
288287

289288
interface::run_compiler(config, |compiler| {
290289
let sess = compiler.session();
291-
let should_stop = print_crate_info(
292-
&***compiler.codegen_backend(),
293-
sess,
294-
Some(compiler.input()),
295-
compiler.output_dir(),
296-
compiler.output_file(),
297-
compiler.temps_dir(),
298-
)
299-
.and_then(|| {
300-
list_metadata(sess, &*compiler.codegen_backend().metadata_loader(), compiler.input())
301-
})
302-
.and_then(|| try_process_rlink(sess, compiler));
290+
let should_stop =
291+
print_crate_info(&***compiler.codegen_backend(), sess, true, compiler.io())
292+
.and_then(|| {
293+
list_metadata(
294+
sess,
295+
&*compiler.codegen_backend().metadata_loader(),
296+
&compiler.io().input,
297+
)
298+
})
299+
.and_then(|| try_process_rlink(sess, compiler));
303300

304301
if should_stop == Compilation::Stop {
305302
return sess.compile_status();
@@ -315,22 +312,15 @@ fn run_compiler(
315312
queries.global_ctxt()?.enter(|tcx| {
316313
pretty::print_after_hir_lowering(
317314
tcx,
318-
compiler.input(),
315+
compiler.io(),
319316
&*expanded_crate,
320317
*ppm,
321-
compiler.output_file().as_deref(),
322318
);
323319
Ok(())
324320
})?;
325321
} else {
326322
let krate = queries.parse()?.steal();
327-
pretty::print_after_parsing(
328-
sess,
329-
compiler.input(),
330-
&krate,
331-
*ppm,
332-
compiler.output_file().as_deref(),
333-
);
323+
pretty::print_after_parsing(sess, compiler.io(), &krate, *ppm);
334324
}
335325
trace!("finished pretty-printing");
336326
return early_exit();
@@ -380,9 +370,9 @@ fn run_compiler(
380370
save::process_crate(
381371
tcx,
382372
crate_name,
383-
compiler.input(),
373+
&compiler.io().input,
384374
None,
385-
DumpHandler::new(compiler.output_dir().as_deref(), crate_name),
375+
DumpHandler::new(compiler.io().output_dir.as_deref(), crate_name),
386376
)
387377
});
388378
}
@@ -556,7 +546,7 @@ fn show_content_with_pager(content: &str) {
556546

557547
pub fn try_process_rlink(sess: &Session, compiler: &interface::Compiler) -> Compilation {
558548
if sess.opts.unstable_opts.link_only {
559-
if let Input::File(file) = compiler.input() {
549+
if let Input::File(file) = &compiler.io().input {
560550
// FIXME: #![crate_type] and #![crate_name] support not implemented yet
561551
sess.init_crate_types(collect_crate_types(sess, &[]));
562552
let outputs = compiler.build_output_filenames(sess, &[]);
@@ -623,10 +613,8 @@ pub fn list_metadata(
623613
fn print_crate_info(
624614
codegen_backend: &dyn CodegenBackend,
625615
sess: &Session,
626-
input: Option<&Input>,
627-
odir: &Option<PathBuf>,
628-
ofile: &Option<PathBuf>,
629-
temps_dir: &Option<PathBuf>,
616+
parse_attrs: bool,
617+
io: &CompilerIO,
630618
) -> Compilation {
631619
use rustc_session::config::PrintRequest::*;
632620
// NativeStaticLibs and LinkArgs are special - printed during linking
@@ -635,18 +623,17 @@ fn print_crate_info(
635623
return Compilation::Continue;
636624
}
637625

638-
let attrs = match input {
639-
None => None,
640-
Some(input) => {
641-
let result = parse_crate_attrs(sess, input);
642-
match result {
643-
Ok(attrs) => Some(attrs),
644-
Err(mut parse_error) => {
645-
parse_error.emit();
646-
return Compilation::Stop;
647-
}
626+
let attrs = if parse_attrs {
627+
let result = parse_crate_attrs(sess, &io.input);
628+
match result {
629+
Ok(attrs) => Some(attrs),
630+
Err(mut parse_error) => {
631+
parse_error.emit();
632+
return Compilation::Stop;
648633
}
649634
}
635+
} else {
636+
None
650637
};
651638
for req in &sess.opts.prints {
652639
match *req {
@@ -661,14 +648,9 @@ fn print_crate_info(
661648
println!("{}", serde_json::to_string_pretty(&sess.target.to_json()).unwrap());
662649
}
663650
FileNames | CrateName => {
664-
let input = input.unwrap_or_else(|| {
665-
early_error(ErrorOutputType::default(), "no input file provided")
666-
});
667651
let attrs = attrs.as_ref().unwrap();
668-
let t_outputs = rustc_interface::util::build_output_filenames(
669-
input, odir, ofile, temps_dir, attrs, sess,
670-
);
671-
let id = rustc_session::output::find_crate_name(sess, attrs, input);
652+
let t_outputs = rustc_interface::util::build_output_filenames(io, attrs, sess);
653+
let id = rustc_session::output::find_crate_name(sess, attrs, &io.input);
672654
if *req == PrintRequest::CrateName {
673655
println!("{id}");
674656
continue;

compiler/rustc_driver/src/pretty.rs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rustc_ast_pretty::pprust;
66
use rustc_errors::ErrorGuaranteed;
77
use rustc_hir as hir;
88
use rustc_hir_pretty as pprust_hir;
9+
use rustc_interface::interface::CompilerIO;
910
use rustc_middle::hir::map as hir_map;
1011
use rustc_middle::mir::{write_mir_graphviz, write_mir_pretty};
1112
use rustc_middle::ty::{self, TyCtxt};
@@ -16,7 +17,7 @@ use rustc_span::FileName;
1617

1718
use std::cell::Cell;
1819
use std::fmt::Write;
19-
use std::path::Path;
20+
use std::path::PathBuf;
2021

2122
pub use self::PpMode::*;
2223
pub use self::PpSourceMode::*;
@@ -358,7 +359,7 @@ fn get_source(input: &Input, sess: &Session) -> (String, FileName) {
358359
(src, src_name)
359360
}
360361

361-
fn write_or_print(out: &str, ofile: Option<&Path>, sess: &Session) {
362+
fn write_or_print(out: &str, ofile: &Option<PathBuf>, sess: &Session) {
362363
match ofile {
363364
None => print!("{out}"),
364365
Some(p) => {
@@ -372,14 +373,8 @@ fn write_or_print(out: &str, ofile: Option<&Path>, sess: &Session) {
372373
}
373374
}
374375

375-
pub fn print_after_parsing(
376-
sess: &Session,
377-
input: &Input,
378-
krate: &ast::Crate,
379-
ppm: PpMode,
380-
ofile: Option<&Path>,
381-
) {
382-
let (src, src_name) = get_source(input, sess);
376+
pub fn print_after_parsing(sess: &Session, io: &CompilerIO, krate: &ast::Crate, ppm: PpMode) {
377+
let (src, src_name) = get_source(&io.input, sess);
383378

384379
let out = match ppm {
385380
Source(s) => {
@@ -407,22 +402,21 @@ pub fn print_after_parsing(
407402
_ => unreachable!(),
408403
};
409404

410-
write_or_print(&out, ofile, sess);
405+
write_or_print(&out, &io.output_file, sess);
411406
}
412407

413408
pub fn print_after_hir_lowering<'tcx>(
414409
tcx: TyCtxt<'tcx>,
415-
input: &Input,
410+
io: &CompilerIO,
416411
krate: &ast::Crate,
417412
ppm: PpMode,
418-
ofile: Option<&Path>,
419413
) {
420414
if ppm.needs_analysis() {
421-
abort_on_err(print_with_analysis(tcx, ppm, ofile), tcx.sess);
415+
abort_on_err(print_with_analysis(tcx, ppm, &io.output_file), tcx.sess);
422416
return;
423417
}
424418

425-
let (src, src_name) = get_source(input, tcx.sess);
419+
let (src, src_name) = get_source(&io.input, tcx.sess);
426420

427421
let out = match ppm {
428422
Source(s) => {
@@ -474,7 +468,7 @@ pub fn print_after_hir_lowering<'tcx>(
474468
_ => unreachable!(),
475469
};
476470

477-
write_or_print(&out, ofile, tcx.sess);
471+
write_or_print(&out, &io.output_file, tcx.sess);
478472
}
479473

480474
// In an ideal world, this would be a public function called by the driver after
@@ -484,7 +478,7 @@ pub fn print_after_hir_lowering<'tcx>(
484478
fn print_with_analysis(
485479
tcx: TyCtxt<'_>,
486480
ppm: PpMode,
487-
ofile: Option<&Path>,
481+
ofile: &Option<PathBuf>,
488482
) -> Result<(), ErrorGuaranteed> {
489483
tcx.analysis(())?;
490484
let out = match ppm {

compiler/rustc_interface/src/interface.rs

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,28 @@ pub type Result<T> = result::Result<T, ErrorGuaranteed>;
3535
pub struct Compiler {
3636
pub(crate) sess: Lrc<Session>,
3737
codegen_backend: Lrc<Box<dyn CodegenBackend>>,
38-
pub(crate) input: Input,
39-
pub(crate) output_dir: Option<PathBuf>,
40-
pub(crate) output_file: Option<PathBuf>,
41-
pub(crate) temps_dir: Option<PathBuf>,
38+
pub(crate) io: CompilerIO,
4239
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>>,
4340
pub(crate) override_queries:
4441
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::ExternProviders)>,
4542
}
4643

44+
pub struct CompilerIO {
45+
pub input: Input,
46+
pub output_dir: Option<PathBuf>,
47+
pub output_file: Option<PathBuf>,
48+
pub temps_dir: Option<PathBuf>,
49+
}
50+
4751
impl Compiler {
4852
pub fn session(&self) -> &Lrc<Session> {
4953
&self.sess
5054
}
5155
pub fn codegen_backend(&self) -> &Lrc<Box<dyn CodegenBackend>> {
5256
&self.codegen_backend
5357
}
54-
pub fn input(&self) -> &Input {
55-
&self.input
56-
}
57-
pub fn output_dir(&self) -> &Option<PathBuf> {
58-
&self.output_dir
59-
}
60-
pub fn output_file(&self) -> &Option<PathBuf> {
61-
&self.output_file
62-
}
63-
pub fn temps_dir(&self) -> &Option<PathBuf> {
64-
&self.temps_dir
58+
pub fn io(&self) -> &CompilerIO {
59+
&self.io
6560
}
6661
pub fn register_lints(&self) -> &Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>> {
6762
&self.register_lints
@@ -71,14 +66,7 @@ impl Compiler {
7166
sess: &Session,
7267
attrs: &[ast::Attribute],
7368
) -> OutputFilenames {
74-
util::build_output_filenames(
75-
&self.input,
76-
&self.output_dir,
77-
&self.output_file,
78-
&self.temps_dir,
79-
attrs,
80-
sess,
81-
)
69+
util::build_output_filenames(&self.io, attrs, sess)
8270
}
8371
}
8472

@@ -305,10 +293,12 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
305293
let compiler = Compiler {
306294
sess: Lrc::new(sess),
307295
codegen_backend: Lrc::new(codegen_backend),
308-
input: config.input,
309-
output_dir: config.output_dir,
310-
output_file: config.output_file,
311-
temps_dir,
296+
io: CompilerIO {
297+
input: config.input,
298+
output_dir: config.output_dir,
299+
output_file: config.output_file,
300+
temps_dir,
301+
},
312302
register_lints: config.register_lints,
313303
override_queries: config.override_queries,
314304
};

compiler/rustc_interface/src/passes.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -673,20 +673,13 @@ pub fn prepare_outputs(
673673
let _timer = sess.timer("prepare_outputs");
674674

675675
// FIXME: rustdoc passes &[] instead of &krate.attrs here
676-
let outputs = util::build_output_filenames(
677-
&compiler.input,
678-
&compiler.output_dir,
679-
&compiler.output_file,
680-
&compiler.temps_dir,
681-
&krate.attrs,
682-
sess,
683-
);
676+
let outputs = util::build_output_filenames(&compiler.io, &krate.attrs, sess);
684677

685678
let output_paths =
686-
generated_output_paths(sess, &outputs, compiler.output_file.is_some(), crate_name);
679+
generated_output_paths(sess, &outputs, compiler.io.output_file.is_some(), crate_name);
687680

688681
// Ensure the source file isn't accidentally overwritten during compilation.
689-
if let Some(ref input_path) = compiler.input.opt_path() {
682+
if let Some(ref input_path) = compiler.io.input.opt_path() {
690683
if sess.opts.will_create_output_file() {
691684
if output_contains_path(&output_paths, input_path) {
692685
let reported = sess.emit_err(InputFileWouldBeOverWritten { path: input_path });
@@ -700,7 +693,7 @@ pub fn prepare_outputs(
700693
}
701694
}
702695

703-
if let Some(ref dir) = compiler.temps_dir {
696+
if let Some(ref dir) = compiler.io.temps_dir {
704697
if fs::create_dir_all(dir).is_err() {
705698
let reported = sess.emit_err(TempsDirError);
706699
return Err(reported);
@@ -713,7 +706,7 @@ pub fn prepare_outputs(
713706
&& sess.opts.output_types.len() == 1;
714707

715708
if !only_dep_info {
716-
if let Some(ref dir) = compiler.output_dir {
709+
if let Some(ref dir) = compiler.io.output_dir {
717710
if fs::create_dir_all(dir).is_err() {
718711
let reported = sess.emit_err(OutDirError);
719712
return Err(reported);

compiler/rustc_interface/src/queries.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ impl<'tcx> Queries<'tcx> {
129129

130130
pub fn parse(&self) -> Result<QueryResult<'_, ast::Crate>> {
131131
self.parse.compute(|| {
132-
passes::parse(self.session(), &self.compiler.input)
132+
passes::parse(self.session(), &self.compiler.io.input)
133133
.map_err(|mut parse_error| parse_error.emit())
134134
})
135135
}
@@ -165,7 +165,7 @@ impl<'tcx> Queries<'tcx> {
165165
let parse_result = self.parse()?;
166166
let krate = parse_result.borrow();
167167
// parse `#[crate_name]` even if `--crate-name` was passed, to make sure it matches.
168-
find_crate_name(self.session(), &krate.attrs, &self.compiler.input)
168+
find_crate_name(self.session(), &krate.attrs, &self.compiler.io.input)
169169
})
170170
})
171171
}

0 commit comments

Comments
 (0)