diff options
| author | QuietMisdreavus <grey@quietmisdreavus.net> | 2018-10-30 10:20:58 -0500 |
|---|---|---|
| committer | QuietMisdreavus <grey@quietmisdreavus.net> | 2018-11-02 16:24:58 -0500 |
| commit | 157833c588a9526783745c05db97aedaec0a1819 (patch) | |
| tree | ebe3f0fc189db5613c9329844f71a74775f83250 | |
| parent | f5f496efd086ae763075295eac8aae757909f29c (diff) | |
| download | rust-157833c588a9526783745c05db97aedaec0a1819.tar.gz rust-157833c588a9526783745c05db97aedaec0a1819.zip | |
swap uses of Matches with pre-parsed args
| -rw-r--r-- | src/librustdoc/config.rs | 22 | ||||
| -rw-r--r-- | src/librustdoc/html/markdown.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/html/render.rs | 16 | ||||
| -rw-r--r-- | src/librustdoc/lib.rs | 128 | ||||
| -rw-r--r-- | src/librustdoc/markdown.rs | 11 |
5 files changed, 68 insertions, 111 deletions
diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs index 4a9b3574cd8..9a91f5f555e 100644 --- a/src/librustdoc/config.rs +++ b/src/librustdoc/config.rs @@ -32,6 +32,7 @@ use opts; use passes::{self, DefaultPassOption}; use theme; +#[derive(Clone)] pub struct Options { // Basic options / Options passed directly to rustc @@ -330,6 +331,14 @@ impl Options { } }; + match matches.opt_str("r").as_ref().map(|s| &**s) { + Some("rust") | None => {} + Some(s) => { + diag.struct_err(&format!("unknown input format: {}", s)).emit(); + return Err(1); + } + } + match matches.opt_str("w").as_ref().map(|s| &**s) { Some("html") | None => {} Some(s) => { @@ -448,6 +457,19 @@ fn check_deprecated_options(matches: &getopts::Matches, diag: &errors::Handler) err.emit(); } } + + let removed_flags = [ + "plugins", + "plugin-path", + ]; + + for &flag in removed_flags.iter() { + if matches.opt_present(flag) { + diag.struct_warn(&format!("the '{}' flag no longer functions", flag)) + .warn("see CVE-2018-1000622") + .emit(); + } + } } /// Extracts `--extern-html-root-url` arguments from `matches` and returns a map of crate names to diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index 22fa887c358..966befd8689 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -905,7 +905,7 @@ pub fn markdown_links(md: &str) -> Vec<(String, Option<Range<usize>>)> { links } -#[derive(Default)] +#[derive(Clone, Default)] pub struct IdMap { map: FxHashMap<String, usize>, } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 3f0ef61f375..e7417a91284 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -55,7 +55,6 @@ use std::rc::Rc; use externalfiles::ExternalHtml; use errors; -use getopts; use serialize::json::{ToJson, Json, as_json}; use syntax::ast; @@ -70,6 +69,7 @@ use rustc::util::nodemap::{FxHashMap, FxHashSet}; use rustc_data_structures::flock; use clean::{self, AttributesExt, GetDefId, SelfTy, Mutability}; +use config; use doctree; use fold::DocFolder; use html::escape::Escape; @@ -509,7 +509,7 @@ pub fn run(mut krate: clean::Crate, id_map: IdMap, enable_index_page: bool, index_page: Option<PathBuf>, - matches: &getopts::Matches, + options: config::Options, diag: &errors::Handler, ) -> Result<(), Error> { let src_root = match krate.src { @@ -678,7 +678,7 @@ pub fn run(mut krate: clean::Crate, CACHE_KEY.with(|v| *v.borrow_mut() = cache.clone()); CURRENT_LOCATION_KEY.with(|s| s.borrow_mut().clear()); - write_shared(&cx, &krate, &*cache, index, enable_minification, matches, diag)?; + write_shared(&cx, &krate, &*cache, index, enable_minification, &options, diag)?; // And finally render the whole crate's documentation cx.krate(krate) @@ -760,7 +760,7 @@ fn write_shared( cache: &Cache, search_index: String, enable_minification: bool, - matches: &getopts::Matches, + options: &config::Options, diag: &errors::Handler, ) -> Result<(), Error> { // Write out the shared files. Note that these are shared among all rustdoc @@ -994,9 +994,11 @@ themePicker.onblur = handleThemeButtonsBlur; if let Some(ref index_page) = cx.index_page { ::markdown::render(index_page, cx.dst.clone(), - &matches, &(*cx.shared).layout.external_html, - !matches.opt_present("markdown-no-toc"), - diag); + &options.markdown_css.clone(), + options.markdown_playground_url.clone() + .or_else(|| options.playground_url.clone()), + &(*cx.shared).layout.external_html, + !options.markdown_no_toc, diag); } else { let dst = cx.dst.join("index.html"); let mut w = BufWriter::new(try_err!(File::create(&dst), &dst)); diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index a9ed5386f61..a21613d6cd7 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -56,16 +56,11 @@ extern crate serialize as rustc_serialize; // used by deriving use std::default::Default; use std::env; use std::panic; -use std::path::PathBuf; use std::process; use std::sync::mpsc::channel; -use syntax::edition::Edition; use rustc::session::{early_warn, early_error}; -use rustc::session::search_paths::SearchPaths; -use rustc::session::config::{ErrorOutputType, RustcOptGroup, Externs, CodegenOptions}; -use rustc_target::spec::TargetTriple; -use rustc::session::config::get_cmd_lint_options; +use rustc::session::config::{ErrorOutputType, RustcOptGroup}; #[macro_use] mod externalfiles; @@ -387,17 +382,23 @@ fn main_args(args: &[String]) -> isize { options.codegen_options) } (false, true) => return markdown::render(&options.input, options.output, - &matches, + &options.markdown_css, + options.markdown_playground_url + .or(options.playground_url), &options.external_html, !options.markdown_no_toc, &diag), (false, false) => {} } - let res = acquire_input(options.input.clone(), options.externs.clone(), options.edition, - options.codegen_options.clone(), matches, options.error_format, - move |out, matches| { + //TODO: split render-time options into their own struct so i don't have to clone here + rust_input(options.clone(), move |out| { let Output { krate, passes, renderinfo } = out; info!("going to format"); + let diag = core::new_handler(options.error_format, + None, + options.debugging_options.treat_err_as_bug, + options.debugging_options.ui_testing); + let html_opts = options.clone(); html::render::run(krate, options.extern_html_root_urls, &options.external_html, options.playground_url, options.output, options.resource_suffix, @@ -408,106 +409,48 @@ fn main_args(args: &[String]) -> isize { options.themes, options.enable_minification, options.id_map, options.enable_index_page, options.index_page, - &matches, + html_opts, &diag) .expect("failed to generate documentation"); 0 - }); - res.unwrap_or_else(|s| { - diag.struct_err(&format!("input error: {}", s)).emit(); - 1 }) } -/// Looks inside the command line arguments to extract the relevant input format -/// and files and then generates the necessary rustdoc output for formatting. -fn acquire_input<R, F>(input: PathBuf, - externs: Externs, - edition: Edition, - cg: CodegenOptions, - matches: getopts::Matches, - error_format: ErrorOutputType, - f: F) - -> Result<R, String> -where R: 'static + Send, F: 'static + Send + FnOnce(Output, &getopts::Matches) -> R { - match matches.opt_str("r").as_ref().map(|s| &**s) { - Some("rust") => Ok(rust_input(input, externs, edition, cg, matches, error_format, f)), - Some(s) => Err(format!("unknown input format: {}", s)), - None => Ok(rust_input(input, externs, edition, cg, matches, error_format, f)) - } -} - /// Interprets the input file as a rust source file, passing it through the /// compiler all the way through the analysis passes. The rustdoc output is then /// generated from the cleaned AST of the crate. /// /// This form of input will run all of the plug/cleaning passes -fn rust_input<R, F>(cratefile: PathBuf, - externs: Externs, - edition: Edition, - cg: CodegenOptions, - matches: getopts::Matches, - error_format: ErrorOutputType, +fn rust_input<R, F>(options: config::Options, f: F) -> R where R: 'static + Send, - F: 'static + Send + FnOnce(Output, &getopts::Matches) -> R + F: 'static + Send + FnOnce(Output) -> R { - let default_passes = if matches.opt_present("no-defaults") { - passes::DefaultPassOption::None - } else if matches.opt_present("document-private-items") { - passes::DefaultPassOption::Private - } else { - passes::DefaultPassOption::Default - }; - - let manual_passes = matches.opt_strs("passes"); - let plugins = matches.opt_strs("plugins"); - // First, parse the crate and extract all relevant information. - let mut paths = SearchPaths::new(); - for s in &matches.opt_strs("L") { - paths.add_path(s, ErrorOutputType::default()); - } - let mut cfgs = matches.opt_strs("cfg"); - cfgs.push("rustdoc".to_string()); - let triple = matches.opt_str("target").map(|target| { - if target.ends_with(".json") { - TargetTriple::TargetPath(PathBuf::from(target)) - } else { - TargetTriple::TargetTriple(target) - } - }); - let maybe_sysroot = matches.opt_str("sysroot").map(PathBuf::from); - let crate_name = matches.opt_str("crate-name"); - let crate_version = matches.opt_str("crate-version"); - let plugin_path = matches.opt_str("plugin-path"); - info!("starting to run rustc"); - let display_warnings = matches.opt_present("display-warnings"); - - let force_unstable_if_unmarked = matches.opt_strs("Z").iter().any(|x| { - *x == "force-unstable-if-unmarked" - }); - let treat_err_as_bug = matches.opt_strs("Z").iter().any(|x| { - *x == "treat-err-as-bug" - }); - let ui_testing = matches.opt_strs("Z").iter().any(|x| { - *x == "ui-testing" - }); - - let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(&matches, error_format); let (tx, rx) = channel(); let result = rustc_driver::monitor(move || syntax::with_globals(move || { use rustc::session::config::Input; + let paths = options.libs; + let cfgs = options.cfgs; + let triple = options.target; + let maybe_sysroot = options.maybe_sysroot; + let crate_name = options.crate_name; + let crate_version = options.crate_version; + let force_unstable_if_unmarked = options.debugging_options.force_unstable_if_unmarked; + let treat_err_as_bug = options.debugging_options.treat_err_as_bug; + let ui_testing = options.debugging_options.ui_testing; + let (mut krate, renderinfo, passes) = - core::run_core(paths, cfgs, externs, Input::File(cratefile), triple, maybe_sysroot, - display_warnings, crate_name.clone(), - force_unstable_if_unmarked, edition, cg, error_format, - lint_opts, lint_cap, describe_lints, manual_passes, default_passes, - treat_err_as_bug, ui_testing); + core::run_core(paths, cfgs, options.externs, Input::File(options.input), triple, maybe_sysroot, + options.display_warnings, crate_name.clone(), + force_unstable_if_unmarked, options.edition, options.codegen_options, options.error_format, + options.lint_opts, options.lint_cap, options.describe_lints, + options.manual_passes, options.default_passes, treat_err_as_bug, + ui_testing); info!("finished with rustc"); @@ -517,14 +460,6 @@ where R: 'static + Send, krate.version = crate_version; - if !plugins.is_empty() { - eprintln!("WARNING: --plugins no longer functions; see CVE-2018-1000622"); - } - - if !plugin_path.is_none() { - eprintln!("WARNING: --plugin-path no longer functions; see CVE-2018-1000622"); - } - info!("Executing passes"); for pass in &passes { @@ -547,8 +482,7 @@ where R: 'static + Send, krate = pass(krate); } - tx.send(f(Output { krate: krate, renderinfo: renderinfo, passes: passes }, - &matches)).unwrap(); + tx.send(f(Output { krate: krate, renderinfo: renderinfo, passes: passes })).unwrap(); })); match result { diff --git a/src/librustdoc/markdown.rs b/src/librustdoc/markdown.rs index d8243bb3586..dde104a62a8 100644 --- a/src/librustdoc/markdown.rs +++ b/src/librustdoc/markdown.rs @@ -15,7 +15,6 @@ use std::path::{PathBuf, Path}; use std::cell::RefCell; use errors; -use getopts; use testing; use rustc::session::search_paths::SearchPaths; use rustc::session::config::{Externs, CodegenOptions}; @@ -51,13 +50,14 @@ fn extract_leading_metadata<'a>(s: &'a str) -> (Vec<&'a str>, &'a str) { /// Render `input` (e.g. "foo.md") into an HTML file in `output` /// (e.g. output = "bar" => "bar/foo.html"). -pub fn render(input: &Path, mut output: PathBuf, matches: &getopts::Matches, - external_html: &ExternalHtml, include_toc: bool, diag: &errors::Handler) -> isize { +pub fn render(input: &Path, mut output: PathBuf, markdown_css: &[String], + playground_url: Option<String>, external_html: &ExternalHtml, include_toc: bool, + diag: &errors::Handler) -> isize { output.push(input.file_stem().unwrap()); output.set_extension("html"); let mut css = String::new(); - for name in &matches.opt_strs("markdown-css") { + for name in markdown_css { let s = format!("<link rel=\"stylesheet\" type=\"text/css\" href=\"{}\">\n", name); css.push_str(&s) } @@ -67,8 +67,7 @@ pub fn render(input: &Path, mut output: PathBuf, matches: &getopts::Matches, Err(LoadStringError::ReadFail) => return 1, Err(LoadStringError::BadUtf8) => return 2, }; - if let Some(playground) = matches.opt_str("markdown-playground-url").or( - matches.opt_str("playground-url")) { + if let Some(playground) = playground_url { markdown::PLAYGROUND.with(|s| { *s.borrow_mut() = Some((None, playground)); }); } |
