Skip to content

Commit 3e4140d

Browse files
authored
Rollup merge of rust-lang#73357 - petrochenkov:tmap, r=davidtwco
Use `LocalDefId` for import IDs in trait map cc rust-lang#73291 (comment)
2 parents 2ec6bf0 + fc13fd0 commit 3e4140d

File tree

13 files changed

+38
-73
lines changed

13 files changed

+38
-73
lines changed

src/librustc_hir/hir.rs

+3-16
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rustc_ast::node_id::NodeMap;
1212
use rustc_ast::util::parser::ExprPrecedence;
1313
use rustc_data_structures::sync::{par_for_each_in, Send, Sync};
1414
use rustc_macros::HashStable_Generic;
15+
use rustc_span::def_id::LocalDefId;
1516
use rustc_span::source_map::{SourceMap, Spanned};
1617
use rustc_span::symbol::{kw, sym, Ident, Symbol};
1718
use rustc_span::{MultiSpan, Span, DUMMY_SP};
@@ -2651,25 +2652,11 @@ pub type CaptureModeMap = NodeMap<CaptureBy>;
26512652
// has length > 0 if the trait is found through an chain of imports, starting with the
26522653
// import/use statement in the scope where the trait is used.
26532654
#[derive(Clone, Debug)]
2654-
pub struct TraitCandidate<ID = HirId> {
2655+
pub struct TraitCandidate {
26552656
pub def_id: DefId,
2656-
pub import_ids: SmallVec<[ID; 1]>,
2657+
pub import_ids: SmallVec<[LocalDefId; 1]>,
26572658
}
26582659

2659-
impl<ID> TraitCandidate<ID> {
2660-
pub fn map_import_ids<F, T>(self, f: F) -> TraitCandidate<T>
2661-
where
2662-
F: Fn(ID) -> T,
2663-
{
2664-
let TraitCandidate { def_id, import_ids } = self;
2665-
let import_ids = import_ids.into_iter().map(f).collect();
2666-
TraitCandidate { def_id, import_ids }
2667-
}
2668-
}
2669-
2670-
// Trait method resolution
2671-
pub type TraitMap<ID = HirId> = NodeMap<Vec<TraitCandidate<ID>>>;
2672-
26732660
#[derive(Copy, Clone, Debug, HashStable_Generic)]
26742661
pub enum Node<'hir> {
26752662
Param(&'hir Param<'hir>),

src/librustc_middle/arena.rs

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ macro_rules! arena_types {
115115

116116
// This is used to decode the &'tcx [Span] for InlineAsm's line_spans.
117117
[decode] span: rustc_span::Span, rustc_span::Span;
118+
[decode] used_trait_imports: rustc_data_structures::fx::FxHashSet<rustc_hir::def_id::LocalDefId>, rustc_data_structures::fx::FxHashSet<rustc_hir::def_id::LocalDefId>;
118119
], $tcx);
119120
)
120121
}

src/librustc_middle/ich/impls_hir.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -210,16 +210,15 @@ impl<'a> HashStable<StableHashingContext<'a>> for hir::TraitCandidate {
210210
}
211211

212212
impl<'a> ToStableHashKey<StableHashingContext<'a>> for hir::TraitCandidate {
213-
type KeyType = (DefPathHash, SmallVec<[(DefPathHash, hir::ItemLocalId); 1]>);
213+
type KeyType = (DefPathHash, SmallVec<[DefPathHash; 1]>);
214214

215215
fn to_stable_hash_key(&self, hcx: &StableHashingContext<'a>) -> Self::KeyType {
216216
let hir::TraitCandidate { def_id, import_ids } = self;
217217

218-
let import_keys = import_ids
219-
.iter()
220-
.map(|hir_id| (hcx.local_def_path_hash(hir_id.owner), hir_id.local_id))
221-
.collect();
222-
(hcx.def_path_hash(*def_id), import_keys)
218+
(
219+
hcx.def_path_hash(*def_id),
220+
import_ids.iter().map(|def_id| hcx.local_def_path_hash(*def_id)).collect(),
221+
)
223222
}
224223
}
225224

src/librustc_middle/query/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ rustc_queries! {
526526
}
527527

528528
Other {
529-
query used_trait_imports(key: LocalDefId) -> &'tcx DefIdSet {
529+
query used_trait_imports(key: LocalDefId) -> &'tcx FxHashSet<LocalDefId> {
530530
desc { |tcx| "used_trait_imports `{}`", tcx.def_path_str(key.to_def_id()) }
531531
cache_on_disk_if { true }
532532
}

