Skip to content

Commit 48056e5

Browse files
committed
Allow scraping examples from library
1 parent d19cfd2 commit 48056e5

File tree

4 files changed

+48
-25
lines changed

4 files changed

+48
-25
lines changed

src/bin/cargo/commands/doc.rs

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::command_prelude::*;
22

3-
use cargo::ops::{self, DocOptions};
3+
use anyhow::anyhow;
4+
use cargo::ops::{self, CompileFilter, DocOptions, FilterRule, LibRule};
45

56
pub fn cli() -> App {
67
subcommand("doc")
@@ -19,10 +20,13 @@ pub fn cli() -> App {
1920
)
2021
.arg(opt("no-deps", "Don't build documentation for dependencies"))
2122
.arg(opt("document-private-items", "Document private items"))
22-
.arg(opt(
23-
"scrape-examples",
24-
"Scrape examples from examples/ directory to include as function documentation",
25-
))
23+
.arg(
24+
opt(
25+
"scrape-examples",
26+
"Scrape examples from examples/ directory to include as function documentation",
27+
)
28+
.value_name("FLAGS"),
29+
)
2630
.arg_jobs()
2731
.arg_targets_lib_bin_example(
2832
"Document only this package's library",
@@ -51,9 +55,35 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
5155
let mut compile_opts =
5256
args.compile_options(config, mode, Some(&ws), ProfileChecking::Custom)?;
5357
compile_opts.rustdoc_document_private_items = args.is_present("document-private-items");
54-
compile_opts.rustdoc_scrape_examples = args.is_present("scrape-examples");
58+
compile_opts.rustdoc_scrape_examples = match args.value_of("scrape-examples") {
59+
Some(s) => {
60+
let (examples, lib) = match s {
61+
"all" => (true, true),
62+
"examples" => (true, false),
63+
"lib" => (false, true),
64+
_ => {
65+
return Err(CliError::from(anyhow!(
66+
r#"--scrape-examples must take "all", "examples", or "lib" as an argument"#
67+
)));
68+
}
69+
};
70+
Some(CompileFilter::Only {
71+
all_targets: false,
72+
lib: if lib { LibRule::True } else { LibRule::False },
73+
bins: FilterRule::none(),
74+
examples: if examples {
75+
FilterRule::All
76+
} else {
77+
FilterRule::none()
78+
},
79+
benches: FilterRule::none(),
80+
tests: FilterRule::none(),
81+
})
82+
}
83+
None => None,
84+
};
5585

56-
if compile_opts.rustdoc_scrape_examples {
86+
if compile_opts.rustdoc_scrape_examples.is_some() {
5787
// FIXME(wcrichto): add a tracking issue once this gets merged and add issue number below
5888
config
5989
.cli_unstable()

src/cargo/ops/cargo_compile.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub struct CompileOptions {
8080
pub rustdoc_document_private_items: bool,
8181
/// Whether the `--scrape-examples` flag was specified and build flags for
8282
/// examples should be forwarded to `rustdoc`.
83-
pub rustdoc_scrape_examples: bool,
83+
pub rustdoc_scrape_examples: Option<CompileFilter>,
8484
/// Whether the build process should check the minimum Rust version
8585
/// defined in the cargo metadata for a crate.
8686
pub honor_rust_version: bool,
@@ -99,7 +99,7 @@ impl<'a> CompileOptions {
9999
target_rustc_args: None,
100100
local_rustdoc_args: None,
101101
rustdoc_document_private_items: false,
102-
rustdoc_scrape_examples: false,
102+
rustdoc_scrape_examples: None,
103103
honor_rust_version: true,
104104
})
105105
}
@@ -231,7 +231,7 @@ impl Packages {
231231
}
232232
}
233233

234-
#[derive(Debug, PartialEq, Eq)]
234+
#[derive(Debug, PartialEq, Eq, Clone)]
235235
pub enum LibRule {
236236
/// Include the library, fail if not present
237237
True,
@@ -241,13 +241,13 @@ pub enum LibRule {
241241
False,
242242
}
243243

244-
#[derive(Debug)]
244+
#[derive(Debug, Clone)]
245245
pub enum FilterRule {
246246
All,
247247
Just(Vec<String>),
248248
}
249249

250-
#[derive(Debug)]
250+
#[derive(Debug, Clone)]
251251
pub enum CompileFilter {
252252
Default {
253253
/// Flag whether targets can be safely skipped when required-features are not satisfied.
@@ -340,7 +340,7 @@ pub fn create_bcx<'a, 'cfg>(
340340
ref target_rustc_args,
341341
ref local_rustdoc_args,
342342
rustdoc_document_private_items,
343-
rustdoc_scrape_examples,
343+
ref rustdoc_scrape_examples,
344344
honor_rust_version,
345345
} = *options;
346346
let config = ws.config();
@@ -593,21 +593,14 @@ pub fn create_bcx<'a, 'cfg>(
593593
}
594594
}
595595

596-
if rustdoc_scrape_examples {
596+
if let Some(filter) = rustdoc_scrape_examples {
597597
let compile_mode = CompileMode::Doc { deps: false };
598598
let mut example_compile_opts = CompileOptions::new(ws.config(), compile_mode)?;
599599
example_compile_opts.cli_features = options.cli_features.clone();
600600
example_compile_opts.build_config.mode = compile_mode;
601601
example_compile_opts.spec = Packages::All;
602-
example_compile_opts.filter = CompileFilter::Only {
603-
all_targets: false,
604-
lib: LibRule::False,
605-
bins: FilterRule::none(),
606-
examples: FilterRule::All,
607-
benches: FilterRule::none(),
608-
tests: FilterRule::none(),
609-
};
610-
example_compile_opts.rustdoc_scrape_examples = false;
602+
example_compile_opts.filter = filter.clone();
603+
example_compile_opts.rustdoc_scrape_examples = None;
611604

612605
let exec: Arc<dyn Executor> = Arc::new(DefaultExecutor);
613606
let interner = UnitInterner::new();

src/cargo/ops/cargo_package.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ fn run_verify(
765765
target_rustc_args: rustc_args,
766766
local_rustdoc_args: None,
767767
rustdoc_document_private_items: false,
768-
rustdoc_scrape_examples: false,
768+
rustdoc_scrape_examples: None,
769769
honor_rust_version: true,
770770
},
771771
&exec,

src/cargo/util/command_prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ pub trait ArgMatchesExt {
544544
target_rustc_args: None,
545545
local_rustdoc_args: None,
546546
rustdoc_document_private_items: false,
547-
rustdoc_scrape_examples: false,
547+
rustdoc_scrape_examples: None,
548548
honor_rust_version: !self._is_present("ignore-rust-version"),
549549
};
550550

0 commit comments

Comments
 (0)