22
33use std:: { cell:: OnceCell , collections:: hash_map:: Entry } ;
44
5+ use base_db:: FxIndexSet ;
56use hir_expand:: {
67 HirFileId ,
78 mod_path:: PathKind ,
@@ -37,6 +38,7 @@ pub(super) struct Ctx<'a> {
3738 source_ast_id_map : Arc < AstIdMap > ,
3839 span_map : OnceCell < SpanMap > ,
3940 file : HirFileId ,
41+ visibilities : FxIndexSet < RawVisibility > ,
4042}
4143
4244impl < ' a > Ctx < ' a > {
@@ -47,6 +49,7 @@ impl<'a> Ctx<'a> {
4749 source_ast_id_map : db. ast_id_map ( file) ,
4850 file,
4951 span_map : OnceCell :: new ( ) ,
52+ visibilities : FxIndexSet :: default ( ) ,
5053 }
5154 }
5255
@@ -57,6 +60,9 @@ impl<'a> Ctx<'a> {
5760 pub ( super ) fn lower_module_items ( mut self , item_owner : & dyn HasModuleItem ) -> ItemTree {
5861 self . tree . top_level =
5962 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+ }
6066 self . tree
6167 }
6268
@@ -90,6 +96,9 @@ impl<'a> Ctx<'a> {
9096 }
9197 }
9298
99+ if let Some ( data) = & mut self . tree . data {
100+ data. vis . arena = self . visibilities . into_iter ( ) . collect ( ) ;
101+ }
93102 self . tree
94103 }
95104
@@ -115,7 +124,9 @@ impl<'a> Ctx<'a> {
115124 }
116125 }
117126 }
118-
127+ if let Some ( data) = & mut self . tree . data {
128+ data. vis . arena = self . visibilities . into_iter ( ) . collect ( ) ;
129+ }
119130 self . tree
120131 }
121132
@@ -370,7 +381,22 @@ impl<'a> Ctx<'a> {
370381 let vis = visibility_from_ast ( self . db , item. visibility ( ) , & mut |range| {
371382 self . span_map ( ) . span_for_range ( range) . ctx
372383 } ) ;
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+ }
374400 }
375401}
376402
0 commit comments