about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2022-03-20 19:13:50 +0100
committerLukas Wirth <lukastw97@gmail.com>2022-03-20 19:13:50 +0100
commit3b7b223b25542fa36c185eb7e5f919e2c7e91eb7 (patch)
treedd281f08d2089e5b9499c6db6ae28989a14d769e
parent68de7b30e04ed56c7acd61f5aecc5f447691be12 (diff)
downloadrust-3b7b223b25542fa36c185eb7e5f919e2c7e91eb7.tar.gz
rust-3b7b223b25542fa36c185eb7e5f919e2c7e91eb7.zip
Simplify
-rw-r--r--crates/hir_def/src/body/lower.rs36
-rw-r--r--crates/hir_ty/src/diagnostics/unsafe_check.rs1
2 files changed, 16 insertions, 21 deletions
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs
index 661486d6e01..d1cfc501e5f 100644
--- a/crates/hir_def/src/body/lower.rs
+++ b/crates/hir_def/src/body/lower.rs
@@ -508,11 +508,8 @@ impl ExprCollector<'_> {
             }
             ast::Expr::MacroCall(e) => {
                 let macro_ptr = AstPtr::new(&e);
-                let mut id = None;
-                self.collect_macro_call(e, macro_ptr.clone(), true, |this, expansion| {
-                    if let Some(it) = expansion {
-                        id.get_or_insert(this.collect_expr(it));
-                    }
+                let id = self.collect_macro_call(e, macro_ptr.clone(), true, |this, expansion| {
+                    expansion.map(|it| this.collect_expr(it))
                 });
                 match id {
                     Some(id) => {
@@ -537,13 +534,17 @@ impl ExprCollector<'_> {
         })
     }
 
-    fn collect_macro_call<F: FnOnce(&mut Self, Option<T>), T: ast::AstNode>(
+    fn collect_macro_call<F, T, U>(
         &mut self,
         mcall: ast::MacroCall,
         syntax_ptr: AstPtr<ast::MacroCall>,
         record_diagnostics: bool,
         collector: F,
-    ) {
+    ) -> U
+    where
+        F: FnOnce(&mut Self, Option<T>) -> U,
+        T: ast::AstNode,
+    {
         // File containing the macro call. Expansion errors will be attached here.
         let outer_file = self.expander.current_file_id;
 
@@ -559,8 +560,7 @@ impl ExprCollector<'_> {
                         path,
                     });
                 }
-                collector(self, None);
-                return;
+                return collector(self, None);
             }
         };
 
@@ -634,7 +634,6 @@ impl ExprCollector<'_> {
                     let syntax_ptr = AstPtr::new(&stmt.expr().unwrap());
 
                     let prev_stmt = self.statements_in_scope.len();
-                    let mut tail = None;
                     self.collect_macro_call(m, macro_ptr.clone(), false, |this, expansion| {
                         match expansion {
                             Some(expansion) => {
@@ -643,7 +642,6 @@ impl ExprCollector<'_> {
                                 statements.statements().for_each(|stmt| this.collect_stmt(stmt));
                                 if let Some(expr) = statements.expr() {
                                     let expr = this.collect_expr(expr);
-                                    tail = Some(expr);
                                     this.statements_in_scope
                                         .push(Statement::Expr { expr, has_semi });
                                 }
@@ -654,6 +652,7 @@ impl ExprCollector<'_> {
                             }
                         }
                     });
+
                     let mut macro_exprs = smallvec![];
                     for stmt in &self.statements_in_scope[prev_stmt..] {
                         match *stmt {
@@ -664,7 +663,6 @@ impl ExprCollector<'_> {
                             Statement::Expr { expr, .. } => macro_exprs.push(expr),
                         }
                     }
-                    macro_exprs.extend(tail);
                     if !macro_exprs.is_empty() {
                         self.source_map
                             .macro_call_to_exprs
@@ -894,15 +892,11 @@ impl ExprCollector<'_> {
             ast::Pat::MacroPat(mac) => match mac.macro_call() {
                 Some(call) => {
                     let macro_ptr = AstPtr::new(&call);
-                    let mut pat = None;
-                    self.collect_macro_call(call, macro_ptr, true, |this, expanded_pat| {
-                        pat = Some(this.collect_pat_opt_(expanded_pat));
-                    });
-
-                    match pat {
-                        Some(pat) => return pat,
-                        None => Pat::Missing,
-                    }
+                    let pat =
+                        self.collect_macro_call(call, macro_ptr, true, |this, expanded_pat| {
+                            this.collect_pat_opt_(expanded_pat)
+                        });
+                    return pat;
                 }
                 None => Pat::Missing,
             },
diff --git a/crates/hir_ty/src/diagnostics/unsafe_check.rs b/crates/hir_ty/src/diagnostics/unsafe_check.rs
index 4e0dcf7b618..b0fc49fc619 100644
--- a/crates/hir_ty/src/diagnostics/unsafe_check.rs
+++ b/crates/hir_ty/src/diagnostics/unsafe_check.rs
@@ -37,6 +37,7 @@ pub struct UnsafeExpr {
     pub inside_unsafe_block: bool,
 }
 
+// FIXME: Move this out, its not a diagnostic only thing anymore, and handle unsafe pattern accesses as well
 pub fn unsafe_expressions(
     db: &dyn HirDatabase,
     infer: &InferenceResult,