Skip to content

Commit b815ecc

Browse files
committed
Add used_trait_imports query
1 parent ada8099 commit b815ecc

File tree

8 files changed

+26
-23
lines changed

8 files changed

+26
-23
lines changed

src/librustc/dep_graph/dep_node.rs

+1
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ define_dep_nodes!( <'tcx>
500500
[] InherentImpls(DefId),
501501
[] TypeckBodiesKrate,
502502
[] TypeckTables(DefId),
503+
[] UsedTraitImports(DefId),
503504
[] HasTypeckTables(DefId),
504505
[] ConstEval { param_env: ParamEnvAnd<'tcx, (DefId, &'tcx Substs<'tcx>)> },
505506
[] SymbolName(DefId),

src/librustc/ty/context.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,9 @@ pub struct TypeckTables<'tcx> {
387387
cast_kinds: ItemLocalMap<ty::cast::CastKind>,
388388

389389
/// Set of trait imports actually used in the method resolution.
390-
/// This is used for warning unused imports.
391-
pub used_trait_imports: Rc<RefCell<DefIdSet>>,
390+
/// This is used for warning unused imports. During type
391+
/// checking, this field should not be cloned.
392+
pub used_trait_imports: Rc<DefIdSet>,
392393

393394
/// If any errors occurred while type-checking this body,
394395
/// this field will be set to `true`.
@@ -418,7 +419,7 @@ impl<'tcx> TypeckTables<'tcx> {
418419
liberated_fn_sigs: ItemLocalMap(),
419420
fru_field_types: ItemLocalMap(),
420421
cast_kinds: ItemLocalMap(),
421-
used_trait_imports: Rc::new(RefCell::new(DefIdSet())),
422+
used_trait_imports: Rc::new(DefIdSet()),
422423
tainted_by_errors: false,
423424
free_region_map: FreeRegionMap::new(),
424425
}
@@ -782,7 +783,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for TypeckTables<'gcx> {
782783
cast_kinds.hash_stable(hcx, hasher);
783784
generator_sigs.hash_stable(hcx, hasher);
784785
generator_interiors.hash_stable(hcx, hasher);
785-
used_trait_imports.borrow_mut().hash_stable(hcx, hasher);
786+
used_trait_imports.hash_stable(hcx, hasher);
786787
tainted_by_errors.hash_stable(hcx, hasher);
787788
free_region_map.hash_stable(hcx, hasher);
788789
})

src/librustc/ty/maps/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ define_maps! { <'tcx>
183183

184184
[] fn typeck_tables_of: TypeckTables(DefId) -> &'tcx ty::TypeckTables<'tcx>,
185185

186+
[] fn used_trait_imports: UsedTraitImports(DefId) -> Rc<DefIdSet>,
187+
186188
[] fn has_typeck_tables: HasTypeckTables(DefId) -> bool,
187189

188190
[] fn coherent_trait: coherent_trait_dep_node((CrateNum, DefId)) -> (),

src/librustc/ty/maps/plumbing.rs

+1
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,7 @@ pub fn force_from_dep_node<'a, 'gcx, 'lcx>(tcx: TyCtxt<'a, 'gcx, 'lcx>,
757757
DepKind::InherentImpls => { force!(inherent_impls, def_id!()); }
758758
DepKind::TypeckBodiesKrate => { force!(typeck_item_bodies, LOCAL_CRATE); }
759759
DepKind::TypeckTables => { force!(typeck_tables_of, def_id!()); }
760+
DepKind::UsedTraitImports => { force!(used_trait_imports, def_id!()); }
760761
DepKind::HasTypeckTables => { force!(has_typeck_tables, def_id!()); }
761762
DepKind::SymbolName => { force!(def_symbol_name, def_id!()); }
762763
DepKind::SpecializationGraph => { force!(specialization_graph_of, def_id!()); }

src/librustc_typeck/check/method/mod.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ use syntax_pos::Span;
2525

2626
use rustc::hir;
2727

28+
use std::rc::Rc;
29+
2830
pub use self::MethodError::*;
2931
pub use self::CandidateSource::*;
3032

@@ -163,10 +165,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
163165
if let Some(import_id) = pick.import_id {
164166
let import_def_id = self.tcx.hir.local_def_id(import_id);
165167
debug!("used_trait_import: {:?}", import_def_id);
166-
167-
let tables = self.tables.borrow_mut();
168-
let mut ut = tables.used_trait_imports.borrow_mut();
169-
ut.insert(import_def_id);
168+
Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
169+
.unwrap().insert(import_def_id);
170170
}
171171

172172
self.tcx.check_stability(pick.item.def_id, call_expr.id, span);
@@ -364,9 +364,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
364364
if let Some(import_id) = pick.import_id {
365365
let import_def_id = self.tcx.hir.local_def_id(import_id);
366366
debug!("used_trait_import: {:?}", import_def_id);
367-
let tables = self.tables.borrow_mut();
368-
let mut ut = tables.used_trait_imports.borrow_mut();
369-
ut.insert(import_def_id);
367+
Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
368+
.unwrap().insert(import_def_id);
370369
}
371370

372371
let def = pick.item.def();

src/librustc_typeck/check/mod.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,7 @@ pub fn provide(providers: &mut Providers) {
743743
closure_kind,
744744
generator_sig,
745745
adt_destructor,
746+
used_trait_imports,
746747
..*providers
747748
};
748749
}
@@ -846,6 +847,12 @@ fn has_typeck_tables<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
846847
primary_body_of(tcx, id).is_some()
847848
}
848849

