@@ -25,7 +25,7 @@ use middle::ty;
2525use middle:: typeck;
2626use middle:: astencode:: vtable_decoder_helpers;
2727
28-
28+ use std :: at_vec ;
2929use std:: u64;
3030use std:: rt:: io;
3131use std:: rt:: io:: extensions:: u64_from_be_bytes;
@@ -252,9 +252,11 @@ fn item_trait_ref(doc: ebml::Doc, tcx: ty::ctxt, cdata: Cmd) -> ty::TraitRef {
252252 doc_trait_ref ( tp, tcx, cdata)
253253}
254254
255- fn item_ty_param_defs ( item : ebml:: Doc , tcx : ty:: ctxt , cdata : Cmd ,
255+ fn item_ty_param_defs ( item : ebml:: Doc ,
256+ tcx : ty:: ctxt ,
257+ cdata : Cmd ,
256258 tag : uint )
257- -> @~[ ty:: TypeParameterDef ] {
259+ -> @~[ ty:: TypeParameterDef ] {
258260 let mut bounds = ~[ ] ;
259261 do reader:: tagged_docs ( item, tag) |p| {
260262 let bd = parse_type_param_def_data (
@@ -266,10 +268,23 @@ fn item_ty_param_defs(item: ebml::Doc, tcx: ty::ctxt, cdata: Cmd,
266268 @bounds
267269}
268270
269- fn item_ty_region_param ( item : ebml:: Doc ) -> Option < ty:: region_variance > {
270- do reader:: maybe_get_doc ( item, tag_region_param) . map |doc| {
271- let mut decoder = reader:: Decoder ( doc) ;
272- Decodable :: decode ( & mut decoder)
271+ fn item_region_param_defs ( item_doc : ebml:: Doc ,
272+ tcx : ty:: ctxt ,
273+ cdata : Cmd )
274+ -> @[ ty:: RegionParameterDef ] {
275+ do at_vec:: build ( None ) |push| {
276+ do reader:: tagged_docs ( item_doc, tag_region_param_def) |rp_doc| {
277+ let ident_str_doc = reader:: get_doc ( rp_doc,
278+ tag_region_param_def_ident) ;
279+ let ident = item_name ( tcx. sess . intr ( ) , ident_str_doc) ;
280+ let def_id_doc = reader:: get_doc ( rp_doc,
281+ tag_region_param_def_def_id) ;
282+ let def_id = reader:: with_doc_data ( def_id_doc, parse_def_id) ;
283+ let def_id = translate_def_id ( cdata, def_id) ;
284+ push ( ty:: RegionParameterDef { ident : ident,
285+ def_id : def_id } ) ;
286+ true
287+ } ;
273288 }
274289}
275290
@@ -393,7 +408,7 @@ pub fn get_trait_def(cdata: Cmd,
393408 let item_doc = lookup_item ( item_id, cdata. data ) ;
394409 let tp_defs = item_ty_param_defs ( item_doc, tcx, cdata,
395410 tag_items_data_item_ty_param_bounds) ;
396- let rp = item_ty_region_param ( item_doc) ;
411+ let rp_defs = item_region_param_defs ( item_doc, tcx , cdata ) ;
397412 let mut bounds = ty:: EmptyBuiltinBounds ( ) ;
398413 // Collect the builtin bounds from the encoded supertraits.
399414 // FIXME(#8559): They should be encoded directly.
@@ -407,7 +422,7 @@ pub fn get_trait_def(cdata: Cmd,
407422 } ;
408423 ty:: TraitDef {
409424 generics : ty:: Generics { type_param_defs : tp_defs,
410- region_param : rp } ,
425+ region_param_defs : rp_defs } ,
411426 bounds : bounds,
412427 trait_ref : @item_trait_ref ( item_doc, tcx, cdata)
413428 }
@@ -417,33 +432,27 @@ pub fn get_type(cdata: Cmd, id: ast::NodeId, tcx: ty::ctxt)
417432 -> ty:: ty_param_bounds_and_ty {
418433
419434 let item = lookup_item ( id, cdata. data ) ;
435+
420436 let t = item_type ( ast:: DefId { crate : cdata. cnum , node : id } , item, tcx,
421437 cdata) ;
422- let tp_defs = if family_has_type_params ( item_family ( item ) ) {
423- item_ty_param_defs ( item, tcx, cdata, tag_items_data_item_ty_param_bounds)
424- } else { @~ [ ] } ;
425- let rp = item_ty_region_param ( item ) ;
438+
439+ let tp_defs = item_ty_param_defs ( item, tcx, cdata, tag_items_data_item_ty_param_bounds) ;
440+ let rp_defs = item_region_param_defs ( item , tcx , cdata ) ;
441+
426442 ty:: ty_param_bounds_and_ty {
427443 generics : ty:: Generics { type_param_defs : tp_defs,
428- region_param : rp } ,
444+ region_param_defs : rp_defs } ,
429445 ty : t
430446 }
431447}
432448
433- pub fn get_region_param ( cdata : Cmd , id : ast:: NodeId )
434- -> Option < ty:: region_variance > {
435-
436- let item = lookup_item ( id, cdata. data ) ;
437- return item_ty_region_param ( item) ;
438- }
439-
440449pub fn get_type_param_count ( data : @~[ u8 ] , id : ast:: NodeId ) -> uint {
441450 item_ty_param_count ( lookup_item ( id, data) )
442451}
443452
444453pub fn get_impl_trait ( cdata : Cmd ,
445- id : ast:: NodeId ,
446- tcx : ty:: ctxt ) -> Option < @ty:: TraitRef >
454+ id : ast:: NodeId ,
455+ tcx : ty:: ctxt ) -> Option < @ty:: TraitRef >
447456{
448457 let item_doc = lookup_item ( id, cdata. data ) ;
449458 do reader:: maybe_get_doc ( item_doc, tag_item_trait_ref) . map |tp| {
@@ -1044,6 +1053,7 @@ pub fn get_method(intr: @ident_interner, cdata: Cmd, id: ast::NodeId,
10441053 let name = item_name ( intr, method_doc) ;
10451054 let type_param_defs = item_ty_param_defs ( method_doc, tcx, cdata,
10461055 tag_item_method_tps) ;
1056+ let rp_defs = item_region_param_defs ( method_doc, tcx, cdata) ;
10471057 let transformed_self_ty = doc_transformed_self_ty ( method_doc, tcx, cdata) ;
10481058 let fty = doc_method_fty ( method_doc, tcx, cdata) ;
10491059 let vis = item_visibility ( method_doc) ;
@@ -1054,7 +1064,7 @@ pub fn get_method(intr: @ident_interner, cdata: Cmd, id: ast::NodeId,
10541064 name,
10551065 ty:: Generics {
10561066 type_param_defs : type_param_defs,
1057- region_param : None
1067+ region_param_defs : rp_defs ,
10581068 } ,
10591069 transformed_self_ty,
10601070 fty,
@@ -1078,6 +1088,14 @@ pub fn get_trait_method_def_ids(cdata: Cmd,
10781088 result
10791089}
10801090
1091+ pub fn get_item_variances ( cdata : Cmd , id : ast:: NodeId ) -> ty:: ItemVariances {
1092+ let data = cdata. data ;
1093+ let item_doc = lookup_item ( id, data) ;
1094+ let variance_doc = reader:: get_doc ( item_doc, tag_item_variances) ;
1095+ let mut decoder = reader:: Decoder ( variance_doc) ;
1096+ Decodable :: decode ( & mut decoder)
1097+ }
1098+
10811099pub fn get_provided_trait_methods ( intr : @ident_interner , cdata : Cmd ,
10821100 id : ast:: NodeId , tcx : ty:: ctxt ) ->
10831101 ~[ @ty:: Method ] {
0 commit comments