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 | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs index 111460d1a6..049afa8227 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::{collections::HashMap, mem, sync::Arc}; +use std::{mem, sync::Arc}; use either::Either; use hir_expand::{ @@ -10,6 +10,8 @@ use hir_expand::{ name::{name, AsName, Name}, ExpandError, HirFileId, InFile, }; +use la_arena::Arena; +use profile::Count; use rustc_hash::FxHashMap; use syntax::{ ast::{ @@ -26,8 +28,8 @@ use crate::{ builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint}, db::DefDatabase, expr::{ - Array, BindingAnnotation, Expr, ExprId, FloatTypeWrapper, Label, LabelId, Literal, - MatchArm, Pat, PatId, RecordFieldPat, RecordLitField, Statement, + dummy_expr_id, Array, BindingAnnotation, Expr, ExprId, FloatTypeWrapper, Label, LabelId, + Literal, MatchArm, Pat, PatId, RecordFieldPat, RecordLitField, Statement, }, intern::Interned, item_scope::BuiltinShadowMode, @@ -80,7 +82,24 @@ pub(super) fn lower( params: Option<ast::ParamList>, body: Option<ast::Expr>, ) -> (Body, BodySourceMap) { - ExprCollector::new(db, expander).collect(params, body) + 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) } struct ExprCollector<'a> { @@ -93,18 +112,7 @@ struct ExprCollector<'a> { is_lowering_inside_or_pat: bool, } -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, - } - } - +impl ExprCollector<'_> { fn collect( mut self, param_list: Option<ast::ParamList>, @@ -681,6 +689,7 @@ impl<'a> ExprCollector<'a> { }; 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)); |