Skip to content

Commit

Permalink
Also handle cases where attributes are unclosed
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez committed Dec 16, 2024
1 parent 9c4a61f commit 2383985
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 18 deletions.
56 changes: 40 additions & 16 deletions src/librustdoc/doctest/make.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,17 @@ impl DocTestBuilder {
!lang_str.compile_fail && !lang_str.test_harness && !lang_str.standalone_crate
});

let SourceInfo { crate_attrs, maybe_crate_attrs, crates, everything_else } =
partition_source(source, edition);
let Some(SourceInfo { crate_attrs, maybe_crate_attrs, crates, everything_else }) =
partition_source(source, edition)
else {
return Self::invalid(
String::new(),
String::new(),
String::new(),
source.to_string(),
test_id,
);
};

// Uses librustc_ast to parse the doctest and find if there's a main fn and the extern
// crate already is included.
Expand All @@ -77,18 +86,7 @@ impl DocTestBuilder {
else {
// If the parser panicked due to a fatal error, pass the test code through unchanged.
// The error will be reported during compilation.
return Self {
supports_color: false,
has_main_fn: false,
crate_attrs,
maybe_crate_attrs,
crates,
everything_else,
already_has_extern_crate: false,
test_id,
failed_ast: true,
can_be_merged: false,
};
return Self::invalid(crate_attrs, maybe_crate_attrs, crates, everything_else, test_id);
};
// If the AST returned an error, we don't want this doctest to be merged with the
// others. Same if it contains `#[feature]` or `#[no_std]`.
Expand All @@ -113,6 +111,27 @@ impl DocTestBuilder {
}
}

fn invalid(
crate_attrs: String,
maybe_crate_attrs: String,
crates: String,
everything_else: String,
test_id: Option<String>,
) -> Self {
Self {
supports_color: false,
has_main_fn: false,
crate_attrs,
maybe_crate_attrs,
crates,
everything_else,
already_has_extern_crate: false,
test_id,
failed_ast: true,
can_be_merged: false,
}
}

/// Transforms a test into code that can be compiled into a Rust binary, and returns the number of
/// lines before the test code begins.
pub(crate) fn generate_unique_doctest(
Expand Down Expand Up @@ -533,7 +552,7 @@ struct SourceInfo {
everything_else: String,
}

fn partition_source(s: &str, edition: Edition) -> SourceInfo {
fn partition_source(s: &str, edition: Edition) -> Option<SourceInfo> {
#[derive(Copy, Clone, PartialEq)]
enum PartitionState {
Attrs,
Expand Down Expand Up @@ -608,11 +627,16 @@ fn partition_source(s: &str, edition: Edition) -> SourceInfo {
}
}

if !mod_attr_pending.is_empty() {
debug!("invalid doctest code: {s:?}");
return None;
}

source_info.everything_else = source_info.everything_else.trim().to_string();

debug!("crate_attrs:\n{}{}", source_info.crate_attrs, source_info.maybe_crate_attrs);
debug!("crates:\n{}", source_info.crates);
debug!("after:\n{}", source_info.everything_else);

source_info
Some(source_info)
}
4 changes: 4 additions & 0 deletions tests/rustdoc-ui/doctest/comment-in-attr-134221.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,8 @@
foo,
)]
```
```rust
#![
```
*/
18 changes: 16 additions & 2 deletions tests/rustdoc-ui/doctest/comment-in-attr-134221.stdout
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@

running 2 tests
running 3 tests
test $DIR/comment-in-attr-134221.rs - (line 11) ... FAILED
test $DIR/comment-in-attr-134221.rs - (line 17) ... FAILED
test $DIR/comment-in-attr-134221.rs - (line 23) ... FAILED

failures:

Expand All @@ -26,11 +27,24 @@ LL | foo,
error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0635`.
Couldn't compile the test.
---- $DIR/comment-in-attr-134221.rs - (line 23) stdout ----
error: this file contains an unclosed delimiter
--> $DIR/comment-in-attr-134221.rs:$LINE:$COL
|
LL | #![
| -^
| |
| unclosed delimiter

error: aborting due to 1 previous error

Couldn't compile the test.

failures:
$DIR/comment-in-attr-134221.rs - (line 11)
$DIR/comment-in-attr-134221.rs - (line 17)
$DIR/comment-in-attr-134221.rs - (line 23)

test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME

0 comments on commit 2383985

Please sign in to comment.