Group some commonly passed together values into a struct
This commit is contained in:
parent
f5c601492e
commit
42f75f1e46
7 changed files with 77 additions and 119 deletions
|
@ -35,15 +35,19 @@ pub type Result<T> = result::Result<T, ErrorGuaranteed>;
|
|||
pub struct Compiler {
|
||||
pub(crate) sess: Lrc<Session>,
|
||||
codegen_backend: Lrc<Box<dyn CodegenBackend>>,
|
||||
pub(crate) input: Input,
|
||||
pub(crate) output_dir: Option<PathBuf>,
|
||||
pub(crate) output_file: Option<PathBuf>,
|
||||
pub(crate) temps_dir: Option<PathBuf>,
|
||||
pub(crate) io: CompilerIO,
|
||||
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>>,
|
||||
pub(crate) override_queries:
|
||||
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::ExternProviders)>,
|
||||
}
|
||||
|
||||
pub struct CompilerIO {
|
||||
pub input: Input,
|
||||
pub output_dir: Option<PathBuf>,
|
||||
pub output_file: Option<PathBuf>,
|
||||
pub temps_dir: Option<PathBuf>,
|
||||
}
|
||||
|
||||
impl Compiler {
|
||||
pub fn session(&self) -> &Lrc<Session> {
|
||||
&self.sess
|
||||
|
@ -51,17 +55,8 @@ impl Compiler {
|
|||
pub fn codegen_backend(&self) -> &Lrc<Box<dyn CodegenBackend>> {
|
||||
&self.codegen_backend
|
||||
}
|
||||
pub fn input(&self) -> &Input {
|
||||
&self.input
|
||||
}
|
||||
pub fn output_dir(&self) -> &Option<PathBuf> {
|
||||
&self.output_dir
|
||||
}
|
||||
pub fn output_file(&self) -> &Option<PathBuf> {
|
||||
&self.output_file
|
||||
}
|
||||
pub fn temps_dir(&self) -> &Option<PathBuf> {
|
||||
&self.temps_dir
|
||||
pub fn io(&self) -> &CompilerIO {
|
||||
&self.io
|
||||
}
|
||||
pub fn register_lints(&self) -> &Option<Box<dyn Fn(&Session, &mut LintStore) + Send + Sync>> {
|
||||
&self.register_lints
|
||||
|
@ -71,14 +66,7 @@ impl Compiler {
|
|||
sess: &Session,
|
||||
attrs: &[ast::Attribute],
|
||||
) -> OutputFilenames {
|
||||
util::build_output_filenames(
|
||||
&self.input,
|
||||
&self.output_dir,
|
||||
&self.output_file,
|
||||
&self.temps_dir,
|
||||
attrs,
|
||||
sess,
|
||||
)
|
||||
util::build_output_filenames(&self.io, attrs, sess)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -305,10 +293,12 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
|||
let compiler = Compiler {
|
||||
sess: Lrc::new(sess),
|
||||
codegen_backend: Lrc::new(codegen_backend),
|
||||
input: config.input,
|
||||
output_dir: config.output_dir,
|
||||
output_file: config.output_file,
|
||||
temps_dir,
|
||||
io: CompilerIO {
|
||||
input: config.input,
|
||||
output_dir: config.output_dir,
|
||||
output_file: config.output_file,
|
||||
temps_dir,
|
||||
},
|
||||
register_lints: config.register_lints,
|
||||
override_queries: config.override_queries,
|
||||
};
|
||||
|
|
|
@ -673,20 +673,13 @@ pub fn prepare_outputs(
|
|||
let _timer = sess.timer("prepare_outputs");
|
||||
|
||||
// FIXME: rustdoc passes &[] instead of &krate.attrs here
|
||||
let outputs = util::build_output_filenames(
|
||||
&compiler.input,
|
||||
&compiler.output_dir,
|
||||
&compiler.output_file,
|
||||
&compiler.temps_dir,
|
||||
&krate.attrs,
|
||||
sess,
|
||||
);
|
||||
let outputs = util::build_output_filenames(&compiler.io, &krate.attrs, sess);
|
||||
|
||||
let output_paths =
|
||||
generated_output_paths(sess, &outputs, compiler.output_file.is_some(), crate_name);
|
||||
generated_output_paths(sess, &outputs, compiler.io.output_file.is_some(), crate_name);
|
||||
|
||||
// Ensure the source file isn't accidentally overwritten during compilation.
|
||||
if let Some(ref input_path) = compiler.input.opt_path() {
|
||||
if let Some(ref input_path) = compiler.io.input.opt_path() {
|
||||
if sess.opts.will_create_output_file() {
|
||||
if output_contains_path(&output_paths, input_path) {
|
||||
let reported = sess.emit_err(InputFileWouldBeOverWritten { path: input_path });
|
||||
|
@ -700,7 +693,7 @@ pub fn prepare_outputs(
|
|||
}
|
||||
}
|
||||
|
||||
if let Some(ref dir) = compiler.temps_dir {
|
||||
if let Some(ref dir) = compiler.io.temps_dir {
|
||||
if fs::create_dir_all(dir).is_err() {
|
||||
let reported = sess.emit_err(TempsDirError);
|
||||
return Err(reported);
|
||||
|
@ -713,7 +706,7 @@ pub fn prepare_outputs(
|
|||
&& sess.opts.output_types.len() == 1;
|
||||
|
||||
if !only_dep_info {
|
||||
if let Some(ref dir) = compiler.output_dir {
|
||||
if let Some(ref dir) = compiler.io.output_dir {
|
||||
if fs::create_dir_all(dir).is_err() {
|
||||
let reported = sess.emit_err(OutDirError);
|
||||
return Err(reported);
|
||||
|
|
|
@ -129,7 +129,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
|
||||
pub fn parse(&self) -> Result<QueryResult<'_, ast::Crate>> {
|
||||
self.parse.compute(|| {
|
||||
passes::parse(self.session(), &self.compiler.input)
|
||||
passes::parse(self.session(), &self.compiler.io.input)
|
||||
.map_err(|mut parse_error| parse_error.emit())
|
||||
})
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
let parse_result = self.parse()?;
|
||||
let krate = parse_result.borrow();
|
||||
// parse `#[crate_name]` even if `--crate-name` was passed, to make sure it matches.
|
||||
find_crate_name(self.session(), &krate.attrs, &self.compiler.input)
|
||||
find_crate_name(self.session(), &krate.attrs, &self.compiler.io.input)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ use rustc_parse::validate_attr;
|
|||
use rustc_session as session;
|
||||
use rustc_session::config::CheckCfg;
|
||||
use rustc_session::config::{self, CrateType};
|
||||
use rustc_session::config::{ErrorOutputType, Input, OutputFilenames};
|
||||
use rustc_session::config::{ErrorOutputType, OutputFilenames};
|
||||
use rustc_session::filesearch::sysroot_candidates;
|
||||
use rustc_session::lint::{self, BuiltinLintDiagnostics, LintBuffer};
|
||||
use rustc_session::parse::CrateConfig;
|
||||
|
@ -25,6 +25,8 @@ use std::sync::atomic::{AtomicBool, Ordering};
|
|||
use std::sync::OnceLock;
|
||||
use std::thread;
|
||||
|
||||
use crate::interface::CompilerIO;
|
||||
|
||||
/// Function pointer type that constructs a new CodegenBackend.
|
||||
pub type MakeBackendFn = fn() -> Box<dyn CodegenBackend>;
|
||||
|
||||
|
@ -487,19 +489,16 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<C
|
|||
}
|
||||
|
||||
pub fn build_output_filenames(
|
||||
input: &Input,
|
||||
odir: &Option<PathBuf>,
|
||||
ofile: &Option<PathBuf>,
|
||||
temps_dir: &Option<PathBuf>,
|
||||
io: &CompilerIO,
|
||||
attrs: &[ast::Attribute],
|
||||
sess: &Session,
|
||||
) -> OutputFilenames {
|
||||
match *ofile {
|
||||
match io.output_file {
|
||||
None => {
|
||||
// "-" as input file will cause the parser to read from stdin so we
|
||||
// have to make up a name
|
||||
// We want to toss everything after the final '.'
|
||||
let dirpath = (*odir).as_ref().cloned().unwrap_or_default();
|
||||
let dirpath = io.output_dir.clone().unwrap_or_default();
|
||||
|
||||
// If a crate name is present, we use it as the link name
|
||||
let stem = sess
|
||||
|
@ -507,13 +506,13 @@ pub fn build_output_filenames(
|
|||
.crate_name
|
||||
.clone()
|
||||
.or_else(|| rustc_attr::find_crate_name(sess, attrs).map(|n| n.to_string()))
|
||||
.unwrap_or_else(|| input.filestem().to_owned());
|
||||
.unwrap_or_else(|| io.input.filestem().to_owned());
|
||||
|
||||
OutputFilenames::new(
|
||||
dirpath,
|
||||
stem,
|
||||
None,
|
||||
temps_dir.clone(),
|
||||
io.temps_dir.clone(),
|
||||
sess.opts.cg.extra_filename.clone(),
|
||||
sess.opts.output_types.clone(),
|
||||
)
|
||||
|
@ -534,7 +533,7 @@ pub fn build_output_filenames(
|
|||
}
|
||||
Some(out_file.clone())
|
||||
};
|
||||
if *odir != None {
|
||||
if io.output_dir != None {
|
||||
sess.warn("ignoring --out-dir flag due to -o flag");
|
||||
}
|
||||
|
||||
|
@ -542,7 +541,7 @@ pub fn build_output_filenames(
|
|||
out_file.parent().unwrap_or_else(|| Path::new("")).to_path_buf(),
|
||||
out_file.file_stem().unwrap_or_default().to_str().unwrap().to_string(),
|
||||
ofile,
|
||||
temps_dir.clone(),
|
||||
io.temps_dir.clone(),
|
||||
sess.opts.cg.extra_filename.clone(),
|
||||
sess.opts.output_types.clone(),
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue