@@ -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"
16511651fn main() {
16521652 ::foo$0();
16531653}
1654- "# ,
1655- r# "
1654+ " ,
1655+ r"
16561656fn main() {
16571657 ::foo();
16581658}
16591659
16601660fn 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