1
- use hir:: { db:: ExpandDatabase , diagnostics:: RemoveTrailingReturn , HirFileIdExt , InFile } ;
2
- use ide_db:: { assists:: Assist , source_change:: SourceChange } ;
3
- use syntax:: { ast, AstNode , SyntaxNodePtr } ;
1
+ use hir:: { db:: ExpandDatabase , diagnostics:: RemoveTrailingReturn } ;
2
+ use ide_db:: { assists:: Assist , base_db :: FileRange , source_change:: SourceChange } ;
3
+ use syntax:: { ast, AstNode } ;
4
4
use text_edit:: TextEdit ;
5
5
6
- use crate :: { fix, Diagnostic , DiagnosticCode , DiagnosticsContext } ;
6
+ use crate :: { adjusted_display_range , fix, Diagnostic , DiagnosticCode , DiagnosticsContext } ;
7
7
8
8
// Diagnostic: remove-trailing-return
9
9
//
@@ -13,12 +13,12 @@ pub(crate) fn remove_trailing_return(
13
13
ctx : & DiagnosticsContext < ' _ > ,
14
14
d : & RemoveTrailingReturn ,
15
15
) -> Diagnostic {
16
- let display_range = ctx. sema . diagnostics_display_range ( InFile {
17
- file_id : d . file_id ,
18
- value : expr_stmt ( ctx , d )
19
- . as_ref ( )
20
- . map ( |stmt| SyntaxNodePtr :: new ( stmt . syntax ( ) ) )
21
- . unwrap_or_else ( || d . return_expr . into ( ) ) ,
16
+ let display_range = adjusted_display_range ( ctx, d . return_expr , & |return_expr| {
17
+ return_expr
18
+ . syntax ( )
19
+ . parent ( )
20
+ . and_then ( ast :: ExprStmt :: cast )
21
+ . map ( |stmt| stmt . syntax ( ) . text_range ( ) )
22
22
} ) ;
23
23
Diagnostic :: new (
24
24
DiagnosticCode :: Clippy ( "needless_return" ) ,
@@ -29,15 +29,20 @@ pub(crate) fn remove_trailing_return(
29
29
}
30
30
31
31
fn fixes ( ctx : & DiagnosticsContext < ' _ > , d : & RemoveTrailingReturn ) -> Option < Vec < Assist > > {
32
- let return_expr = return_expr ( ctx, d) ?;
33
- let stmt = expr_stmt ( ctx, d) ;
32
+ let root = ctx. sema . db . parse_or_expand ( d. return_expr . file_id ) ;
33
+ let return_expr = d. return_expr . value . to_node ( & root) ;
34
+ let stmt = return_expr. syntax ( ) . parent ( ) . and_then ( ast:: ExprStmt :: cast) ;
35
+
36
+ let FileRange { range, file_id } =
37
+ ctx. sema . original_range_opt ( stmt. as_ref ( ) . map_or ( return_expr. syntax ( ) , AstNode :: syntax) ) ?;
38
+ if Some ( file_id) != d. return_expr . file_id . file_id ( ) {
39
+ return None ;
40
+ }
34
41
35
- let range = stmt. as_ref ( ) . map_or ( return_expr. syntax ( ) , AstNode :: syntax) . text_range ( ) ;
36
42
let replacement =
37
43
return_expr. expr ( ) . map_or_else ( String :: new, |expr| format ! ( "{}" , expr. syntax( ) . text( ) ) ) ;
38
-
39
44
let edit = TextEdit :: replace ( range, replacement) ;
40
- let source_change = SourceChange :: from_text_edit ( d . file_id . original_file ( ctx . sema . db ) , edit) ;
45
+ let source_change = SourceChange :: from_text_edit ( file_id, edit) ;
41
46
42
47
Some ( vec ! [ fix(
43
48
"remove_trailing_return" ,
@@ -47,17 +52,6 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &RemoveTrailingReturn) -> Option<Vec<A
47
52
) ] )
48
53
}
49
54
50
- fn return_expr ( ctx : & DiagnosticsContext < ' _ > , d : & RemoveTrailingReturn ) -> Option < ast:: ReturnExpr > {
51
- let root = ctx. sema . db . parse_or_expand ( d. file_id ) ;
52
- let expr = d. return_expr . to_node ( & root) ;
53
- ast:: ReturnExpr :: cast ( expr. syntax ( ) . clone ( ) )
54
- }
55
-
56
- fn expr_stmt ( ctx : & DiagnosticsContext < ' _ > , d : & RemoveTrailingReturn ) -> Option < ast:: ExprStmt > {
57
- let return_expr = return_expr ( ctx, d) ?;
58
- return_expr. syntax ( ) . parent ( ) . and_then ( ast:: ExprStmt :: cast)
59
- }
60
-
61
55
#[ cfg( test) ]
62
56
mod tests {
63
57
use crate :: tests:: { check_diagnostics, check_fix} ;
0 commit comments