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 } ;
44use text_edit:: TextEdit ;
55
6- use crate :: { fix, Diagnostic , DiagnosticCode , DiagnosticsContext } ;
6+ use crate :: { adjusted_display_range , fix, Diagnostic , DiagnosticCode , DiagnosticsContext } ;
77
88// Diagnostic: remove-trailing-return
99//
@@ -13,12 +13,12 @@ pub(crate) fn remove_trailing_return(
1313 ctx : & DiagnosticsContext < ' _ > ,
1414 d : & RemoveTrailingReturn ,
1515) -> 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 ( ) )
2222 } ) ;
2323 Diagnostic :: new (
2424 DiagnosticCode :: Clippy ( "needless_return" ) ,
@@ -29,15 +29,20 @@ pub(crate) fn remove_trailing_return(
2929}
3030
3131fn 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+ }
3441
35- let range = stmt. as_ref ( ) . map_or ( return_expr. syntax ( ) , AstNode :: syntax) . text_range ( ) ;
3642 let replacement =
3743 return_expr. expr ( ) . map_or_else ( String :: new, |expr| format ! ( "{}" , expr. syntax( ) . text( ) ) ) ;
38-
3944 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) ;
4146
4247 Some ( vec ! [ fix(
4348 "remove_trailing_return" ,
@@ -47,17 +52,6 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &RemoveTrailingReturn) -> Option<Vec<A
4752 ) ] )
4853}
4954
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-
6155#[ cfg( test) ]
6256mod tests {
6357 use crate :: tests:: { check_diagnostics, check_fix} ;
0 commit comments