@@ -74,31 +74,40 @@ pub(crate) fn signature_help(db: &RootDatabase, position: FilePosition) -> Optio
74
74
ast:: ArgList ( arg_list) => {
75
75
let cursor_outside = arg_list. r_paren_token( ) . as_ref( ) == Some ( & token) ;
76
76
if cursor_outside {
77
- return None ;
77
+ continue ;
78
78
}
79
- return signature_help_for_call( & sema, token) ;
79
+ return signature_help_for_call( & sema, arg_list , token) ;
80
80
} ,
81
81
ast:: GenericArgList ( garg_list) => {
82
82
let cursor_outside = garg_list. r_angle_token( ) . as_ref( ) == Some ( & token) ;
83
83
if cursor_outside {
84
- return None ;
84
+ continue ;
85
85
}
86
- return signature_help_for_generics( & sema, token) ;
86
+ return signature_help_for_generics( & sema, garg_list , token) ;
87
87
} ,
88
88
_ => ( ) ,
89
89
}
90
90
}
91
+
92
+ // Stop at multi-line expressions, since the signature of the outer call is not very
93
+ // helpful inside them.
94
+ if let Some ( expr) = ast:: Expr :: cast ( node. clone ( ) ) {
95
+ if expr. syntax ( ) . text ( ) . contains_char ( '\n' ) {
96
+ return None ;
97
+ }
98
+ }
91
99
}
92
100
93
101
None
94
102
}
95
103
96
104
fn signature_help_for_call (
97
105
sema : & Semantics < ' _ , RootDatabase > ,
106
+ arg_list : ast:: ArgList ,
98
107
token : SyntaxToken ,
99
108
) -> Option < SignatureHelp > {
100
109
// Find the calling expression and its NameRef
101
- let mut node = token . parent ( ) ?;
110
+ let mut node = arg_list . syntax ( ) . parent ( ) ?;
102
111
let calling_node = loop {
103
112
if let Some ( callable) = ast:: CallableExpr :: cast ( node. clone ( ) ) {
104
113
if callable
@@ -109,14 +118,6 @@ fn signature_help_for_call(
109
118
}
110
119
}
111
120
112
- // Stop at multi-line expressions, since the signature of the outer call is not very
113
- // helpful inside them.
114
- if let Some ( expr) = ast:: Expr :: cast ( node. clone ( ) ) {
115
- if expr. syntax ( ) . text ( ) . contains_char ( '\n' ) {
116
- return None ;
117
- }
118
- }
119
-
120
121
node = node. parent ( ) ?;
121
122
} ;
122
123
@@ -200,10 +201,11 @@ fn signature_help_for_call(
200
201
201
202
fn signature_help_for_generics (
202
203
sema : & Semantics < ' _ , RootDatabase > ,
204
+ garg_list : ast:: GenericArgList ,
203
205
token : SyntaxToken ,
204
206
) -> Option < SignatureHelp > {
205
- let parent = token . parent ( ) ? ;
206
- let arg_list = parent
207
+ let arg_list = garg_list
208
+ . syntax ( )
207
209
. ancestors ( )
208
210
. filter_map ( ast:: GenericArgList :: cast)
209
211
. find ( |list| list. syntax ( ) . text_range ( ) . contains ( token. text_range ( ) . start ( ) ) ) ?;
@@ -770,6 +772,32 @@ fn f() {
770
772
"# ,
771
773
expect ! [ [ ] ] ,
772
774
) ;
775
+ check (
776
+ r#"
777
+ fn foo(a: u8) -> u8 {a}
778
+ fn bar(a: u8) -> u8 {a}
779
+ fn f() {
780
+ foo(bar(123)$0)
781
+ }
782
+ "# ,
783
+ expect ! [ [ r#"
784
+ fn foo(a: u8) -> u8
785
+ ^^^^^
786
+ "# ] ] ,
787
+ ) ;
788
+ check (
789
+ r#"
790
+ struct Vec<T>(T);
791
+ struct Vec2<T>(T);
792
+ fn f() {
793
+ let _: Vec2<Vec<u8>$0>
794
+ }
795
+ "# ,
796
+ expect ! [ [ r#"
797
+ struct Vec2<T>
798
+ ^
799
+ "# ] ] ,
800
+ ) ;
773
801
}
774
802
775
803
#[ test]
0 commit comments