1
1
//! Transforms `ast::Expr` into an equivalent `hir_def::expr::Expr`
2
2
//! representation.
3
3
4
- use std:: { collections :: HashMap , mem, sync:: Arc } ;
4
+ use std:: { mem, sync:: Arc } ;
5
5
6
6
use either:: Either ;
7
7
use hir_expand:: {
@@ -10,6 +10,8 @@ use hir_expand::{
10
10
name:: { name, AsName , Name } ,
11
11
ExpandError , HirFileId , InFile ,
12
12
} ;
13
+ use la_arena:: Arena ;
14
+ use profile:: Count ;
13
15
use rustc_hash:: FxHashMap ;
14
16
use syntax:: {
15
17
ast:: {
@@ -26,8 +28,8 @@ use crate::{
26
28
builtin_type:: { BuiltinFloat , BuiltinInt , BuiltinUint } ,
27
29
db:: DefDatabase ,
28
30
expr:: {
29
- Array , BindingAnnotation , Expr , ExprId , FloatTypeWrapper , Label , LabelId , Literal ,
30
- MatchArm , Pat , PatId , RecordFieldPat , RecordLitField , Statement ,
31
+ dummy_expr_id , Array , BindingAnnotation , Expr , ExprId , FloatTypeWrapper , Label , LabelId ,
32
+ Literal , MatchArm , Pat , PatId , RecordFieldPat , RecordLitField , Statement ,
31
33
} ,
32
34
intern:: Interned ,
33
35
item_scope:: BuiltinShadowMode ,
@@ -80,7 +82,24 @@ pub(super) fn lower(
80
82
params : Option < ast:: ParamList > ,
81
83
body : Option < ast:: Expr > ,
82
84
) -> ( Body , BodySourceMap ) {
83
- ExprCollector :: new ( db, expander) . collect ( params, body)
85
+ ExprCollector {
86
+ db,
87
+ source_map : BodySourceMap :: default ( ) ,
88
+ body : Body {
89
+ exprs : Arena :: default ( ) ,
90
+ pats : Arena :: default ( ) ,
91
+ labels : Arena :: default ( ) ,
92
+ params : Vec :: new ( ) ,
93
+ body_expr : dummy_expr_id ( ) ,
94
+ block_scopes : Vec :: new ( ) ,
95
+ _c : Count :: new ( ) ,
96
+ or_pats : Default :: default ( ) ,
97
+ } ,
98
+ expander,
99
+ name_to_pat_grouping : Default :: default ( ) ,
100
+ is_lowering_inside_or_pat : false ,
101
+ }
102
+ . collect ( params, body)
84
103
}
85
104
86
105
struct ExprCollector < ' a > {
@@ -93,18 +112,7 @@ struct ExprCollector<'a> {
93
112
is_lowering_inside_or_pat : bool ,
94
113
}
95
114
96
- impl < ' a > ExprCollector < ' a > {
97
- pub ( crate ) fn new ( db : & ' a dyn DefDatabase , expander : Expander ) -> Self {
98
- Self {
99
- db,
100
- expander,
101
- body : Body :: default ( ) ,
102
- source_map : BodySourceMap :: default ( ) ,
103
- name_to_pat_grouping : HashMap :: default ( ) ,
104
- is_lowering_inside_or_pat : false ,
105
- }
106
- }
107
-
115
+ impl ExprCollector < ' _ > {
108
116
fn collect (
109
117
mut self ,
110
118
param_list : Option < ast:: ParamList > ,
@@ -681,6 +689,7 @@ impl<'a> ExprCollector<'a> {
681
689
} ;
682
690
let prev_def_map = mem:: replace ( & mut self . expander . def_map , def_map) ;
683
691
let prev_local_module = mem:: replace ( & mut self . expander . module , module) ;
692
+
684
693
let mut statements: Vec < _ > =
685
694
block. statements ( ) . filter_map ( |s| self . collect_stmt ( s) ) . collect ( ) ;
686
695
let tail = block. tail_expr ( ) . and_then ( |e| self . maybe_collect_expr ( e) ) ;
0 commit comments