1
+ use ide_db:: base_db:: { FileRange , SourceDatabase } ;
2
+ use syntax:: {
3
+ algo:: find_node_at_range,
4
+ ast:: { self , HasArgList } ,
5
+ AstNode ,
6
+ } ;
7
+
1
8
use crate :: { Diagnostic , DiagnosticsContext } ;
2
9
3
10
// Diagnostic: mismatched-arg-count
@@ -12,10 +19,45 @@ pub(crate) fn mismatched_arg_count(
12
19
Diagnostic :: new (
13
20
"mismatched-arg-count" ,
14
21
message,
15
- ctx . sema . diagnostics_display_range ( d . call_expr . clone ( ) . map ( |it| it. into ( ) ) ) . range ,
22
+ invalid_args_range ( ctx , d ) . unwrap_or_else ( |it| it) . range ,
16
23
)
17
24
}
18
25
26
+ fn invalid_args_range (
27
+ ctx : & DiagnosticsContext < ' _ > ,
28
+ d : & hir:: MismatchedArgCount ,
29
+ ) -> Result < FileRange , FileRange > {
30
+ let full_range = ctx. sema . diagnostics_display_range ( d. call_expr . clone ( ) . map ( |it| it. into ( ) ) ) ;
31
+
32
+ let source_file = ctx. sema . db . parse ( full_range. file_id ) ;
33
+ let expr = find_node_at_range :: < ast:: Expr > ( & source_file. syntax_node ( ) , full_range. range )
34
+ . filter ( |it| it. syntax ( ) . text_range ( ) == full_range. range ) ;
35
+ let arg_list = match expr {
36
+ Some ( ast:: Expr :: CallExpr ( call) ) => call. arg_list ( ) ,
37
+ Some ( ast:: Expr :: MethodCallExpr ( call) ) => call. arg_list ( ) ,
38
+ _ => None ,
39
+ } ;
40
+ let arg_list = match arg_list {
41
+ Some ( it) => it,
42
+ None => return Err ( full_range) ,
43
+ } ;
44
+ let arg_list_range =
45
+ FileRange { file_id : full_range. file_id , range : arg_list. syntax ( ) . text_range ( ) } ;
46
+ if d. found < d. expected {
47
+ if d. found == 0 {
48
+ return Ok ( arg_list_range) ;
49
+ }
50
+ if let Some ( r_paren) = arg_list. r_paren_token ( ) {
51
+ return Ok ( FileRange { file_id : full_range. file_id , range : r_paren. text_range ( ) } ) ;
52
+ }
53
+ }
54
+ if d. expected < d. found {
55
+ return Ok ( arg_list_range) ;
56
+ }
57
+
58
+ Err ( full_range)
59
+ }
60
+
19
61
#[ cfg( test) ]
20
62
mod tests {
21
63
use crate :: tests:: check_diagnostics;
@@ -26,7 +68,7 @@ mod tests {
26
68
r#"
27
69
fn zero() {}
28
70
fn f() { zero(1); }
29
- //^^^^ ^^^ error: expected 0 arguments, found 1
71
+ // ^^^ error: expected 0 arguments, found 1
30
72
"# ,
31
73
) ;
32
74
@@ -44,7 +86,7 @@ fn f() { zero(); }
44
86
r#"
45
87
fn one(arg: u8) {}
46
88
fn f() { one(); }
47
- //^^^ ^^ error: expected 1 argument, found 0
89
+ // ^^ error: expected 1 argument, found 0
48
90
"# ,
49
91
) ;
50
92
@@ -65,7 +107,7 @@ impl S { fn method(&self) {} }
65
107
66
108
fn f() {
67
109
S::method();
68
- } //^^^^^^^^^ ^^ error: expected 1 argument, found 0
110
+ } // ^^ error: expected 1 argument, found 0
69
111
"# ,
70
112
) ;
71
113
@@ -91,7 +133,7 @@ impl S { fn method(&self, arg: u8) {} }
91
133
92
134
fn f() {
93
135
S.method();
94
- } //^^^^^^^^ ^^ error: expected 1 argument, found 0
136
+ } // ^^ error: expected 1 argument, found 0
95
137
"# ,
96
138
) ;
97
139
@@ -131,7 +173,7 @@ fn f() {
131
173
struct Tup(u8, u16);
132
174
fn f() {
133
175
Tup(0);
134
- } //^^^^^ ^ error: expected 2 arguments, found 1
176
+ } // ^ error: expected 2 arguments, found 1
135
177
"# ,
136
178
)
137
179
}
@@ -143,7 +185,7 @@ fn f() {
143
185
enum En { Variant(u8, u16), }
144
186
fn f() {
145
187
En::Variant(0);
146
- } //^^^^^^^^^^^^^ ^ error: expected 2 arguments, found 1
188
+ } // ^ error: expected 2 arguments, found 1
147
189
"# ,
148
190
)
149
191
}
@@ -162,9 +204,9 @@ impl Foo {
162
204
fn new() {
163
205
Foo::Bar(0);
164
206
Foo::Bar(0, 1);
165
- //^^^^^^^^ ^^^^^^ error: expected 1 argument, found 2
207
+ // ^^^^^^ error: expected 1 argument, found 2
166
208
Foo::Bar();
167
- //^^^^^^^^ ^^ error: expected 1 argument, found 0
209
+ // ^^ error: expected 1 argument, found 0
168
210
}
169
211
}
170
212
"# ,
@@ -185,7 +227,7 @@ fn f() {
185
227
unsafe {
186
228
fixed(0);
187
229
fixed(0, 1);
188
- //^^^^^ ^^^^^^ error: expected 1 argument, found 2
230
+ // ^^^^^^ error: expected 1 argument, found 2
189
231
varargs(0);
190
232
varargs(0, 1);
191
233
varargs2();
@@ -204,10 +246,10 @@ fn f() {
204
246
fn main() {
205
247
let f = |()| ();
206
248
f();
207
- //^ ^^ error: expected 1 argument, found 0
249
+ // ^^ error: expected 1 argument, found 0
208
250
f(());
209
251
f((), ());
210
- //^ ^^^^^^^^ error: expected 1 argument, found 2
252
+ // ^^^^^^^^ error: expected 1 argument, found 2
211
253
}
212
254
"# ,
213
255
)
0 commit comments