Skip to content

Commit a250c2d

Browse files
committed
refactor remove trailing return diagnostic
1 parent 98e6f43 commit a250c2d

File tree

2 files changed

+24
-32
lines changed

2 files changed

+24
-32
lines changed

crates/hir/src/diagnostics.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use cfg::{CfgExpr, CfgOptions};
1111
use either::Either;
1212
use hir_def::{body::SyntheticSyntax, hir::ExprOrPatId, path::ModPath, AssocItemId, DefWithBodyId};
1313
use hir_expand::{name::Name, HirFileId, InFile};
14-
use syntax::{ast, AstNode, AstPtr, SyntaxError, SyntaxNodePtr, TextRange};
14+
use syntax::{ast, AstPtr, SyntaxError, SyntaxNodePtr, TextRange};
1515

1616
use crate::{AssocItem, Field, Local, MacroKind, Trait, Type};
1717

@@ -346,8 +346,7 @@ pub struct TraitImplRedundantAssocItems {
346346

347347
#[derive(Debug)]
348348
pub struct RemoveTrailingReturn {
349-
pub file_id: HirFileId,
350-
pub return_expr: AstPtr<ast::Expr>,
349+
pub return_expr: InFile<AstPtr<ast::ReturnExpr>>,
351350
}
352351

353352
#[derive(Debug)]
@@ -460,11 +459,10 @@ impl AnyDiagnostic {
460459
BodyValidationDiagnostic::RemoveTrailingReturn { return_expr } => {
461460
if let Ok(source_ptr) = source_map.expr_syntax(return_expr) {
462461
// Filters out desugared return expressions (e.g. desugared try operators).
463-
if ast::ReturnExpr::can_cast(source_ptr.value.kind()) {
462+
if let Some(ptr) = source_ptr.value.cast::<ast::ReturnExpr>() {
464463
return Some(
465464
RemoveTrailingReturn {
466-
file_id: source_ptr.file_id,
467-
return_expr: source_ptr.value,
465+
return_expr: InFile::new(source_ptr.file_id, ptr),
468466
}
469467
.into(),
470468
);

crates/ide-diagnostics/src/handlers/remove_trailing_return.rs

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
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};
44
use 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

3131
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+
}
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)]
6256
mod tests {
6357
use crate::tests::{check_diagnostics, check_fix};

0 commit comments

Comments
 (0)