mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-02 10:18:25 +00:00
Rollup merge of #139863 - fmease:simp-doctest-build-arg-passing, r=GuillaumeGomez
rustdoc: Replace unstable flag `--doctest-compilation-args` with a simpler one: `--doctest-build-arg` Tracking issue: https://github.com/rust-lang/rust/issues/134172. Context: https://github.com/rust-lang/rust/pull/137096#issuecomment-2776318800 Yeets the ad hoc shell-like lexer for 'nested' program arguments. No FCP necessary since the flag is unstable. I've chosen to replace `compilation` with `build` because it's shorter (you now need to pass it multiple times in order to pass many arguments to the doctest compiler, so it matters a bit) and since I prefer it esthetically. **Issue**: Even though we don't process the argument passed to `--doctest-build-arg`, we end up passing it via an argument file (`rustc `@argfile`)` which delimits arguments by line break (LF or CRLF, [via](https://doc.rust-lang.org/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path)) meaning ultimately the arguments still get split which is unfortunate. Still, I think this change is an improvement over the status quo. I'll update the tracking issue if/once this PR merges. I'll also add the (CR)LF issue to 'unresolved question'. r? GuillaumeGomez r? notriddle
This commit is contained in:
commit
7a5bbe0527
@ -174,7 +174,7 @@ pub(crate) struct Options {
|
||||
pub(crate) expanded_args: Vec<String>,
|
||||
|
||||
/// Arguments to be used when compiling doctests.
|
||||
pub(crate) doctest_compilation_args: Vec<String>,
|
||||
pub(crate) doctest_build_args: Vec<String>,
|
||||
}
|
||||
|
||||
impl fmt::Debug for Options {
|
||||
@ -802,7 +802,7 @@ impl Options {
|
||||
let scrape_examples_options = ScrapeExamplesOptions::new(matches, dcx);
|
||||
let with_examples = matches.opt_strs("with-examples");
|
||||
let call_locations = crate::scrape_examples::load_call_locations(with_examples, dcx);
|
||||
let doctest_compilation_args = matches.opt_strs("doctest-compilation-args");
|
||||
let doctest_build_args = matches.opt_strs("doctest-build-arg");
|
||||
|
||||
let unstable_features =
|
||||
rustc_feature::UnstableFeatures::from_environment(crate_name.as_deref());
|
||||
@ -851,7 +851,7 @@ impl Options {
|
||||
scrape_examples_options,
|
||||
unstable_features,
|
||||
expanded_args: args,
|
||||
doctest_compilation_args,
|
||||
doctest_build_args,
|
||||
};
|
||||
let render_options = RenderOptions {
|
||||
output,
|
||||
|
@ -51,46 +51,6 @@ pub(crate) struct GlobalTestOptions {
|
||||
pub(crate) args_file: PathBuf,
|
||||
}
|
||||
|
||||
/// Function used to split command line arguments just like a shell would.
|
||||
fn split_args(args: &str) -> Vec<String> {
|
||||
let mut out = Vec::new();
|
||||
let mut iter = args.chars();
|
||||
let mut current = String::new();
|
||||
|
||||
while let Some(c) = iter.next() {
|
||||
if c == '\\' {
|
||||
if let Some(c) = iter.next() {
|
||||
// If it's escaped, even a quote or a whitespace will be ignored.
|
||||
current.push(c);
|
||||
}
|
||||
} else if c == '"' || c == '\'' {
|
||||
while let Some(new_c) = iter.next() {
|
||||
if new_c == c {
|
||||
break;
|
||||
} else if new_c == '\\' {
|
||||
if let Some(c) = iter.next() {
|
||||
// If it's escaped, even a quote will be ignored.
|
||||
current.push(c);
|
||||
}
|
||||
} else {
|
||||
current.push(new_c);
|
||||
}
|
||||
}
|
||||
} else if " \n\t\r".contains(c) {
|
||||
if !current.is_empty() {
|
||||
out.push(current.clone());
|
||||
current.clear();
|
||||
}
|
||||
} else {
|
||||
current.push(c);
|
||||
}
|
||||
}
|
||||
if !current.is_empty() {
|
||||
out.push(current);
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
pub(crate) fn generate_args_file(file_path: &Path, options: &RustdocOptions) -> Result<(), String> {
|
||||
let mut file = File::create(file_path)
|
||||
.map_err(|error| format!("failed to create args file: {error:?}"))?;
|
||||
@ -119,9 +79,7 @@ pub(crate) fn generate_args_file(file_path: &Path, options: &RustdocOptions) ->
|
||||
content.push(format!("-Z{unstable_option_str}"));
|
||||
}
|
||||
|
||||
for compilation_args in &options.doctest_compilation_args {
|
||||
content.extend(split_args(compilation_args));
|
||||
}
|
||||
content.extend(options.doctest_build_args.clone());
|
||||
|
||||
let content = content.join("\n");
|
||||
|
||||
|
@ -381,28 +381,6 @@ fn main() {
|
||||
assert_eq!((output, len), (expected, 1));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn check_split_args() {
|
||||
fn compare(input: &str, expected: &[&str]) {
|
||||
let output = super::split_args(input);
|
||||
let expected = expected.iter().map(|s| s.to_string()).collect::<Vec<_>>();
|
||||
assert_eq!(expected, output, "test failed for {input:?}");
|
||||
}
|
||||
|
||||
compare("'a' \"b\"c", &["a", "bc"]);
|
||||
compare("'a' \"b \"c d", &["a", "b c", "d"]);
|
||||
compare("'a' \"b\\\"c\"", &["a", "b\"c"]);
|
||||
compare("'a\"'", &["a\""]);
|
||||
compare("\"a'\"", &["a'"]);
|
||||
compare("\\ a", &[" a"]);
|
||||
compare("\\\\", &["\\"]);
|
||||
compare("a'", &["a"]);
|
||||
compare("a ", &["a"]);
|
||||
compare("a b", &["a", "b"]);
|
||||
compare("a\n\t \rb", &["a", "b"]);
|
||||
compare("a\n\t1 \rb", &["a", "1", "b"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn comment_in_attrs() {
|
||||
// If there is an inline code comment after attributes, we need to ensure that
|
||||
|
@ -654,9 +654,9 @@ fn opts() -> Vec<RustcOptGroup> {
|
||||
Unstable,
|
||||
Multi,
|
||||
"",
|
||||
"doctest-compilation-args",
|
||||
"",
|
||||
"add arguments to be used when compiling doctests",
|
||||
"doctest-build-arg",
|
||||
"One argument (of possibly many) to be used when compiling doctests",
|
||||
"ARG",
|
||||
),
|
||||
opt(
|
||||
Unstable,
|
||||
|
@ -188,8 +188,9 @@ Options:
|
||||
from provided path. Only use with --merge=finalize
|
||||
--html-no-source
|
||||
Disable HTML source code pages generation
|
||||
--doctest-compilation-args add arguments to be used when compiling doctests
|
||||
|
||||
--doctest-build-arg ARG
|
||||
One argument (of possibly many) to be used when
|
||||
compiling doctests
|
||||
--disable-minification
|
||||
disable the minification of CSS/JS files
|
||||
(perma-unstable, do not use with cached files)
|
||||
|
@ -1,9 +1,8 @@
|
||||
// This test checks that the test behave when `--doctest-compilation-args` is passed
|
||||
// multiple times.
|
||||
// This test checks that the test behave when `--doctest-build-arg` is passed multiple times.
|
||||
|
||||
//@ check-pass
|
||||
//@ compile-flags: --test -Zunstable-options --doctest-compilation-args=--cfg=testcase_must_be_present
|
||||
//@ compile-flags: --doctest-compilation-args=--cfg=another
|
||||
//@ compile-flags: --test -Zunstable-options --doctest-build-arg=--cfg=testcase_must_be_present
|
||||
//@ compile-flags: --doctest-build-arg=--cfg=another
|
||||
//@ normalize-stdout: "tests/rustdoc-ui/doctest" -> "$$DIR"
|
||||
//@ normalize-stdout: "finished in \d+\.\d+s" -> "finished in $$TIME"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
running 1 test
|
||||
test $DIR/rustflags-multiple-args.rs - Bar (line 10) ... ok
|
||||
test $DIR/rustflags-multiple-args.rs - Bar (line 9) ... ok
|
||||
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
//@ check-pass
|
||||
//@ compile-flags: --test -Zunstable-options --doctest-compilation-args=--cfg=testcase_must_be_present
|
||||
//@ compile-flags: --test -Zunstable-options --doctest-build-arg=--cfg=testcase_must_be_present
|
||||
//@ normalize-stdout: "tests/rustdoc-ui/doctest" -> "$$DIR"
|
||||
//@ normalize-stdout: "finished in \d+\.\d+s" -> "finished in $$TIME"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user