src/librustc_middle/ty/context.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal};
3636
use rustc_errors::ErrorReported;
3737
use rustc_hir as hir;
3838
use rustc_hir::def::{DefKind, Res};
39-
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LOCAL_CRATE};
39+
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
4040
use rustc_hir::definitions::{DefPathHash, Definitions};
4141
use rustc_hir::lang_items::{self, PanicLocationLangItem};
4242
use rustc_hir::{HirId, ItemKind, ItemLocalId, ItemLocalMap, ItemLocalSet, Node, TraitCandidate};
@@ -408,7 +408,7 @@ pub struct TypeckTables<'tcx> {
408408
/// This is used for warning unused imports. During type
409409
/// checking, this `Lrc` should not be cloned: it must have a ref-count
410410
/// of 1 so that we can insert things into the set mutably.
411-
pub used_trait_imports: Lrc<DefIdSet>,
411+
pub used_trait_imports: Lrc<FxHashSet<LocalDefId>>,
412412

413413
/// If any errors occurred while type-checking this body,
414414
/// this field will be set to `Some(ErrorReported)`.

src/librustc_middle/ty/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ pub struct ResolverOutputs {
121121
pub definitions: rustc_hir::definitions::Definitions,
122122
pub cstore: Box<CrateStoreDyn>,
123123
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
124-
pub trait_map: FxHashMap<hir::HirId, Vec<hir::TraitCandidate<hir::HirId>>>,
124+
pub trait_map: FxHashMap<hir::HirId, Vec<hir::TraitCandidate>>,
125125
pub maybe_unused_trait_imports: FxHashSet<LocalDefId>,
126126
pub maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
127127
pub export_map: ExportMap<LocalDefId>,

src/librustc_resolve/late.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX};
2424
use rustc_hir::TraitCandidate;
2525
use rustc_middle::{bug, span_bug};
2626
use rustc_session::lint;
27+
use rustc_span::def_id::LocalDefId;
2728
use rustc_span::symbol::{kw, sym, Ident, Symbol};
2829
use rustc_span::Span;
2930
use smallvec::{smallvec, SmallVec};
@@ -2188,7 +2189,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
21882189
&mut self,
21892190
mut ident: Ident,
21902191
ns: Namespace,
2191-
) -> Vec<TraitCandidate<NodeId>> {
2192+
) -> Vec<TraitCandidate> {
21922193
debug!("(getting traits containing item) looking for '{}'", ident.name);
21932194

21942195
let mut found_traits = Vec::new();
@@ -2233,7 +2234,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
22332234
ident: Ident,
22342235
ns: Namespace,
22352236
module: Module<'a>,
2236-
found_traits: &mut Vec<TraitCandidate<NodeId>>,
2237+
found_traits: &mut Vec<TraitCandidate>,
22372238
) {
22382239
assert!(ns == TypeNS || ns == ValueNS);
22392240
let mut traits = module.traits.borrow_mut();
@@ -2292,13 +2293,13 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
22922293
&mut self,
22932294
mut kind: &NameBindingKind<'_>,
22942295
trait_name: Ident,
2295-
) -> SmallVec<[NodeId; 1]> {
2296+
) -> SmallVec<[LocalDefId; 1]> {
22962297
let mut import_ids = smallvec![];
22972298
while let NameBindingKind::Import { import, binding, .. } = kind {
22982299
let id = self.r.definitions.local_def_id(import.id);
22992300
self.r.maybe_unused_trait_imports.insert(id);
23002301
self.r.add_to_glob_map(&import, trait_name);
2301-
import_ids.push(import.id);
2302+
import_ids.push(id);
23022303
kind = &binding.kind;
23032304
}
23042305
import_ids

src/librustc_resolve/lib.rs

+4-21
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use rustc_hir::def::{self, CtorOf, DefKind, NonMacroAttrKind, PartialRes};
3838
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX};
3939
use rustc_hir::definitions::{DefKey, Definitions};
4040
use rustc_hir::PrimTy::{self, Bool, Char, Float, Int, Str, Uint};
41-
use rustc_hir::TraitMap;
41+
use rustc_hir::TraitCandidate;
4242
use rustc_metadata::creader::{CStore, CrateLoader};
4343
use rustc_middle::hir::exports::ExportMap;
4444
use rustc_middle::middle::cstore::{CrateStore, MetadataLoaderDyn};
@@ -881,7 +881,7 @@ pub struct Resolver<'a> {
881881
/// `CrateNum` resolutions of `extern crate` items.
882882
extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
883883
export_map: ExportMap<LocalDefId>,
884-
trait_map: TraitMap<NodeId>,
884+
trait_map: NodeMap<Vec<TraitCandidate>>,
885885

