Skip to content

Commit 1d94e23

Browse files
committed
Handle tuple indexing expression in argument position in Generate function
1 parent 4dc3314 commit 1d94e23

File tree

1 file changed

+41
-18
lines changed

1 file changed

+41
-18
lines changed

crates/ide_assists/src/handlers/generate_function.rs

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -438,10 +438,7 @@ fn fn_args(
438438
let mut arg_names = Vec::new();
439439
let mut arg_types = Vec::new();
440440
for arg in call.arg_list()?.args() {
441-
arg_names.push(match fn_arg_name(&arg) {
442-
Some(name) => name,
443-
None => String::from("arg"),
444-
});
441+
arg_names.push(fn_arg_name(&arg));
445442
arg_types.push(match fn_arg_type(ctx, target_module, &arg) {
446443
Some(ty) => {
447444
if !ty.is_empty() && ty.starts_with('&') {
@@ -506,18 +503,21 @@ fn deduplicate_arg_names(arg_names: &mut Vec<String>) {
506503
}
507504
}
508505

509-
fn fn_arg_name(fn_arg: &ast::Expr) -> Option<String> {
510-
match fn_arg {
511-
ast::Expr::CastExpr(cast_expr) => fn_arg_name(&cast_expr.expr()?),
512-
_ => {
513-
let s = fn_arg
514-
.syntax()
515-
.descendants()
516-
.filter(|d| ast::NameRef::can_cast(d.kind()))
517-
.last()?
518-
.to_string();
506+
fn fn_arg_name(arg_expr: &ast::Expr) -> String {
507+
let name = (|| match arg_expr {
508+
ast::Expr::CastExpr(cast_expr) => Some(fn_arg_name(&cast_expr.expr()?)),
509+
expr => {
510+
let s = expr.syntax().descendants().filter_map(ast::NameRef::cast).last()?.to_string();
519511
Some(to_lower_snake_case(&s))
520512
}
513+
})();
514+
match name {
515+
Some(mut name) if name.starts_with(|c: char| c.is_ascii_digit()) => {
516+
name.insert_str(0, "arg");
517+
name
518+
}
519+
Some(name) => name,
520+
None => "arg".to_string(),
521521
}
522522
}
523523

@@ -1647,20 +1647,43 @@ fn bar() ${0:-> _} {
16471647
fn no_panic_on_invalid_global_path() {
16481648
check_assist(
16491649
generate_function,
1650-
r#"
1650+
r"
16511651
fn main() {
16521652
::foo$0();
16531653
}
1654-
"#,
1655-
r#"
1654+
",
1655+
r"
16561656
fn main() {
16571657
::foo();
16581658
}
16591659
16601660
fn foo() ${0:-> _} {
16611661
todo!()
16621662
}
1663-
"#,
1663+
",
1664+
)
1665+
}
1666+
1667+
#[test]
1668+
fn handle_tuple_indexing() {
1669+
check_assist(
1670+
generate_function,
1671+
r"
1672+
fn main() {
1673+
let a = ((),);
1674+
foo$0(a.0);
1675+
}
1676+
",
1677+
r"
1678+
fn main() {
1679+
let a = ((),);
1680+
foo(a.0);
1681+
}
1682+
1683+
fn foo(arg0: ()) ${0:-> _} {
1684+
todo!()
1685+
}
1686+
",
16641687
)
16651688
}
16661689
}

0 commit comments

Comments
 (0)