Skip to content

Commit f89e00b

Browse files
committed
auto merge of #6543 : catamorphism/rust/traits-cleanup, r=nikomatsakis
r? @nikomatsakis Impls can implement either zero or one traits; this has been true more or less since we removed classes. So I got rid of the comments saying "we should support multiple traits" and changed the code to make it clear that we don't. This is just cleanup, and doesn't break any existing tests.
2 parents 00eef96 + 65b7903 commit f89e00b

File tree

6 files changed

+37
-40
lines changed

6 files changed

+37
-40
lines changed

src/librustc/metadata/csearch.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,13 @@ pub fn get_field_type(tcx: ty::ctxt, class_id: ast::def_id,
234234
}
235235
}
236236

237-
// Given a def_id for an impl or class, return the traits it implements,
238-
// or the empty vector if it's not for an impl or for a class that implements
239-
// traits
240-
pub fn get_impl_traits(tcx: ty::ctxt,
241-
def: ast::def_id) -> ~[@ty::TraitRef] {
237+
// Given a def_id for an impl, return the trait it implements,
238+
// if there is one.
239+
pub fn get_impl_trait(tcx: ty::ctxt,
240+
def: ast::def_id) -> Option<@ty::TraitRef> {
242241
let cstore = tcx.cstore;
243242
let cdata = cstore::get_crate_data(cstore, def.crate);
244-
decoder::get_impl_traits(cdata, def.node, tcx)
243+
decoder::get_impl_trait(cdata, def.node, tcx)
245244
}
246245

247246
pub fn get_impl_method(cstore: @mut cstore::CStore,

src/librustc/metadata/decoder.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -415,19 +415,20 @@ pub fn get_type_param_count(data: @~[u8], id: ast::node_id) -> uint {
415415
item_ty_param_count(lookup_item(id, data))
416416
}
417417

418-
pub fn get_impl_traits(cdata: cmd,
418+
pub fn get_impl_trait(cdata: cmd,
419419
id: ast::node_id,
420-
tcx: ty::ctxt) -> ~[@ty::TraitRef]
420+
tcx: ty::ctxt) -> Option<@ty::TraitRef>
421421
{
422422
let item_doc = lookup_item(id, cdata.data);
423-
let mut results = ~[];
423+
let mut result = None;
424424
for reader::tagged_docs(item_doc, tag_item_trait_ref) |tp| {
425425
let trait_ref =
426426
@parse_trait_ref_data(tp.data, cdata.cnum, tp.start, tcx,
427427
|_, did| translate_def_id(cdata, did));
428-
results.push(trait_ref);
428+
result = Some(trait_ref);
429+
break;
429430
};
430-
results
431+
result
431432
}
432433

433434
pub fn get_impl_method(intr: @ident_interner, cdata: cmd, id: ast::node_id,

src/librustc/middle/trans/meth.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -795,8 +795,11 @@ pub fn make_impl_vtable(ccx: @CrateContext,
795795
let _icx = ccx.insn_ctxt("impl::make_impl_vtable");
796796
let tcx = ccx.tcx;
797797

798-
// XXX: This should support multiple traits.
799-
let trt_id = ty::impl_trait_refs(tcx, impl_id)[0].def_id;
798+
let trt_id = match ty::impl_trait_ref(tcx, impl_id) {
799+
Some(t_id) => t_id.def_id,
800+
None => ccx.sess.bug("make_impl_vtable: don't know how to \
801+
make a vtable for a type impl!")
802+
};
800803

801804
let has_tps =
802805
!ty::lookup_item_type(ccx.tcx, impl_id).generics.type_param_defs.is_empty();

src/librustc/middle/ty.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3883,23 +3883,23 @@ pub fn trait_method_def_ids(cx: ctxt, id: ast::def_id) -> @~[def_id] {
38833883
|| @csearch::get_trait_method_def_ids(cx.cstore, id))
38843884
}
38853885

3886-
pub fn impl_trait_refs(cx: ctxt, id: ast::def_id) -> ~[@TraitRef] {
3886+
pub fn impl_trait_ref(cx: ctxt, id: ast::def_id) -> Option<@TraitRef> {
38873887
if id.crate == ast::local_crate {
3888-
debug!("(impl_traits) searching for trait impl %?", id);
3888+
debug!("(impl_trait_ref) searching for trait impl %?", id);
38893889
match cx.items.find(&id.node) {
38903890
Some(&ast_map::node_item(@ast::item {
38913891
node: ast::item_impl(_, opt_trait, _, _),
38923892
_},
38933893
_)) => {
38943894
match opt_trait {
3895-
Some(t) => ~[ty::node_id_to_trait_ref(cx, t.ref_id)],
3896-
None => ~[]
3895+
Some(t) => Some(ty::node_id_to_trait_ref(cx, t.ref_id)),
3896+
None => None
38973897
}
38983898
}
3899-
_ => ~[]
3899+
_ => None
39003900
}
39013901
} else {
3902-
csearch::get_impl_traits(cx, id)
3902+
csearch::get_impl_trait(cx, id)
39033903
}
39043904
}
39053905

src/librustc/middle/typeck/check/vtable.rs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -261,24 +261,14 @@ fn lookup_vtable(vcx: &VtableContext,
261261
}
262262
impls_seen.insert(im.did);
263263

264-
// ty::impl_traits gives us the list of all
265-
// traits that im implements. Again, usually
266-
// there's just one.
264+
// ty::impl_traits gives us the trait im implements,
265+
// if there is one (there's either zero or one).
267266
//
268-
// For example, if im represented the struct
269-
// in:
270-
//
271-
// struct foo : baz<int>, bar, quux { ... }
272-
//
273-
// then ty::impl_traits would return
274-
//
275-
// ~[baz<int>, bar, quux]
276-
//
277-
// For each of the traits foo implements, if
278-
// it's the same trait as trait_ref, we need to
267+
// If foo implements a trait t, and if t is the
268+
// same trait as trait_ref, we need to
279269
// unify it with trait_ref in order to get all
280270
// the ty vars sorted out.
281-
for ty::impl_trait_refs(tcx, im.did).each |&of_trait_ref|
271+
for ty::impl_trait_ref(tcx, im.did).each |&of_trait_ref|
282272
{
283273
if of_trait_ref.def_id != trait_ref.def_id { loop; }
284274

@@ -456,8 +446,12 @@ fn connect_trait_tps(vcx: &VtableContext,
456446
{
457447
let tcx = vcx.tcx();
458448

459-
// XXX: This should work for multiple traits.
460-
let impl_trait_ref = ty::impl_trait_refs(tcx, impl_did)[0];
449+
let impl_trait_ref = match ty::impl_trait_ref(tcx, impl_did) {
450+
Some(t) => t,
451+
None => vcx.tcx().sess.span_bug(location_info.span,
452+
"connect_trait_tps invoked on a type impl")
453+
};
454+
461455
let impl_trait_ref = (*impl_trait_ref).subst(tcx, impl_substs);
462456
relate_trait_refs(vcx, location_info, &impl_trait_ref, trait_ref);
463457
}

src/librustc/middle/typeck/coherence.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717

1818
use driver;
19-
use metadata::csearch::{each_path, get_impl_traits};
19+
use metadata::csearch::{each_path, get_impl_trait};
2020
use metadata::csearch::{get_impls_for_mod};
2121
use metadata::csearch;
2222
use metadata::cstore::{CStore, iter_crate_data};
@@ -898,13 +898,13 @@ pub impl CoherenceChecker {
898898

899899
let self_type = lookup_item_type(self.crate_context.tcx,
900900
implementation.did);
901-
let associated_traits = get_impl_traits(self.crate_context.tcx,
901+
let associated_traits = get_impl_trait(self.crate_context.tcx,
902902
implementation.did);
903903

904904
// Do a sanity check to make sure that inherent methods have base
905905
// types.
906906

907-
if associated_traits.len() == 0 {
907+
if associated_traits.is_none() {
908908
match get_base_type_def_id(self.inference_context,
909909
dummy_sp(),
910910
self_type.ty) {
@@ -940,7 +940,7 @@ pub impl CoherenceChecker {
940940
Some(base_type_def_id) => {
941941
// inherent methods apply to `impl Type` but not
942942
// `impl Trait for Type`:
943-
if associated_traits.len() == 0 {
943+
if associated_traits.is_none() {
944944
self.add_inherent_method(base_type_def_id,
945945
*implementation);
946946
}

0 commit comments

Comments
 (0)