]> git.lizzy.rs Git - rust.git/commitdiff
Add used_trait_imports query
authorcjkenn <cam.j.kennedy@gmail.com>
Tue, 17 Oct 2017 06:41:51 +0000 (23:41 -0700)
committercjkenn <cam.j.kennedy@gmail.com>
Fri, 20 Oct 2017 06:22:04 +0000 (23:22 -0700)
src/librustc/dep_graph/dep_node.rs
src/librustc/ty/context.rs
src/librustc/ty/maps/mod.rs
src/librustc/ty/maps/plumbing.rs
src/librustc_typeck/check/method/mod.rs
src/librustc_typeck/check/mod.rs
src/librustc_typeck/check/writeback.rs
src/librustc_typeck/check_unused.rs

index 92bbb745bb2145327c88d38d6369a0f128e51253..7de557ad0ed0da45b99e8c4b9c0a5d2a4ef25805 100644 (file)
@@ -500,6 +500,7 @@ pub fn fingerprint_needed_for_crate_hash(self) -> bool {
     [] InherentImpls(DefId),
     [] TypeckBodiesKrate,
     [] TypeckTables(DefId),
+    [] UsedTraitImports(DefId),
     [] HasTypeckTables(DefId),
     [] ConstEval { param_env: ParamEnvAnd<'tcx, (DefId, &'tcx Substs<'tcx>)> },
     [] SymbolName(DefId),
index 77889b7c10e86298d2d99774aaef6ff1d08e9a01..8232c0ed46096997e961edc0050724347822a684 100644 (file)
@@ -387,8 +387,9 @@ pub struct TypeckTables<'tcx> {
     cast_kinds: ItemLocalMap<ty::cast::CastKind>,
 
     /// Set of trait imports actually used in the method resolution.
-    /// This is used for warning unused imports.
-    pub used_trait_imports: Rc<RefCell<DefIdSet>>,
+    /// This is used for warning unused imports. During type
+    /// checking, this field should not be cloned.
+    pub used_trait_imports: Rc<DefIdSet>,
 
     /// If any errors occurred while type-checking this body,
     /// this field will be set to `true`.
@@ -418,7 +419,7 @@ pub fn empty(local_id_root: Option<DefId>) -> TypeckTables<'tcx> {
             liberated_fn_sigs: ItemLocalMap(),
             fru_field_types: ItemLocalMap(),
             cast_kinds: ItemLocalMap(),
-            used_trait_imports: Rc::new(RefCell::new(DefIdSet())),
+            used_trait_imports: Rc::new(DefIdSet()),
             tainted_by_errors: false,
             free_region_map: FreeRegionMap::new(),
         }
@@ -782,7 +783,7 @@ fn hash_stable<W: StableHasherResult>(&self,
             cast_kinds.hash_stable(hcx, hasher);
             generator_sigs.hash_stable(hcx, hasher);
             generator_interiors.hash_stable(hcx, hasher);
-            used_trait_imports.borrow_mut().hash_stable(hcx, hasher);
+            used_trait_imports.hash_stable(hcx, hasher);
             tainted_by_errors.hash_stable(hcx, hasher);
             free_region_map.hash_stable(hcx, hasher);
         })
index f54391ebb07eb42fa2db7ae81f5cf854e7a59db6..f6a0194913046953bee4ad4e90a9f2839f2820d3 100644 (file)
 
     [] fn typeck_tables_of: TypeckTables(DefId) -> &'tcx ty::TypeckTables<'tcx>,
 
+    [] fn used_trait_imports: UsedTraitImports(DefId) -> Rc<DefIdSet>,
+
     [] fn has_typeck_tables: HasTypeckTables(DefId) -> bool,
 
     [] fn coherent_trait: coherent_trait_dep_node((CrateNum, DefId)) -> (),
