Skip to content

Commit 6e8ad16

Browse files
Fix postfix snippets duplicating derefs
1 parent 0551bde commit 6e8ad16

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

crates/ide-completion/src/completions/postfix.rs

+14-13
Original file line numberDiff line numberDiff line change
@@ -311,34 +311,35 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, String) {
311311

312312
let mut prefix = String::new();
313313

314+
let mut found_ref_or_deref = false;
315+
314316
while let Some(parent_deref_element) =
315317
resulting_element.syntax().parent().and_then(ast::PrefixExpr::cast)
316318
{
317319
if parent_deref_element.op_kind() != Some(ast::UnaryOp::Deref) {
318320
break;
319321
}
320322

323+
found_ref_or_deref = true;
321324
resulting_element = ast::Expr::from(parent_deref_element);
322325

323326
prefix.insert(0, '*');
324327
}
325328

326-
if let Some(first_ref_expr) = resulting_element.syntax().parent().and_then(ast::RefExpr::cast) {
327-
if let Some(expr) = first_ref_expr.expr() {
328-
resulting_element = expr;
329-
}
329+
while let Some(parent_ref_element) =
330+
resulting_element.syntax().parent().and_then(ast::RefExpr::cast)
331+
{
332+
found_ref_or_deref = true;
333+
let exclusive = parent_ref_element.mut_token().is_some();
334+
resulting_element = ast::Expr::from(parent_ref_element);
330335

331-
while let Some(parent_ref_element) =
332-
resulting_element.syntax().parent().and_then(ast::RefExpr::cast)
333-
{
334-
let exclusive = parent_ref_element.mut_token().is_some();
335-
resulting_element = ast::Expr::from(parent_ref_element);
336+
prefix.insert_str(0, if exclusive { "&mut " } else { "&" });
337+
}
336338

337-
prefix.insert_str(0, if exclusive { "&mut " } else { "&" });
338-
}
339-
} else {
340-
// If we do not find any ref expressions, restore
339+
if !found_ref_or_deref {
340+
// If we do not find any ref/deref expressions, restore
341341
// all the progress of tree climbing
342+
prefix.clear();
342343
resulting_element = initial_element.clone();
343344
}
344345

crates/ide-completion/src/tests/expression.rs

+19
Original file line numberDiff line numberDiff line change
@@ -2174,3 +2174,22 @@ fn bar() {
21742174
"#,
21752175
);
21762176
}
2177+
2178+
#[test]
2179+
fn dbg_too_many_asterisks() {
2180+
check_edit(
2181+
"dbg",
2182+
r#"
2183+
fn main() {
2184+
let x = &42;
2185+
let y = *x.$0;
2186+
}
2187+
"#,
2188+
r#"
2189+
fn main() {
2190+
let x = &42;
2191+
let y = dbg!(*x);
2192+
}
2193+
"#,
2194+
);
2195+
}

0 commit comments

Comments
 (0)