886886
/// A map from nodes to anonymous modules.
887887
/// Anonymous modules are pseudo-modules that are implicitly created around items
@@ -1287,14 +1287,7 @@ impl<'a> Resolver<'a> {
12871287
let trait_map = self
12881288
.trait_map
12891289
.into_iter()
1290-
.map(|(k, v)| {
1291-
(
1292-
definitions.node_id_to_hir_id(k),
1293-
v.into_iter()
1294-
.map(|tc| tc.map_import_ids(|id| definitions.node_id_to_hir_id(id)))
1295-
.collect(),
1296-
)
1297-
})
1290+
.map(|(k, v)| (definitions.node_id_to_hir_id(k), v))
12981291
.collect();
12991292
let maybe_unused_trait_imports = self.maybe_unused_trait_imports;
13001293
let maybe_unused_extern_crates = self.maybe_unused_extern_crates;
@@ -1325,17 +1318,7 @@ impl<'a> Resolver<'a> {
13251318
trait_map: self
13261319
.trait_map
13271320
.iter()
1328-
.map(|(&k, v)| {
1329-
(
1330-
self.definitions.node_id_to_hir_id(k),
1331-
v.iter()
1332-
.cloned()
1333-
.map(|tc| {
1334-
tc.map_import_ids(|id| self.definitions.node_id_to_hir_id(id))
1335-
})
1336-
.collect(),
1337-
)
1338-
})
1321+
.map(|(&k, v)| (self.definitions.node_id_to_hir_id(k), v.clone()))
13391322
.collect(),
13401323
glob_map: self.glob_map.clone(),
13411324
maybe_unused_trait_imports: self.maybe_unused_trait_imports.clone(),

src/librustc_typeck/check/method/mod.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
194194
self.lookup_probe(span, segment.ident, self_ty, call_expr, ProbeScope::TraitsInScope)?;
195195

196196
for import_id in &pick.import_ids {
197-
let import_def_id = self.tcx.hir().local_def_id(*import_id);
198-
debug!("used_trait_import: {:?}", import_def_id);
197+
debug!("used_trait_import: {:?}", import_id);
199198
Lrc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
200199
.unwrap()
201-
.insert(import_def_id.to_def_id());
200+
.insert(*import_id);
202201
}
203202

204203
self.tcx.check_stability(pick.item.def_id, Some(call_expr.hir_id), span);
@@ -461,9 +460,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
461460
let mut tables = self.tables.borrow_mut();
462461
let used_trait_imports = Lrc::get_mut(&mut tables.used_trait_imports).unwrap();
463462
for import_id in pick.import_ids {
464-
let import_def_id = tcx.hir().local_def_id(import_id);
465-
debug!("resolve_ufcs: used_trait_import: {:?}", import_def_id);
466-
used_trait_imports.insert(import_def_id.to_def_id());
463+
debug!("resolve_ufcs: used_trait_import: {:?}", import_id);
464+
used_trait_imports.insert(import_id);
467465
}
468466
}
469467

src/librustc_typeck/check/method/probe.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use rustc_middle::ty::{
2828
};
2929
use rustc_session::config::nightly_options;
3030
use rustc_session::lint;
31+
use rustc_span::def_id::LocalDefId;
3132
use rustc_span::{symbol::Ident, Span, Symbol, DUMMY_SP};
3233
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
3334
use rustc_trait_selection::traits::query::method_autoderef::MethodAutoderefBadTy;
@@ -129,7 +130,7 @@ struct Candidate<'tcx> {
129130
xform_ret_ty: Option<Ty<'tcx>>,
130131
item: ty::AssocItem,
131132
kind: CandidateKind<'tcx>,
132-
import_ids: SmallVec<[hir::HirId; 1]>,
133+
import_ids: SmallVec<[LocalDefId; 1]>,
133134
}
134135

