Also handle cases where attributes are unclosed

This commit is contained in:
Guillaume Gomez 2024-12-16 13:59:41 +01:00
parent 9c4a61ff52
commit 2383985342
3 changed files with 60 additions and 18 deletions

View file

@ -51,8 +51,17 @@ impl DocTestBuilder {
!lang_str.compile_fail && !lang_str.test_harness && !lang_str.standalone_crate !lang_str.compile_fail && !lang_str.test_harness && !lang_str.standalone_crate
}); });
let SourceInfo { crate_attrs, maybe_crate_attrs, crates, everything_else } = let Some(SourceInfo { crate_attrs, maybe_crate_attrs, crates, everything_else }) =
partition_source(source, edition); 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 // Uses librustc_ast to parse the doctest and find if there's a main fn and the extern
// crate already is included. // crate already is included.
@ -77,18 +86,7 @@ impl DocTestBuilder {
else { else {
// If the parser panicked due to a fatal error, pass the test code through unchanged. // If the parser panicked due to a fatal error, pass the test code through unchanged.
// The error will be reported during compilation. // The error will be reported during compilation.
return Self { return Self::invalid(crate_attrs, maybe_crate_attrs, crates, everything_else, test_id);
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,
};
}; };
// If the AST returned an error, we don't want this doctest to be merged with the // 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]`. // others. Same if it contains `#[feature]` or `#[no_std]`.
@ -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 /// Transforms a test into code that can be compiled into a Rust binary, and returns the number of
/// lines before the test code begins. /// lines before the test code begins.
pub(crate) fn generate_unique_doctest( pub(crate) fn generate_unique_doctest(
@ -533,7 +552,7 @@ struct SourceInfo {
everything_else: String, everything_else: String,
} }
fn partition_source(s: &str, edition: Edition) -> SourceInfo { fn partition_source(s: &str, edition: Edition) -> Option<SourceInfo> {
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
enum PartitionState { enum PartitionState {
Attrs, Attrs,
@ -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(); 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!("crate_attrs:\n{}{}", source_info.crate_attrs, source_info.maybe_crate_attrs);
debug!("crates:\n{}", source_info.crates); debug!("crates:\n{}", source_info.crates);
debug!("after:\n{}", source_info.everything_else); debug!("after:\n{}", source_info.everything_else);
source_info Some(source_info)
} }

View file

@ -20,4 +20,8 @@
foo, foo,
)] )]
``` ```
```rust
#![
```
*/ */

View file

@ -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 11) ... FAILED
test $DIR/comment-in-attr-134221.rs - (line 17) ... FAILED test $DIR/comment-in-attr-134221.rs - (line 17) ... FAILED
test $DIR/comment-in-attr-134221.rs - (line 23) ... FAILED
failures: failures:
@ -26,11 +27,24 @@ LL | foo,
error: aborting due to 1 previous error error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0635`. 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. Couldn't compile the test.
failures: failures:
$DIR/comment-in-attr-134221.rs - (line 11) $DIR/comment-in-attr-134221.rs - (line 11)
$DIR/comment-in-attr-134221.rs - (line 17) $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