2
2
3
3
use std:: { cell:: OnceCell , collections:: hash_map:: Entry } ;
4
4
5
+ use base_db:: FxIndexSet ;
5
6
use hir_expand:: {
6
7
HirFileId ,
7
8
mod_path:: PathKind ,
@@ -37,6 +38,7 @@ pub(super) struct Ctx<'a> {
37
38
source_ast_id_map : Arc < AstIdMap > ,
38
39
span_map : OnceCell < SpanMap > ,
39
40
file : HirFileId ,
41
+ visibilities : FxIndexSet < RawVisibility > ,
40
42
}
41
43
42
44
impl < ' a > Ctx < ' a > {
@@ -47,6 +49,7 @@ impl<'a> Ctx<'a> {
47
49
source_ast_id_map : db. ast_id_map ( file) ,
48
50
file,
49
51
span_map : OnceCell :: new ( ) ,
52
+ visibilities : FxIndexSet :: default ( ) ,
50
53
}
51
54
}
52
55
@@ -57,6 +60,9 @@ impl<'a> Ctx<'a> {
57
60
pub ( super ) fn lower_module_items ( mut self , item_owner : & dyn HasModuleItem ) -> ItemTree {
58
61
self . tree . top_level =
59
62
item_owner. items ( ) . flat_map ( |item| self . lower_mod_item ( & item) ) . collect ( ) ;
63
+ if let Some ( data) = & mut self . tree . data {
64
+ data. vis . arena = self . visibilities . into_iter ( ) . collect ( ) ;
65
+ }
60
66
self . tree
61
67
}
62
68
@@ -90,6 +96,9 @@ impl<'a> Ctx<'a> {
90
96
}
91
97
}
92
98
99
+ if let Some ( data) = & mut self . tree . data {
100
+ data. vis . arena = self . visibilities . into_iter ( ) . collect ( ) ;
101
+ }
93
102
self . tree
94
103
}
95
104
@@ -115,7 +124,9 @@ impl<'a> Ctx<'a> {
115
124
}
116
125
}
117
126
}
118
-
127
+ if let Some ( data) = & mut self . tree . data {
128
+ data. vis . arena = self . visibilities . into_iter ( ) . collect ( ) ;
129
+ }
119
130
self . tree
120
131
}
121
132
@@ -370,7 +381,22 @@ impl<'a> Ctx<'a> {
370
381
let vis = visibility_from_ast ( self . db , item. visibility ( ) , & mut |range| {
371
382
self . span_map ( ) . span_for_range ( range) . ctx
372
383
} ) ;
373
- self . data ( ) . vis . alloc ( vis)
384
+ match & vis {
385
+ RawVisibility :: Public => RawVisibilityId :: PUB ,
386
+ RawVisibility :: Module ( path, explicitiy) if path. segments ( ) . is_empty ( ) => {
387
+ match ( path. kind , explicitiy) {
388
+ ( PathKind :: SELF , VisibilityExplicitness :: Explicit ) => {
389
+ RawVisibilityId :: PRIV_EXPLICIT
390
+ }
391
+ ( PathKind :: SELF , VisibilityExplicitness :: Implicit ) => {
392
+ RawVisibilityId :: PRIV_IMPLICIT
393
+ }
394
+ ( PathKind :: Crate , _) => RawVisibilityId :: PUB_CRATE ,
395
+ _ => RawVisibilityId ( self . visibilities . insert_full ( vis) . 0 as u32 ) ,
396
+ }
397
+ }
398
+ _ => RawVisibilityId ( self . visibilities . insert_full ( vis) . 0 as u32 ) ,
399
+ }
374
400
}
375
401
}
376
402
0 commit comments