135136
#[derive(Debug)]
@@ -158,7 +159,7 @@ enum ProbeResult {
158159
pub struct Pick<'tcx> {
159160
pub item: ty::AssocItem,
160161
pub kind: PickKind<'tcx>,
161-
pub import_ids: SmallVec<[hir::HirId; 1]>,
162+
pub import_ids: SmallVec<[LocalDefId; 1]>,
162163

163164
// Indicates that the source expression should be autoderef'd N times
164165
//
@@ -930,7 +931,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
930931

931932
fn assemble_extension_candidates_for_trait(
932933
&mut self,
933-
import_ids: &SmallVec<[hir::HirId; 1]>,
934+
import_ids: &SmallVec<[LocalDefId; 1]>,
934935
trait_def_id: DefId,
935936
) -> Result<(), MethodError<'tcx>> {
936937
debug!("assemble_extension_candidates_for_trait(trait_def_id={:?})", trait_def_id);

src/librustc_typeck/check/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ use rustc_errors::ErrorReported;
9696
use rustc_errors::{pluralize, struct_span_err, Applicability, DiagnosticBuilder, DiagnosticId};
9797
use rustc_hir as hir;
9898
use rustc_hir::def::{CtorOf, DefKind, Res};
99-
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LOCAL_CRATE};
99+
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
100100
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
101101
use rustc_hir::itemlikevisit::ItemLikeVisitor;
102102
use rustc_hir::lang_items::{
@@ -840,7 +840,7 @@ fn has_typeck_tables(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
840840
}
841841
}
842842

843-
fn used_trait_imports(tcx: TyCtxt<'_>, def_id: LocalDefId) -> &DefIdSet {
843+
fn used_trait_imports(tcx: TyCtxt<'_>, def_id: LocalDefId) -> &FxHashSet<LocalDefId> {
844844
&*tcx.typeck_tables_of(def_id).used_trait_imports
845845
}
846846

src/librustc_typeck/check/writeback.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44

55
use crate::check::FnCtxt;
66

7-
use rustc_data_structures::sync::Lrc;
87
use rustc_errors::ErrorReported;
98
use rustc_hir as hir;
10-
use rustc_hir::def_id::DefIdSet;
119
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
1210
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
1311
use rustc_infer::infer::InferCtxt;
@@ -67,10 +65,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
6765
wbcx.visit_user_provided_sigs();
6866
wbcx.visit_generator_interior_types();
6967

70-
let used_trait_imports = mem::replace(
71-
&mut self.tables.borrow_mut().used_trait_imports,
72-
Lrc::new(DefIdSet::default()),
73-
);
68+
let used_trait_imports = mem::take(&mut self.tables.borrow_mut().used_trait_imports);
7469
debug!("used_trait_imports({:?}) = {:?}", item_def_id, used_trait_imports);
7570
wbcx.tables.used_trait_imports = used_trait_imports;
7671

src/librustc_typeck/check_unused.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
use rustc_data_structures::fx::FxHashMap;
1+
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
22
use rustc_errors::Applicability;
33
use rustc_hir as hir;
4-
use rustc_hir::def_id::{DefId, DefIdSet, LocalDefId, LOCAL_CRATE};
4+
use rustc_hir::def_id::{DefId, LocalDefId, LOCAL_CRATE};
55
use rustc_hir::itemlikevisit::ItemLikeVisitor;
66
use rustc_middle::ty::TyCtxt;
77
use rustc_session::lint;
88
use rustc_span::{Span, Symbol};
99

1010
pub fn check_crate(tcx: TyCtxt<'_>) {
11-
let mut used_trait_imports = DefIdSet::default();
11+
let mut used_trait_imports = FxHashSet::default();
1212
for &body_id in tcx.hir().krate().bodies.keys() {
1313
let item_def_id = tcx.hir().body_owner_def_id(body_id);
1414
let imports = tcx.used_trait_imports(item_def_id);
@@ -39,7 +39,7 @@ impl ItemLikeVisitor<'v> for CheckVisitor<'tcx> {
3939

4040
struct CheckVisitor<'tcx> {
4141
tcx: TyCtxt<'tcx>,
42-
used_trait_imports: DefIdSet,
42+
used_trait_imports: FxHashSet<LocalDefId>,
4343
}
4444

4545
impl CheckVisitor<'tcx> {
@@ -49,7 +49,7 @@ impl CheckVisitor<'tcx> {
4949
return;
5050
}
5151

52-
if self.used_trait_imports.contains(&def_id.to_def_id()) {
52+
if self.used_trait_imports.contains(&def_id) {
5353
return;
5454
}
5555

0 commit comments

Comments
 (0)