1
- use ide_db:: base_db:: { FileRange , SourceDatabase } ;
2
1
use syntax:: {
3
- algo:: find_node_at_range,
4
2
ast:: { self , HasArgList } ,
5
3
AstNode , TextRange ,
6
4
} ;
7
5
8
- use crate :: { Diagnostic , DiagnosticsContext } ;
6
+ use crate :: { adjusted_display_range , Diagnostic , DiagnosticsContext } ;
9
7
10
8
// Diagnostic: mismatched-arg-count
11
9
//
@@ -20,40 +18,32 @@ pub(crate) fn mismatched_arg_count(
20
18
}
21
19
22
20
fn invalid_args_range ( ctx : & DiagnosticsContext < ' _ > , d : & hir:: MismatchedArgCount ) -> TextRange {
23
- let FileRange { file_id, range } =
24
- ctx. sema . diagnostics_display_range ( d. call_expr . clone ( ) . map ( |it| it. into ( ) ) ) ;
25
-
26
- let source_file = ctx. sema . db . parse ( file_id) ;
27
- let expr = find_node_at_range :: < ast:: Expr > ( & source_file. syntax_node ( ) , range)
28
- . filter ( |it| it. syntax ( ) . text_range ( ) == range) ;
29
- let arg_list = match expr {
30
- Some ( ast:: Expr :: CallExpr ( call) ) => call. arg_list ( ) ,
31
- Some ( ast:: Expr :: MethodCallExpr ( call) ) => call. arg_list ( ) ,
32
- _ => None ,
33
- } ;
34
- let arg_list = match arg_list {
35
- Some ( it) => it,
36
- None => return range,
37
- } ;
38
- if d. found < d. expected {
39
- if d. found == 0 {
40
- return arg_list. syntax ( ) . text_range ( ) ;
21
+ adjusted_display_range :: < ast:: Expr > ( ctx, d. call_expr . clone ( ) . map ( |it| it. into ( ) ) , & |expr| {
22
+ let arg_list = match expr {
23
+ ast:: Expr :: CallExpr ( call) => call. arg_list ( ) ?,
24
+ ast:: Expr :: MethodCallExpr ( call) => call. arg_list ( ) ?,
25
+ _ => return None ,
26
+ } ;
27
+ if d. found < d. expected {
28
+ if d. found == 0 {
29
+ return Some ( arg_list. syntax ( ) . text_range ( ) ) ;
30
+ }
31
+ if let Some ( r_paren) = arg_list. r_paren_token ( ) {
32
+ return Some ( r_paren. text_range ( ) ) ;
33
+ }
41
34
}
42
- if let Some ( r_paren) = arg_list. r_paren_token ( ) {
43
- return r_paren. text_range ( ) ;
35
+ if d. expected < d. found {
36
+ if d. expected == 0 {
37
+ return Some ( arg_list. syntax ( ) . text_range ( ) ) ;
38
+ }
39
+ let zip = arg_list. args ( ) . nth ( d. expected ) . zip ( arg_list. r_paren_token ( ) ) ;
40
+ if let Some ( ( arg, r_paren) ) = zip {
41
+ return Some ( arg. syntax ( ) . text_range ( ) . cover ( r_paren. text_range ( ) ) ) ;
42
+ }
44
43
}
45
- }
46
- if d. expected < d. found {
47
- if d. expected == 0 {
48
- return arg_list. syntax ( ) . text_range ( ) ;
49
- }
50
- let zip = arg_list. args ( ) . nth ( d. expected ) . zip ( arg_list. r_paren_token ( ) ) ;
51
- if let Some ( ( arg, r_paren) ) = zip {
52
- return arg. syntax ( ) . text_range ( ) . cover ( r_paren. text_range ( ) ) ;
53
- }
54
- }
55
44
56
- range
45
+ None
46
+ } )
57
47
}
58
48
59
49
#[ cfg( test) ]
0 commit comments