@@ -5,12 +5,13 @@ use std::{mem, sync::Arc};
5
5
6
6
use either:: Either ;
7
7
use hir_expand:: {
8
- ast_id_map:: { AstIdMap , FileAstId } ,
8
+ ast_id_map:: AstIdMap ,
9
9
hygiene:: Hygiene ,
10
10
name:: { name, AsName , Name } ,
11
- ExpandError , HirFileId , InFile ,
11
+ AstId , ExpandError , HirFileId , InFile ,
12
12
} ;
13
13
use la_arena:: Arena ;
14
+ use once_cell:: unsync:: OnceCell ;
14
15
use profile:: Count ;
15
16
use rustc_hash:: FxHashMap ;
16
17
use syntax:: {
@@ -41,38 +42,34 @@ use crate::{
41
42
pub struct LowerCtx < ' a > {
42
43
pub db : & ' a dyn DefDatabase ,
43
44
hygiene : Hygiene ,
44
- file_id : Option < HirFileId > ,
45
- source_ast_id_map : Option < Arc < AstIdMap > > ,
45
+ ast_id_map : Option < ( HirFileId , OnceCell < Arc < AstIdMap > > ) > ,
46
46
}
47
47
48
48
impl < ' a > LowerCtx < ' a > {
49
49
pub fn new ( db : & ' a dyn DefDatabase , file_id : HirFileId ) -> Self {
50
50
LowerCtx {
51
51
db,
52
52
hygiene : Hygiene :: new ( db. upcast ( ) , file_id) ,
53
- file_id : Some ( file_id) ,
54
- source_ast_id_map : Some ( db. ast_id_map ( file_id) ) ,
53
+ ast_id_map : Some ( ( file_id, OnceCell :: new ( ) ) ) ,
55
54
}
56
55
}
57
56
58
57
pub fn with_hygiene ( db : & ' a dyn DefDatabase , hygiene : & Hygiene ) -> Self {
59
- LowerCtx { db, hygiene : hygiene. clone ( ) , file_id : None , source_ast_id_map : None }
58
+ LowerCtx { db, hygiene : hygiene. clone ( ) , ast_id_map : None }
60
59
}
61
60
62
61
pub ( crate ) fn hygiene ( & self ) -> & Hygiene {
63
62
& self . hygiene
64
63
}
65
64
66
- pub ( crate ) fn file_id ( & self ) -> HirFileId {
67
- self . file_id . unwrap ( )
68
- }
69
-
70
65
pub ( crate ) fn lower_path ( & self , ast : ast:: Path ) -> Option < Path > {
71
66
Path :: from_src ( ast, self )
72
67
}
73
68
74
- pub ( crate ) fn ast_id < N : AstNode > ( & self , item : & N ) -> Option < FileAstId < N > > {
75
- self . source_ast_id_map . as_ref ( ) . map ( |ast_id_map| ast_id_map. ast_id ( item) )
69
+ pub ( crate ) fn ast_id < N : AstNode > ( & self , db : & dyn DefDatabase , item : & N ) -> Option < AstId < N > > {
70
+ let & ( file_id, ref ast_id_map) = self . ast_id_map . as_ref ( ) ?;
71
+ let ast_id_map = ast_id_map. get_or_init ( || db. ast_id_map ( file_id) ) ;
72
+ Some ( InFile :: new ( file_id, ast_id_map. ast_id ( item) ) )
76
73
}
77
74
}
78
75
@@ -85,6 +82,7 @@ pub(super) fn lower(
85
82
ExprCollector {
86
83
db,
87
84
source_map : BodySourceMap :: default ( ) ,
85
+ ast_id_map : db. ast_id_map ( expander. current_file_id ) ,
88
86
body : Body {
89
87
exprs : Arena :: default ( ) ,
90
88
pats : Arena :: default ( ) ,
@@ -105,6 +103,7 @@ pub(super) fn lower(
105
103
struct ExprCollector < ' a > {
106
104
db : & ' a dyn DefDatabase ,
107
105
expander : Expander ,
106
+ ast_id_map : Arc < AstIdMap > ,
108
107
body : Body ,
109
108
source_map : BodySourceMap ,
110
109
// a poor-mans union-find?
@@ -586,8 +585,13 @@ impl ExprCollector<'_> {
586
585
match res. value {
587
586
Some ( ( mark, expansion) ) => {
588
587
self . source_map . expansions . insert ( macro_call_ptr, self . expander . current_file_id ) ;
588
+ let prev_ast_id_map = mem:: replace (
589
+ & mut self . ast_id_map ,
590
+ self . db . ast_id_map ( self . expander . current_file_id ) ,
591
+ ) ;
589
592
590
593
let id = collector ( self , Some ( expansion) ) ;
594
+ self . ast_id_map = prev_ast_id_map;
591
595
self . expander . exit ( self . db , mark) ;
592
596
id
593
597
}
@@ -675,7 +679,8 @@ impl ExprCollector<'_> {
675
679
}
676
680
677
681
fn collect_block ( & mut self , block : ast:: BlockExpr ) -> ExprId {
678
- let ast_id = self . expander . ast_id ( & block) ;
682
+ let file_local_id = self . ast_id_map . ast_id ( & block) ;
683
+ let ast_id = AstId :: new ( self . expander . current_file_id , file_local_id) ;
679
684
let block_loc =
680
685
BlockLoc { ast_id, module : self . expander . def_map . module_id ( self . expander . module ) } ;
681
686
let block_id = self . db . intern_block ( block_loc) ;
0 commit comments