Merge pull request #20300 from A4-Tacks/fix-debug_assert-doc-gen

Fix gen panics doc template for debug_assert
This commit is contained in:
Chayim Refael Friedman 2025-07-29 05:56:59 +00:00 committed by GitHub
commit 4f407685b4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -313,12 +313,28 @@ fn crate_name(ast_func: &ast::Fn, ctx: &AssistContext<'_>) -> Option<String> {
/// `None` if function without a body; some bool to guess if function can panic
fn can_panic(ast_func: &ast::Fn) -> Option<bool> {
let body = ast_func.body()?.to_string();
let can_panic = body.contains("panic!(")
// FIXME it would be better to not match `debug_assert*!` macro invocations
|| body.contains("assert!(")
|| body.contains(".unwrap()")
|| body.contains(".expect(");
Some(can_panic)
let mut iter = body.chars();
let assert_postfix = |s| {
["!(", "_eq!(", "_ne!(", "_matches!("].iter().any(|postfix| str::starts_with(s, postfix))
};
while !iter.as_str().is_empty() {
let s = iter.as_str();
iter.next();
if s.strip_prefix("debug_assert").is_some_and(assert_postfix) {
iter.nth(10);
continue;
}
if s.strip_prefix("assert").is_some_and(assert_postfix)
|| s.starts_with("panic!(")
|| s.starts_with(".unwrap()")
|| s.starts_with(".expect(")
{
return Some(true);
}
}
Some(false)
}
/// Helper function to get the name that should be given to `self` arguments
@ -677,6 +693,24 @@ pub fn panics_if(a: bool) {
);
}
#[test]
fn guesses_debug_assert_macro_cannot_panic() {
check_assist(
generate_documentation_template,
r#"
pub fn $0debug_panics_if_not(a: bool) {
debug_assert!(a == true);
}
"#,
r#"
/// .
pub fn debug_panics_if_not(a: bool) {
debug_assert!(a == true);
}
"#,
);
}
#[test]
fn guesses_assert_macro_can_panic() {
check_assist(
@ -699,6 +733,28 @@ pub fn panics_if_not(a: bool) {
);
}
#[test]
fn guesses_assert_eq_macro_can_panic() {
check_assist(
generate_documentation_template,
r#"
pub fn $0panics_if_not(a: bool) {
assert_eq!(a, true);
}
"#,
r#"
/// .
///
/// # Panics
///
/// Panics if .
pub fn panics_if_not(a: bool) {
assert_eq!(a, true);
}
"#,
);
}
#[test]
fn guesses_unwrap_can_panic() {
check_assist(