1- use ide_db:: base_db:: { FileRange , SourceDatabase } ;
21use syntax:: {
3- algo:: find_node_at_range,
42 ast:: { self , HasArgList } ,
53 AstNode , TextRange ,
64} ;
75
8- use crate :: { Diagnostic , DiagnosticsContext } ;
6+ use crate :: { adjusted_display_range , Diagnostic , DiagnosticsContext } ;
97
108// Diagnostic: mismatched-arg-count
119//
@@ -20,40 +18,32 @@ pub(crate) fn mismatched_arg_count(
2018}
2119
2220fn 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+ }
4134 }
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+ }
4443 }
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- }
5544
56- range
45+ None
46+ } )
5747}
5848
5949#[ cfg( test) ]
0 commit comments