Fix postfix snippets duplicating derefs

This commit is contained in:
Chayim Refael Friedman 2025-05-08 11:43:47 +03:00
parent 0551bde817
commit 6e8ad1666a
2 changed files with 33 additions and 13 deletions

View File

@ -311,6 +311,8 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, String) {
let mut prefix = String::new();
let mut found_ref_or_deref = false;
while let Some(parent_deref_element) =
resulting_element.syntax().parent().and_then(ast::PrefixExpr::cast)
{
@ -318,27 +320,26 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, String) {
break;
}
found_ref_or_deref = true;
resulting_element = ast::Expr::from(parent_deref_element);
prefix.insert(0, '*');
}
if let Some(first_ref_expr) = resulting_element.syntax().parent().and_then(ast::RefExpr::cast) {
if let Some(expr) = first_ref_expr.expr() {
resulting_element = expr;
}
while let Some(parent_ref_element) =
resulting_element.syntax().parent().and_then(ast::RefExpr::cast)
{
found_ref_or_deref = true;
let exclusive = parent_ref_element.mut_token().is_some();
resulting_element = ast::Expr::from(parent_ref_element);
while let Some(parent_ref_element) =
resulting_element.syntax().parent().and_then(ast::RefExpr::cast)
{
let exclusive = parent_ref_element.mut_token().is_some();
resulting_element = ast::Expr::from(parent_ref_element);
prefix.insert_str(0, if exclusive { "&mut " } else { "&" });
}
prefix.insert_str(0, if exclusive { "&mut " } else { "&" });
}
} else {
// If we do not find any ref expressions, restore
if !found_ref_or_deref {
// If we do not find any ref/deref expressions, restore
// all the progress of tree climbing
prefix.clear();
resulting_element = initial_element.clone();
}

View File

@ -2174,3 +2174,22 @@ fn bar() {
"#,
);
}
#[test]
fn dbg_too_many_asterisks() {
check_edit(
"dbg",
r#"
fn main() {
let x = &42;
let y = *x.$0;
}
"#,
r#"
fn main() {
let x = &42;
let y = dbg!(*x);
}
"#,
);
}