@@ -25,7 +25,7 @@ use middle::ty;
25
25
use middle:: typeck;
26
26
use middle:: astencode:: vtable_decoder_helpers;
27
27
28
-
28
+ use std :: at_vec ;
29
29
use std:: u64;
30
30
use std:: rt:: io;
31
31
use 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 {
252
252
doc_trait_ref ( tp, tcx, cdata)
253
253
}
254
254
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 ,
256
258
tag : uint )
257
- -> @~[ ty:: TypeParameterDef ] {
259
+ -> @~[ ty:: TypeParameterDef ] {
258
260
let mut bounds = ~[ ] ;
259
261
do reader:: tagged_docs ( item, tag) |p| {
260
262
let bd = parse_type_param_def_data (
@@ -266,10 +268,23 @@ fn item_ty_param_defs(item: ebml::Doc, tcx: ty::ctxt, cdata: Cmd,
266
268
@bounds
267
269
}
268
270
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
+ } ;
273
288
}
274
289
}
275
290
@@ -393,7 +408,7 @@ pub fn get_trait_def(cdata: Cmd,
393
408
let item_doc = lookup_item ( item_id, cdata. data ) ;
394
409
let tp_defs = item_ty_param_defs ( item_doc, tcx, cdata,
395
410
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 ) ;
397
412
let mut bounds = ty:: EmptyBuiltinBounds ( ) ;
398
413
// Collect the builtin bounds from the encoded supertraits.
399
414
// FIXME(#8559): They should be encoded directly.
@@ -407,7 +422,7 @@ pub fn get_trait_def(cdata: Cmd,
407
422
} ;
408
423
ty:: TraitDef {
409
424
generics : ty:: Generics { type_param_defs : tp_defs,
410
- region_param : rp } ,
425
+ region_param_defs : rp_defs } ,
411
426
bounds : bounds,
412
427
trait_ref : @item_trait_ref ( item_doc, tcx, cdata)
413
428
}
@@ -417,33 +432,27 @@ pub fn get_type(cdata: Cmd, id: ast::NodeId, tcx: ty::ctxt)
417
432
-> ty:: ty_param_bounds_and_ty {
418
433
419
434
let item = lookup_item ( id, cdata. data ) ;
435
+
420
436
let t = item_type ( ast:: DefId { crate : cdata. cnum , node : id } , item, tcx,
421
437
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
+
426
442
ty:: ty_param_bounds_and_ty {
427
443
generics : ty:: Generics { type_param_defs : tp_defs,
428
- region_param : rp } ,
444
+ region_param_defs : rp_defs } ,
429
445
ty : t
430
446
}
431
447
}
432
448
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
-
440
449
pub fn get_type_param_count ( data : @~[ u8 ] , id : ast:: NodeId ) -> uint {
441
450
item_ty_param_count ( lookup_item ( id, data) )
442
451
}
443
452
444
453
pub 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 >
447
456
{
448
457
let item_doc = lookup_item ( id, cdata. data ) ;
449
458
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,
1044
1053
let name = item_name ( intr, method_doc) ;
1045
1054
let type_param_defs = item_ty_param_defs ( method_doc, tcx, cdata,
1046
1055
tag_item_method_tps) ;
1056
+ let rp_defs = item_region_param_defs ( method_doc, tcx, cdata) ;
1047
1057
let transformed_self_ty = doc_transformed_self_ty ( method_doc, tcx, cdata) ;
1048
1058
let fty = doc_method_fty ( method_doc, tcx, cdata) ;
1049
1059
let vis = item_visibility ( method_doc) ;
@@ -1054,7 +1064,7 @@ pub fn get_method(intr: @ident_interner, cdata: Cmd, id: ast::NodeId,
1054
1064
name,
1055
1065
ty:: Generics {
1056
1066
type_param_defs : type_param_defs,
1057
- region_param : None
1067
+ region_param_defs : rp_defs ,
1058
1068
} ,
1059
1069
transformed_self_ty,
1060
1070
fty,
@@ -1078,6 +1088,14 @@ pub fn get_trait_method_def_ids(cdata: Cmd,
1078
1088
result
1079
1089
}
1080
1090
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
+
1081
1099
pub fn get_provided_trait_methods ( intr : @ident_interner , cdata : Cmd ,
1082
1100
id : ast:: NodeId , tcx : ty:: ctxt ) ->
1083
1101
~[ @ty:: Method ] {
0 commit comments