Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/body/lower.rs')
| -rw-r--r-- | crates/hir-def/src/body/lower.rs | 45 |
1 files changed, 19 insertions, 26 deletions
diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs index 049afa8227..37a0940a3f 100644 --- a/crates/hir-def/src/body/lower.rs +++ b/crates/hir-def/src/body/lower.rs @@ -1,7 +1,7 @@ //! Transforms `ast::Expr` into an equivalent `hir_def::expr::Expr` //! representation. -use std::{mem, sync::Arc}; +use std::{collections::HashMap, mem, sync::Arc}; use either::Either; use hir_expand::{ @@ -10,8 +10,6 @@ use hir_expand::{ name::{name, AsName, Name}, ExpandError, HirFileId, InFile, }; -use la_arena::Arena; -use profile::Count; use rustc_hash::FxHashMap; use syntax::{ ast::{ @@ -28,8 +26,8 @@ use crate::{ builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint}, db::DefDatabase, expr::{ - dummy_expr_id, Array, BindingAnnotation, Expr, ExprId, FloatTypeWrapper, Label, LabelId, - Literal, MatchArm, Pat, PatId, RecordFieldPat, RecordLitField, Statement, + Array, BindingAnnotation, Expr, ExprId, FloatTypeWrapper, Label, LabelId, Literal, + MatchArm, Pat, PatId, RecordFieldPat, RecordLitField, Statement, }, intern::Interned, item_scope::BuiltinShadowMode, @@ -82,24 +80,8 @@ pub(super) fn lower( params: Option<ast::ParamList>, body: Option<ast::Expr>, ) -> (Body, BodySourceMap) { - ExprCollector { - db, - source_map: BodySourceMap::default(), - body: Body { - exprs: Arena::default(), - pats: Arena::default(), - labels: Arena::default(), - params: Vec::new(), - body_expr: dummy_expr_id(), - block_scopes: Vec::new(), - _c: Count::new(), - or_pats: Default::default(), - }, - expander, - name_to_pat_grouping: Default::default(), - is_lowering_inside_or_pat: false, - } - .collect(params, body) + let collector = ExprCollector::new(db, expander); + collector.collect(params, body) } struct ExprCollector<'a> { @@ -112,7 +94,18 @@ struct ExprCollector<'a> { is_lowering_inside_or_pat: bool, } -impl ExprCollector<'_> { +impl<'a> ExprCollector<'a> { + pub(crate) fn new(db: &'a dyn DefDatabase, expander: Expander) -> Self { + Self { + db, + expander, + body: Body::default(), + source_map: BodySourceMap::default(), + name_to_pat_grouping: HashMap::default(), + is_lowering_inside_or_pat: false, + } + } + fn collect( mut self, param_list: Option<ast::ParamList>, @@ -197,7 +190,8 @@ impl ExprCollector<'_> { } fn collect_expr(&mut self, expr: ast::Expr) -> ExprId { - self.maybe_collect_expr(expr).unwrap_or_else(|| self.missing_expr()) + let expr_id = self.maybe_collect_expr(expr).unwrap_or_else(|| self.missing_expr()); + expr_id } /// Returns `None` if and only if the expression is `#[cfg]`d out. @@ -689,7 +683,6 @@ impl ExprCollector<'_> { }; let prev_def_map = mem::replace(&mut self.expander.def_map, def_map); let prev_local_module = mem::replace(&mut self.expander.module, module); - let mut statements: Vec<_> = block.statements().filter_map(|s| self.collect_stmt(s)).collect(); let tail = block.tail_expr().and_then(|e| self.maybe_collect_expr(e)); |