Skip to content

Commit 2a899e2

Browse files
committed
Make TraitCandidate generic.
1 parent 4706c38 commit 2a899e2

File tree

5 files changed

+26
-30
lines changed

5 files changed

+26
-30
lines changed

src/librustc/ty/context.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,10 @@ impl<'tcx> TyCtxt<'tcx> {
11611161
for (k, v) in resolutions.trait_map {
11621162
let hir_id = hir.node_to_hir_id(k);
11631163
let map = trait_map.entry(hir_id.owner).or_default();
1164-
let v = v.into_iter().map(|tc| tc.node_to_hir_id(&hir.definitions())).collect();
1164+
let v = v
1165+
.into_iter()
1166+
.map(|tc| tc.map_import_ids(|id| hir.definitions().node_to_hir_id(id)))
1167+
.collect();
11651168
map.insert(hir_id.local_id, StableVec::new(v));
11661169
}
11671170

src/librustc/ty/mod.rs

+2-20
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use rustc_data_structures::sync::{self, par_iter, Lrc, ParallelIterator};
3535
use rustc_hir as hir;
3636
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
3737
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
38-
use rustc_hir::{Constness, GlobMap, Node};
38+
use rustc_hir::{Constness, GlobMap, Node, TraitMap};
3939
use rustc_index::vec::{Idx, IndexVec};
4040
use rustc_macros::HashStable;
4141
use rustc_serialize::{self, Encodable, Encoder};
@@ -46,7 +46,6 @@ use rustc_target::abi::Align;
4646
use syntax::ast::{self, Ident, Name};
4747
use syntax::node_id::{NodeId, NodeMap, NodeSet};
4848

49-
use smallvec::SmallVec;
5049
use std::cell::RefCell;
5150
use std::cmp::{self, Ordering};
5251
use std::fmt;
@@ -123,28 +122,11 @@ mod sty;
123122

124123
// Data types
125124

126-
#[derive(Clone, Debug)]
127-
pub struct TraitCandidate {
128-
pub def_id: DefId,
129-
pub import_ids: SmallVec<[NodeId; 1]>,
130-
}
131-
132-
impl TraitCandidate {
133-
fn node_to_hir_id(self, definitions: &hir_map::Definitions) -> hir::TraitCandidate {
134-
let TraitCandidate { def_id, import_ids } = self;
135-
let import_ids =
136-
import_ids.into_iter().map(|node_id| definitions.node_to_hir_id(node_id)).collect();
137-
hir::TraitCandidate { def_id, import_ids }
138-
}
139-
}
140-
141-
pub type TraitMap = NodeMap<Vec<TraitCandidate>>;
142-
143125
pub struct ResolverOutputs {
144126
pub definitions: hir_map::Definitions,
145127
pub cstore: Box<CrateStoreDyn>,
146128
pub extern_crate_map: NodeMap<CrateNum>,
147-
pub trait_map: TraitMap,
129+
pub trait_map: TraitMap<NodeId>,
148130
pub maybe_unused_trait_imports: NodeSet,
149131
pub maybe_unused_extern_crates: Vec<(NodeId, Span)>,
150132
pub export_map: ExportMap<NodeId>,

src/librustc_hir/hir.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -2608,13 +2608,24 @@ pub type CaptureModeMap = NodeMap<CaptureBy>;
26082608
// has length > 0 if the trait is found through an chain of imports, starting with the
26092609
// import/use statement in the scope where the trait is used.
26102610
#[derive(Clone, Debug)]
2611-
pub struct TraitCandidate {
2611+
pub struct TraitCandidate<ID = HirId> {
26122612
pub def_id: DefId,
2613-
pub import_ids: SmallVec<[HirId; 1]>,
2613+
pub import_ids: SmallVec<[ID; 1]>,
2614+
}
2615+
2616+
impl<ID> TraitCandidate<ID> {
2617+
pub fn map_import_ids<F, T>(self, f: F) -> TraitCandidate<T>
2618+
where
2619+
F: Fn(ID) -> T,
2620+
{
2621+
let TraitCandidate { def_id, import_ids } = self;
2622+
let import_ids = import_ids.into_iter().map(f).collect();
2623+
TraitCandidate { def_id, import_ids }
2624+
}
26142625
}
26152626

26162627
// Trait method resolution
2617-
pub type TraitMap = NodeMap<Vec<TraitCandidate>>;
2628+
pub type TraitMap<ID = HirId> = NodeMap<Vec<TraitCandidate<ID>>>;
26182629

26192630
// Map from the NodeId of a glob import to a list of items which are actually
26202631
// imported.

src/librustc_resolve/late.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ use crate::{path_names_to_string, BindingError, CrateLint, LexicalScopeBinding};
1111
use crate::{Module, ModuleOrUniformRoot, NameBindingKind, ParentScope, PathResult};
1212
use crate::{ResolutionError, Resolver, Segment, UseError};
1313

14-
use rustc::ty::TraitCandidate;
1514
use rustc::{bug, lint, span_bug};
1615
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
1716
use rustc_errors::DiagnosticId;
1817
use rustc_hir::def::Namespace::{self, *};
1918
use rustc_hir::def::{self, CtorKind, DefKind, PartialRes, PerNS};
2019
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX};
20+
use rustc_hir::TraitCandidate;
2121
use rustc_span::symbol::{kw, sym};
2222
use rustc_span::Span;
2323
use smallvec::{smallvec, SmallVec};
@@ -2078,7 +2078,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
20782078
&mut self,
20792079
mut ident: Ident,
20802080
ns: Namespace,
2081-
) -> Vec<TraitCandidate> {
2081+
) -> Vec<TraitCandidate<NodeId>> {
20822082
debug!("(getting traits containing item) looking for '{}'", ident.name);
20832083

20842084
let mut found_traits = Vec::new();
@@ -2123,7 +2123,7 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
21232123
ident: Ident,
21242124
ns: Namespace,
21252125
module: Module<'a>,
2126-
found_traits: &mut Vec<TraitCandidate>,
2126+
found_traits: &mut Vec<TraitCandidate<NodeId>>,
21272127
) {
21282128
assert!(ns == TypeNS || ns == ValueNS);
21292129
let mut traits = module.traits.borrow_mut();

src/librustc_resolve/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use rustc::lint;
2222
use rustc::middle::cstore::{CrateStore, MetadataLoaderDyn};
2323
use rustc::span_bug;
2424
use rustc::ty::query::Providers;
25-
use rustc::ty::{self, DefIdTree, ResolverOutputs, TraitMap};
25+
use rustc::ty::{self, DefIdTree, ResolverOutputs};
2626
use rustc_ast_pretty::pprust;
2727
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap};
2828
use rustc_data_structures::ptr_key::PtrKey;
@@ -32,8 +32,8 @@ use rustc_expand::base::SyntaxExtension;
3232
use rustc_hir::def::Namespace::*;
3333
use rustc_hir::def::{self, CtorOf, DefKind, NonMacroAttrKind, PartialRes};
3434
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, CRATE_DEF_INDEX, LOCAL_CRATE};
35-
use rustc_hir::GlobMap;
3635
use rustc_hir::PrimTy::{self, Bool, Char, Float, Int, Str, Uint};
36+
use rustc_hir::{GlobMap, TraitMap};
3737
use rustc_metadata::creader::{CStore, CrateLoader};
3838
use rustc_session::lint::{BuiltinLintDiagnostics, LintBuffer};
3939
use rustc_session::Session;
@@ -865,7 +865,7 @@ pub struct Resolver<'a> {
865865
/// `CrateNum` resolutions of `extern crate` items.
866866
extern_crate_map: NodeMap<CrateNum>,
867867
export_map: ExportMap<NodeId>,
868-
trait_map: TraitMap,
868+
trait_map: TraitMap<NodeId>,
869869

870870
/// A map from nodes to anonymous modules.
871871
/// Anonymous modules are pseudo-modules that are implicitly created around items

0 commit comments

Comments
 (0)