850+
fn used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
851+
def_id: DefId)
852+
-> Rc<DefIdSet> {
853+
Rc::clone(&tcx.typeck_tables_of(def_id).used_trait_imports)
854+
}
855+
849856
fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
850857
def_id: DefId)
851858
-> &'tcx ty::TypeckTables<'tcx> {
@@ -922,12 +929,6 @@ fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
922929
tables
923930
}
924931

925-
pub fn get_used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
926-
def_id: DefId)
927-
-> Rc<RefCell<DefIdSet>> {
928-
Rc::clone(&tcx.typeck_tables_of(def_id).used_trait_imports)
929-
}
930-
931932
fn check_abi<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, span: Span, abi: Abi) {
932933
if !tcx.sess.target.target.is_abi_supported(abi) {
933934
struct_span_err!(tcx.sess, span, E0570,

src/librustc_typeck/check/writeback.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use syntax::ast;
2424
use syntax_pos::Span;
2525
use std::mem;
2626
use std::rc::Rc;
27-
use std::cell::RefCell;
2827

2928
///////////////////////////////////////////////////////////////////////////
3029
// Entry point
@@ -51,7 +50,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
5150
wbcx.visit_generator_interiors();
5251

5352
let used_trait_imports = mem::replace(&mut self.tables.borrow_mut().used_trait_imports,
54-
Rc::new(RefCell::new(DefIdSet())));
53+
Rc::new(DefIdSet()));
5554
debug!("used_trait_imports({:?}) = {:?}", item_def_id, used_trait_imports);
5655
wbcx.tables.used_trait_imports = used_trait_imports;
5756

src/librustc_typeck/check_unused.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ use rustc::hir::itemlikevisit::ItemLikeVisitor;
1919
use rustc::hir;
2020
use rustc::util::nodemap::DefIdSet;
2121

22-
use check::get_used_trait_imports;
23-
2422
struct CheckVisitor<'a, 'tcx: 'a> {
2523
tcx: TyCtxt<'a, 'tcx, 'tcx>,
2624
used_trait_imports: DefIdSet,
@@ -68,9 +66,10 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
6866
let mut used_trait_imports = DefIdSet();
6967
for &body_id in tcx.hir.krate().bodies.keys() {
7068
let item_def_id = tcx.hir.body_owner_def_id(body_id);
71-
let imports = get_used_trait_imports(tcx, item_def_id);
69+
// let tables = tcx.typeck_tables_of(item_def_id);
70+
let imports = tcx.used_trait_imports(item_def_id);
7271
debug!("GatherVisitor: item_def_id={:?} with imports {:#?}", item_def_id, imports);
73-
used_trait_imports.extend(imports.borrow().iter());
72+
used_trait_imports.extend(imports.iter());
7473
}
7574

7675
let mut visitor = CheckVisitor { tcx, used_trait_imports };

0 commit comments

Comments
 (0)