Skip to content

Commit

Permalink
Add --scrape-tests flags so rustdoc can scrape examples from tests
Browse files Browse the repository at this point in the history
  • Loading branch information
willcrichton committed Feb 12, 2022
1 parent 0c292c9 commit fbbcb08
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 5 deletions.
3 changes: 3 additions & 0 deletions src/doc/rustdoc/src/unstable-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -509,3 +509,6 @@ reverse-dependency like `examples/ex.rs` is given to rustdoc with the target
crate being documented (`foobar`) and a path to output the calls
(`output.calls`). Then, the generated calls file can be passed via
`--with-examples` to the subsequent documentation of `foobar`.

To scrape examples from test code, e.g. functions marked `#[test]`, then
add the `--scrape-tests` flag.
3 changes: 3 additions & 0 deletions src/librustdoc/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ crate fn create_config(
lint_opts,
describe_lints,
lint_cap,
scrape_examples_options,
..
}: RustdocOptions,
) -> rustc_interface::Config {
Expand Down Expand Up @@ -227,6 +228,7 @@ crate fn create_config(

let crate_types =
if proc_macro_crate { vec![CrateType::ProcMacro] } else { vec![CrateType::Rlib] };
let test = scrape_examples_options.map(|opts| opts.scrape_tests).unwrap_or(false);
// plays with error output here!
let sessopts = config::Options {
maybe_sysroot,
Expand All @@ -244,6 +246,7 @@ crate fn create_config(
edition,
describe_lints,
crate_name,
test,
..Options::default()
};

Expand Down
3 changes: 3 additions & 0 deletions src/librustdoc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,9 @@ fn opts() -> Vec<RustcOptGroup> {
"collect function call information for functions from the target crate",
)
}),
unstable("scrape-tests", |o| {
o.optflag("", "scrape-tests", "Include test code when scraping examples")
}),
unstable("with-examples", |o| {
o.optmulti(
"",
Expand Down
15 changes: 11 additions & 4 deletions src/librustdoc/scrape_examples.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ use std::path::PathBuf;
crate struct ScrapeExamplesOptions {
output_path: PathBuf,
target_crates: Vec<String>,
crate scrape_tests: bool,
}

impl ScrapeExamplesOptions {
Expand All @@ -43,16 +44,22 @@ impl ScrapeExamplesOptions {
) -> Result<Option<Self>, i32> {
let output_path = matches.opt_str("scrape-examples-output-path");
let target_crates = matches.opt_strs("scrape-examples-target-crate");
match (output_path, !target_crates.is_empty()) {
(Some(output_path), true) => Ok(Some(ScrapeExamplesOptions {
let scrape_tests = matches.opt_present("scrape-tests");
match (output_path, !target_crates.is_empty(), scrape_tests) {
(Some(output_path), true, _) => Ok(Some(ScrapeExamplesOptions {
output_path: PathBuf::from(output_path),
target_crates,
scrape_tests,
})),
(Some(_), false) | (None, true) => {
(Some(_), false, _) | (None, true, _) => {
diag.err("must use --scrape-examples-output-path and --scrape-examples-target-crate together");
Err(1)
}
(None, false) => Ok(None),
(None, false, true) => {
diag.err("must use --scrape-examples-output-path and --scrape-examples-target-crate with --scrape-tests");
Err(1)
}
(None, false, false) => Ok(None),
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/test/run-make/rustdoc-scrape-examples-multiple/scrape.mk
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ $(TMPDIR)/%.calls: $(TMPDIR)/libfoobar.rmeta
--extern foobar=$(TMPDIR)/libfoobar.rmeta \
-Z unstable-options \
--scrape-examples-output-path $@ \
--scrape-examples-target-crate foobar
--scrape-examples-target-crate foobar \
$(extra_flags)

$(TMPDIR)/lib%.rmeta: src/lib.rs
$(RUSTC) src/lib.rs --crate-name $* --crate-type lib --emit=metadata
Expand Down
6 changes: 6 additions & 0 deletions src/test/run-make/rustdoc-scrape-examples-test/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
extra_flags := --scrape-tests
deps := ex

-include ../rustdoc-scrape-examples-multiple/scrape.mk

all: scrape
6 changes: 6 additions & 0 deletions src/test/run-make/rustdoc-scrape-examples-test/examples/ex.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
fn main() {}

#[test]
fn a_test() {
foobar::ok();
}
3 changes: 3 additions & 0 deletions src/test/run-make/rustdoc-scrape-examples-test/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// @has foobar/fn.ok.html '//*[@class="docblock scraped-example-list"]' ''

pub fn ok() {}

0 comments on commit fbbcb08

Please sign in to comment.