From 8d8876c0b75ea6ee5ee5eac6abf78fb92c9ac9f3 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Tue, 8 Aug 2017 16:32:47 +1200 Subject: [PATCH 1/2] driver: factor out a helper and make another helper public --- src/librustc_driver/lib.rs | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 4c337993468e6..b4b7446f753d0 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -518,7 +518,7 @@ 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; if let Some((ppm, opt_uii)) = parse_pretty(sess, matches) { if ppm.needs_ast_map(&opt_uii) { @@ -574,19 +574,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 +591,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 +1220,7 @@ pub fn diagnostics_registry() -> errors::registry::Registry { Registry::new(&all_errors) } -fn get_args() -> Vec { +pub fn get_args() -> Vec { env::args_os().enumerate() .map(|(i, arg)| arg.into_string().unwrap_or_else(|arg| { early_error(ErrorOutputType::default(), From a9a181d4dcac6d5e347ef7157e91877fac648c56 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Tue, 8 Aug 2017 17:10:08 +1200 Subject: [PATCH 2/2] driver: factor out `continue_parse_after_error` so it can be controlled via driver API --- src/librustc_driver/driver.rs | 23 +++++++++++++++-------- src/librustc_driver/lib.rs | 1 + src/librustc_driver/test.rs | 4 +++- src/librustdoc/core.rs | 4 +++- src/librustdoc/test.rs | 4 +++- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 12cb556afdabc..22f98454f6c4a 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -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, - out_file: &'a Option) - -> Self { + session: &'tcx Session, + out_dir: &'a Option, + out_file: &'a Option) + -> 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 { diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index b4b7446f753d0..a3c2957ff90d8 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -519,6 +519,7 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls { let mut control = CompileController::basic(); 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) { diff --git a/src/librustc_driver/test.rs b/src/librustc_driver/test.rs index 62e20a90f8a08..8668ab301543b 100644 --- a/src/librustc_driver/test.rs +++ b/src/librustc_driver/test.rs @@ -119,7 +119,9 @@ fn test_env(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, diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 62b91feb09d0b..e101e29fc6fbb 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -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); diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index f012fd974b574..b1e92b5190f37 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -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(())