@@ -8,7 +8,7 @@ use stdx::format_to;
8
8
use syntax:: {
9
9
algo,
10
10
ast:: { self , HasArgList } ,
11
- AstNode , Direction , SyntaxToken , TextRange , TextSize ,
11
+ match_ast , AstNode , Direction , SyntaxToken , TextRange , TextSize ,
12
12
} ;
13
13
14
14
use crate :: RootDatabase ;
@@ -66,20 +66,34 @@ pub(crate) fn signature_help(db: &RootDatabase, position: FilePosition) -> Optio
66
66
. and_then ( |tok| algo:: skip_trivia_token ( tok, Direction :: Prev ) ) ?;
67
67
let token = sema. descend_into_macros_single ( token) ;
68
68
69
- if let Some ( help) = signature_help_for_call ( & sema, & token) {
70
- return Some ( help) ;
71
- }
72
-
73
- if let Some ( help) = signature_help_for_generics ( & sema, & token) {
74
- return Some ( help) ;
69
+ for node in token. ancestors ( ) {
70
+ match_ast ! {
71
+ match node {
72
+ ast:: ArgList ( arg_list) => {
73
+ let cursor_outside = arg_list. r_paren_token( ) . as_ref( ) == Some ( & token) ;
74
+ if cursor_outside {
75
+ return None ;
76
+ }
77
+ return signature_help_for_call( & sema, token) ;
78
+ } ,
79
+ ast:: GenericArgList ( garg_list) => {
80
+ let cursor_outside = garg_list. r_angle_token( ) . as_ref( ) == Some ( & token) ;
81
+ if cursor_outside {
82
+ return None ;
83
+ }
84
+ return signature_help_for_generics( & sema, token) ;
85
+ } ,
86
+ _ => ( ) ,
87
+ }
88
+ }
75
89
}
76
90
77
91
None
78
92
}
79
93
80
94
fn signature_help_for_call (
81
95
sema : & Semantics < RootDatabase > ,
82
- token : & SyntaxToken ,
96
+ token : SyntaxToken ,
83
97
) -> Option < SignatureHelp > {
84
98
// Find the calling expression and its NameRef
85
99
let mut node = token. parent ( ) ?;
@@ -104,7 +118,7 @@ fn signature_help_for_call(
104
118
node = node. parent ( ) ?;
105
119
} ;
106
120
107
- let ( callable, active_parameter) = callable_for_node ( sema, & calling_node, token) ?;
121
+ let ( callable, active_parameter) = callable_for_node ( sema, & calling_node, & token) ?;
108
122
109
123
let mut res =
110
124
SignatureHelp { doc : None , signature : String :: new ( ) , parameters : vec ! [ ] , active_parameter } ;
@@ -183,7 +197,7 @@ fn signature_help_for_call(
183
197
184
198
fn signature_help_for_generics (
185
199
sema : & Semantics < RootDatabase > ,
186
- token : & SyntaxToken ,
200
+ token : SyntaxToken ,
187
201
) -> Option < SignatureHelp > {
188
202
let parent = token. parent ( ) ?;
189
203
let arg_list = parent
@@ -691,6 +705,28 @@ fn bar() { foo $0 (3, ); }
691
705
) ;
692
706
}
693
707
708
+ #[ test]
709
+ fn outside_of_arg_list ( ) {
710
+ check (
711
+ r#"
712
+ fn foo(a: u8) {}
713
+ fn f() {
714
+ foo(123)$0
715
+ }
716
+ "# ,
717
+ expect ! [ [ ] ] ,
718
+ ) ;
719
+ check (
720
+ r#"
721
+ fn foo<T>(a: u8) {}
722
+ fn f() {
723
+ foo::<u32>$0()
724
+ }
725
+ "# ,
726
+ expect ! [ [ ] ] ,
727
+ ) ;
728
+ }
729
+
694
730
#[ test]
695
731
fn test_nested_method_in_lambda ( ) {
696
732
check (
0 commit comments