Auto merge of #43730 - nrc:driver-shim, r=eddyb
Make the driver API a little more useful for a tools shim Example use case: https://github.com/nrc/rls-rustc
This commit is contained in:
commit
57e720d2cd
@ -89,7 +89,7 @@ pub fn compile_input(sess: &Session,
|
||||
// large chunks of memory alive and we want to free them as soon as
|
||||
// possible to keep the peak memory usage low
|
||||
let (outputs, trans) = {
|
||||
let krate = match phase_1_parse_input(sess, input) {
|
||||
let krate = match phase_1_parse_input(control, sess, input) {
|
||||
Ok(krate) => krate,
|
||||
Err(mut parse_error) => {
|
||||
parse_error.emit();
|
||||
@ -296,9 +296,13 @@ pub struct CompileController<'a> {
|
||||
pub after_llvm: PhaseController<'a>,
|
||||
pub compilation_done: PhaseController<'a>,
|
||||
|
||||
// FIXME we probably want to group the below options together and offer a
|
||||
// better API, rather than this ad-hoc approach.
|
||||
pub make_glob_map: MakeGlobMap,
|
||||
// Whether the compiler should keep the ast beyond parsing.
|
||||
pub keep_ast: bool,
|
||||
// -Zcontinue-parse-after-error
|
||||
pub continue_parse_after_error: bool,
|
||||
}
|
||||
|
||||
impl<'a> CompileController<'a> {
|
||||
@ -312,6 +316,7 @@ impl<'a> CompileController<'a> {
|
||||
compilation_done: PhaseController::basic(),
|
||||
make_glob_map: MakeGlobMap::No,
|
||||
keep_ast: false,
|
||||
continue_parse_after_error: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -484,10 +489,10 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
|
||||
}
|
||||
|
||||
fn state_when_compilation_done(input: &'a Input,
|
||||
session: &'tcx Session,
|
||||
out_dir: &'a Option<PathBuf>,
|
||||
out_file: &'a Option<PathBuf>)
|
||||
-> Self {
|
||||
session: &'tcx Session,
|
||||
out_dir: &'a Option<PathBuf>,
|
||||
out_file: &'a Option<PathBuf>)
|
||||
-> Self {
|
||||
CompileState {
|
||||
out_file: out_file.as_ref().map(|s| &**s),
|
||||
..CompileState::empty(input, session, out_dir)
|
||||
@ -495,9 +500,11 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn phase_1_parse_input<'a>(sess: &'a Session, input: &Input) -> PResult<'a, ast::Crate> {
|
||||
let continue_after_error = sess.opts.debugging_opts.continue_parse_after_error;
|
||||
sess.diagnostic().set_continue_after_error(continue_after_error);
|
||||
pub fn phase_1_parse_input<'a>(control: &CompileController,
|
||||
sess: &'a Session,
|
||||
input: &Input)
|
||||
-> PResult<'a, ast::Crate> {
|
||||
sess.diagnostic().set_continue_after_error(control.continue_parse_after_error);
|
||||
|
||||
let krate = time(sess.time_passes(), "parsing", || {
|
||||
match *input {
|
||||
|
@ -518,7 +518,8 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
|
||||
-> CompileController<'a> {
|
||||
let mut control = CompileController::basic();
|
||||
|
||||
control.keep_ast = sess.opts.debugging_opts.keep_ast || save_analysis(sess);
|
||||
control.keep_ast = sess.opts.debugging_opts.keep_ast;
|
||||
control.continue_parse_after_error = sess.opts.debugging_opts.continue_parse_after_error;
|
||||
|
||||
if let Some((ppm, opt_uii)) = parse_pretty(sess, matches) {
|
||||
if ppm.needs_ast_map(&opt_uii) {
|
||||
@ -574,19 +575,7 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
|
||||
}
|
||||
|
||||
if save_analysis(sess) {
|
||||
control.after_analysis.callback = box |state| {
|
||||
time(state.session.time_passes(), "save analysis", || {
|
||||
save::process_crate(state.tcx.unwrap(),
|
||||
state.expanded_crate.unwrap(),
|
||||
state.analysis.unwrap(),
|
||||
state.crate_name.unwrap(),
|
||||
None,
|
||||
DumpHandler::new(state.out_dir,
|
||||
state.crate_name.unwrap()))
|
||||
});
|
||||
};
|
||||
control.after_analysis.run_callback_on_error = true;
|
||||
control.make_glob_map = resolve::MakeGlobMap::Yes;
|
||||
enable_save_analysis(&mut control);
|
||||
}
|
||||
|
||||
if sess.print_fuel_crate.is_some() {
|
||||
@ -603,6 +592,23 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn enable_save_analysis(control: &mut CompileController) {
|
||||
control.keep_ast = true;
|
||||
control.after_analysis.callback = box |state| {
|
||||
time(state.session.time_passes(), "save analysis", || {
|
||||
save::process_crate(state.tcx.unwrap(),
|
||||
state.expanded_crate.unwrap(),
|
||||
state.analysis.unwrap(),
|
||||
state.crate_name.unwrap(),
|
||||
None,
|
||||
DumpHandler::new(state.out_dir,
|
||||
state.crate_name.unwrap()))
|
||||
});
|
||||
};
|
||||
control.after_analysis.run_callback_on_error = true;
|
||||
control.make_glob_map = resolve::MakeGlobMap::Yes;
|
||||
}
|
||||
|
||||
fn save_analysis(sess: &Session) -> bool {
|
||||
sess.opts.debugging_opts.save_analysis
|
||||
}
|
||||
@ -1215,7 +1221,7 @@ pub fn diagnostics_registry() -> errors::registry::Registry {
|
||||
Registry::new(&all_errors)
|
||||
}
|
||||
|
||||
fn get_args() -> Vec<String> {
|
||||
pub fn get_args() -> Vec<String> {
|
||||
env::args_os().enumerate()
|
||||
.map(|(i, arg)| arg.into_string().unwrap_or_else(|arg| {
|
||||
early_error(ErrorOutputType::default(),
|
||||
|
@ -119,7 +119,9 @@ fn test_env<F>(source_string: &str,
|
||||
name: driver::anon_src(),
|
||||
input: source_string.to_string(),
|
||||
};
|
||||
let krate = driver::phase_1_parse_input(&sess, &input).unwrap();
|
||||
let krate = driver::phase_1_parse_input(&driver::CompileController::basic(),
|
||||
&sess,
|
||||
&input).unwrap();
|
||||
let driver::ExpansionResult { defs, resolutions, mut hir_forest, .. } = {
|
||||
driver::phase_2_configure_and_expand(&sess,
|
||||
&cstore,
|
||||
|
@ -155,7 +155,9 @@ pub fn run_core(search_paths: SearchPaths,
|
||||
target_features::add_configuration(&mut cfg, &sess);
|
||||
sess.parse_sess.config = cfg;
|
||||
|
||||
let krate = panictry!(driver::phase_1_parse_input(&sess, &input));
|
||||
let krate = panictry!(driver::phase_1_parse_input(&driver::CompileController::basic(),
|
||||
&sess,
|
||||
&input));
|
||||
|
||||
let name = link::find_crate_name(Some(&sess), &krate.attrs, &input);
|
||||
|
||||
|
@ -91,7 +91,9 @@ pub fn run(input: &str,
|
||||
sess.parse_sess.config =
|
||||
config::build_configuration(&sess, config::parse_cfgspecs(cfgs.clone()));
|
||||
|
||||
let krate = panictry!(driver::phase_1_parse_input(&sess, &input));
|
||||
let krate = panictry!(driver::phase_1_parse_input(&driver::CompileController::basic(),
|
||||
&sess,
|
||||
&input));
|
||||
let driver::ExpansionResult { defs, mut hir_forest, .. } = {
|
||||
phase_2_configure_and_expand(
|
||||
&sess, &cstore, krate, None, "rustdoc-test", None, MakeGlobMap::No, |_| Ok(())
|
||||
|
Loading…
Reference in New Issue
Block a user