index 4e301342ee079fe9fe3b2d1f13480647f0a1a145..767e9a8436c2ec304ab130fb3758a10e85552c7a 100644 (file)
@@ -757,6 +757,7 @@ macro_rules! force {
         DepKind::InherentImpls => { force!(inherent_impls, def_id!()); }
         DepKind::TypeckBodiesKrate => { force!(typeck_item_bodies, LOCAL_CRATE); }
         DepKind::TypeckTables => { force!(typeck_tables_of, def_id!()); }
+        DepKind::UsedTraitImports => { force!(used_trait_imports, def_id!()); }
         DepKind::HasTypeckTables => { force!(has_typeck_tables, def_id!()); }
         DepKind::SymbolName => { force!(def_symbol_name, def_id!()); }
         DepKind::SpecializationGraph => { force!(specialization_graph_of, def_id!()); }
index a0c93df80689c2c4b1e4482994df0b86da43cfd0..58d72e37d51cfb1c0b48b11cdb8a190ad01c932d 100644 (file)
@@ -25,6 +25,8 @@
 
 use rustc::hir;
 
+use std::rc::Rc;
+
 pub use self::MethodError::*;
 pub use self::CandidateSource::*;
 
@@ -163,10 +165,8 @@ pub fn lookup_method(&self,
         if let Some(import_id) = pick.import_id {
             let import_def_id = self.tcx.hir.local_def_id(import_id);
             debug!("used_trait_import: {:?}", import_def_id);
-
-            let tables = self.tables.borrow_mut();
-            let mut ut = tables.used_trait_imports.borrow_mut();
-            ut.insert(import_def_id);
+            Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
+                                        .unwrap().insert(import_def_id);
         }
 
         self.tcx.check_stability(pick.item.def_id, call_expr.id, span);
@@ -364,9 +364,8 @@ pub fn resolve_ufcs(&self,
         if let Some(import_id) = pick.import_id {
             let import_def_id = self.tcx.hir.local_def_id(import_id);
             debug!("used_trait_import: {:?}", import_def_id);
-            let tables = self.tables.borrow_mut();
-            let mut ut = tables.used_trait_imports.borrow_mut();
-            ut.insert(import_def_id);
+            Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
+                                        .unwrap().insert(import_def_id);
         }
 
         let def = pick.item.def();
index f6b4dd8470c0c3001212b1b7392105829ee0f700..c4c8f65a994a8918242780a80ccda0a401f0be4b 100644 (file)
@@ -743,6 +743,7 @@ pub fn provide(providers: &mut Providers) {
         closure_kind,
         generator_sig,
         adt_destructor,
+        used_trait_imports,
         ..*providers
     };
 }
@@ -846,6 +847,12 @@ fn has_typeck_tables<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
     primary_body_of(tcx, id).is_some()
 }
 
+fn used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
+                              def_id: DefId)
+                              -> Rc<DefIdSet> {
+    Rc::clone(&tcx.typeck_tables_of(def_id).used_trait_imports)
+}
+
 fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                               def_id: DefId)
                               -> &'tcx ty::TypeckTables<'tcx> {
@@ -922,12 +929,6 @@ fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
     tables
 }
 
-pub fn get_used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
-                                        def_id: DefId)
-                                        -> Rc<RefCell<DefIdSet>> {
-    Rc::clone(&tcx.typeck_tables_of(def_id).used_trait_imports)
-}
-
 fn check_abi<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, span: Span, abi: Abi) {
     if !tcx.sess.target.target.is_abi_supported(abi) {
         struct_span_err!(tcx.sess, span, E0570,
index b6f2551da207775571e989796424a5090459dc2a..ce2ac73a27e0cb8b6f25fd031483c26e12bb8b51 100644 (file)
@@ -24,7 +24,6 @@
 use syntax_pos::Span;
 use std::mem;
 use std::rc::Rc;
-use std::cell::RefCell;
 
 ///////////////////////////////////////////////////////////////////////////
 // Entry point
@@ -51,7 +50,7 @@ pub fn resolve_type_vars_in_body(&self, body: &'gcx hir::Body)
         wbcx.visit_generator_interiors();
 
         let used_trait_imports = mem::replace(&mut self.tables.borrow_mut().used_trait_imports,
-                                              Rc::new(RefCell::new(DefIdSet())));
+                                              Rc::new(DefIdSet()));
         debug!("used_trait_imports({:?}) = {:?}", item_def_id, used_trait_imports);
         wbcx.tables.used_trait_imports = used_trait_imports;
 
index cd2bd8499cf3878359594c484165339da86043c0..29df70a4679c064597e887117b6a40dfef2a125d 100644 (file)
@@ -19,8 +19,6 @@
 use rustc::hir;
 use rustc::util::nodemap::DefIdSet;
 
-use check::get_used_trait_imports;
-
 struct CheckVisitor<'a, 'tcx: 'a> {
     tcx: TyCtxt<'a, 'tcx, 'tcx>,
     used_trait_imports: DefIdSet,
@@ -68,9 +66,10 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
     let mut used_trait_imports = DefIdSet();
     for &body_id in tcx.hir.krate().bodies.keys() {
         let item_def_id = tcx.hir.body_owner_def_id(body_id);
-        let imports = get_used_trait_imports(tcx, item_def_id);
+        // let tables = tcx.typeck_tables_of(item_def_id);
+        let imports = tcx.used_trait_imports(item_def_id);
         debug!("GatherVisitor: item_def_id={:?} with imports {:#?}", item_def_id, imports);
-        used_trait_imports.extend(imports.borrow().iter());
+        used_trait_imports.extend(imports.iter());
     }
 
     let mut visitor = CheckVisitor { tcx, used_trait_imports };