Unnamed repository; edit this file 'description' to name the repository.
fix "needless return" for trailing item declarations
davidsemakula 2024-02-16
parent db277c7 · commit 9ae0f92
-rw-r--r--crates/hir-def/src/body/lower.rs2
-rw-r--r--crates/hir-def/src/body/pretty.rs1
-rw-r--r--crates/hir-def/src/body/scope.rs1
-rw-r--r--crates/hir-def/src/hir.rs4
-rw-r--r--crates/hir-ty/src/infer/closure.rs1
-rw-r--r--crates/hir-ty/src/infer/expr.rs1
-rw-r--r--crates/hir-ty/src/infer/mutability.rs1
-rw-r--r--crates/hir-ty/src/mir/lower.rs1
-rw-r--r--crates/ide-diagnostics/src/handlers/remove_trailing_return.rs12
9 files changed, 23 insertions, 1 deletions
diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs
index 11b87f1952..5dc5fedd23 100644
--- a/crates/hir-def/src/body/lower.rs
+++ b/crates/hir-def/src/body/lower.rs
@@ -1113,7 +1113,7 @@ impl ExprCollector<'_> {
statements.push(Statement::Expr { expr, has_semi });
}
}
- ast::Stmt::Item(_item) => (),
+ ast::Stmt::Item(_item) => statements.push(Statement::Item),
}
}
diff --git a/crates/hir-def/src/body/pretty.rs b/crates/hir-def/src/body/pretty.rs
index 773b7c575e..7007dea638 100644
--- a/crates/hir-def/src/body/pretty.rs
+++ b/crates/hir-def/src/body/pretty.rs
@@ -628,6 +628,7 @@ impl Printer<'_> {
}
wln!(self);
}
+ Statement::Item => (),
}
}
diff --git a/crates/hir-def/src/body/scope.rs b/crates/hir-def/src/body/scope.rs
index ab623250d4..69b82ae871 100644
--- a/crates/hir-def/src/body/scope.rs
+++ b/crates/hir-def/src/body/scope.rs
@@ -197,6 +197,7 @@ fn compute_block_scopes(
Statement::Expr { expr, .. } => {
compute_expr_scopes(*expr, body, scopes, scope);
}
+ Statement::Item => (),
}
}
if let Some(expr) = tail {
diff --git a/crates/hir-def/src/hir.rs b/crates/hir-def/src/hir.rs
index f008ae761a..bbe62f27b9 100644
--- a/crates/hir-def/src/hir.rs
+++ b/crates/hir-def/src/hir.rs
@@ -352,6 +352,9 @@ pub enum Statement {
expr: ExprId,
has_semi: bool,
},
+ // At the moment, we only use this to figure out if a return expression
+ // is really the last statement of a block. See #16566
+ Item,
}
impl Expr {
@@ -385,6 +388,7 @@ impl Expr {
}
}
Statement::Expr { expr: expression, .. } => f(*expression),
+ Statement::Item => (),
}
}
if let &Some(expr) = tail {
diff --git a/crates/hir-ty/src/infer/closure.rs b/crates/hir-ty/src/infer/closure.rs
index 83ad6f54d6..22a70f951e 100644
--- a/crates/hir-ty/src/infer/closure.rs
+++ b/crates/hir-ty/src/infer/closure.rs
@@ -485,6 +485,7 @@ impl InferenceContext<'_> {
Statement::Expr { expr, has_semi: _ } => {
self.consume_expr(*expr);
}
+ Statement::Item => (),
}
}
if let Some(tail) = tail {
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index 30c676a240..428ed6748c 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -1389,6 +1389,7 @@ impl InferenceContext<'_> {
);
}
}
+ Statement::Item => (),
}
}
diff --git a/crates/hir-ty/src/infer/mutability.rs b/crates/hir-ty/src/infer/mutability.rs
index c9fc5bccea..00e5eac229 100644
--- a/crates/hir-ty/src/infer/mutability.rs
+++ b/crates/hir-ty/src/infer/mutability.rs
@@ -65,6 +65,7 @@ impl InferenceContext<'_> {
Statement::Expr { expr, has_semi: _ } => {
self.infer_mut_expr(*expr, Mutability::Not);
}
+ Statement::Item => (),
}
}
if let Some(tail) = tail {
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index dad1ed10ce..b038900cda 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -1781,6 +1781,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
self.push_fake_read(c, p, expr.into());
current = scope2.pop_and_drop(self, c, expr.into());
}
+ hir_def::hir::Statement::Item => (),
}
}
if let Some(tail) = tail {
diff --git a/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs b/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs
index a0d5d742d3..b7667dc318 100644
--- a/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs
+++ b/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs
@@ -183,6 +183,18 @@ fn foo() -> u8 {
}
#[test]
+ fn no_diagnostic_if_not_last_statement2() {
+ check_diagnostics(
+ r#"
+fn foo() -> u8 {
+ return 2;
+ fn bar() {}
+}
+"#,
+ );
+ }
+
+ #[test]
fn replace_with_expr() {
check_fix(
r#"