Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/diagnostics.rs')
-rw-r--r--crates/hir/src/diagnostics.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs
index 487e0c8f7a..08843a6c99 100644
--- a/crates/hir/src/diagnostics.rs
+++ b/crates/hir/src/diagnostics.rs
@@ -67,8 +67,9 @@ diagnostics![
NoSuchField,
PrivateAssocItem,
PrivateField,
- ReplaceFilterMapNextWithFindMap,
+ RemoveTrailingReturn,
RemoveUnnecessaryElse,
+ ReplaceFilterMapNextWithFindMap,
TraitImplIncorrectSafety,
TraitImplMissingAssocItems,
TraitImplOrphan,
@@ -344,6 +345,11 @@ pub struct TraitImplRedundantAssocItems {
}
#[derive(Debug)]
+pub struct RemoveTrailingReturn {
+ pub return_expr: InFile<AstPtr<ast::ReturnExpr>>,
+}
+
+#[derive(Debug)]
pub struct RemoveUnnecessaryElse {
pub if_expr: InFile<AstPtr<ast::IfExpr>>,
}
@@ -450,6 +456,19 @@ impl AnyDiagnostic {
Err(SyntheticSyntax) => (),
}
}
+ BodyValidationDiagnostic::RemoveTrailingReturn { return_expr } => {
+ if let Ok(source_ptr) = source_map.expr_syntax(return_expr) {
+ // Filters out desugared return expressions (e.g. desugared try operators).
+ if let Some(ptr) = source_ptr.value.cast::<ast::ReturnExpr>() {
+ return Some(
+ RemoveTrailingReturn {
+ return_expr: InFile::new(source_ptr.file_id, ptr),
+ }
+ .into(),
+ );
+ }
+ }
+ }
BodyValidationDiagnostic::RemoveUnnecessaryElse { if_expr } => {
if let Ok(source_ptr) = source_map.expr_syntax(if_expr) {
if let Some(ptr) = source_ptr.value.cast::<ast::IfExpr>() {