@@ -35,11 +35,13 @@ use rustc::hir;
3535use rustc:: hir:: def:: Def as HirDef ;
3636use rustc:: hir:: Node ;
3737use rustc:: hir:: def_id:: { DefId , LOCAL_CRATE } ;
38+ use rustc:: middle:: privacy:: AccessLevels ;
3839use rustc:: middle:: cstore:: ExternCrate ;
3940use rustc:: session:: config:: { CrateType , Input , OutputType } ;
4041use rustc:: ty:: { self , TyCtxt } ;
4142use rustc_typeck:: hir_ty_to_ty;
4243use rustc_codegen_utils:: link:: { filename_for_metadata, out_filename} ;
44+ use rustc_data_structures:: sync:: Lrc ;
4345
4446use std:: cell:: Cell ;
4547use std:: default:: Default ;
@@ -68,6 +70,7 @@ use rls_data::config::Config;
6870pub struct SaveContext < ' l , ' tcx : ' l > {
6971 tcx : TyCtxt < ' l , ' tcx , ' tcx > ,
7072 tables : & ' l ty:: TypeckTables < ' tcx > ,
73+ access_levels : & ' l AccessLevels ,
7174 analysis : & ' l ty:: CrateAnalysis ,
7275 span_utils : SpanUtils < ' tcx > ,
7376 config : Config ,
@@ -1126,10 +1129,18 @@ pub fn process_crate<'l, 'tcx, H: SaveHandler>(
11261129
11271130 info ! ( "Dumping crate {}" , cratename) ;
11281131
1132+ // Privacy checking requires and is done after type checking; use a
1133+ // fallback in case the access levels couldn't have been correctly computed.
1134+ let access_levels = match tcx. sess . compile_status ( ) {
1135+ Ok ( ..) => tcx. privacy_access_levels ( LOCAL_CRATE ) ,
1136+ Err ( ..) => Lrc :: new ( AccessLevels :: default ( ) ) ,
1137+ } ;
1138+
11291139 let save_ctxt = SaveContext {
11301140 tcx,
11311141 tables : & ty:: TypeckTables :: empty ( None ) ,
11321142 analysis,
1143+ access_levels : & access_levels,
11331144 span_utils : SpanUtils :: new ( & tcx. sess ) ,
11341145 config : find_config ( config) ,
11351146 impl_counter : Cell :: new ( 0 ) ,
0 commit comments