@@ -60,6 +60,7 @@ export item_type; // sketchy
60
60
export maybe_get_item_ast;
61
61
export decode_inlined_item;
62
62
export method_info, _impl;
63
+ export GetCrateDataCb ;
63
64
64
65
// Used internally by astencode:
65
66
export translate_def_id;
@@ -88,6 +89,8 @@ fn lookup_hash(d: ebml::Doc, eq_fn: fn(x:&[u8]) -> bool, hash: uint) ->
88
89
None
89
90
}
90
91
92
+ pub type GetCrateDataCb = & fn ( ast:: crate_num ) -> cmd ;
93
+
91
94
fn maybe_find_item ( item_id : int , items : ebml:: Doc ) -> Option < ebml:: Doc > {
92
95
fn eq_item ( bytes : & [ u8 ] , item_id : int ) -> bool {
93
96
return io:: u64_from_be_bytes ( vec:: view ( bytes, 0 u, 4 u) , 0 u, 4 u) as int
@@ -477,7 +480,9 @@ fn path_entry(path_string: ~str, def_like: def_like) -> path_entry {
477
480
}
478
481
479
482
/// Iterates over all the paths in the given crate.
480
- fn each_path ( intr : @ident_interner , cdata : cmd , f : fn ( path_entry ) -> bool ) {
483
+ fn each_path ( intr : @ident_interner , cdata : cmd ,
484
+ get_crate_data : GetCrateDataCb ,
485
+ f : fn ( path_entry ) -> bool ) {
481
486
let root = ebml:: Doc ( cdata. data ) ;
482
487
let items = ebml:: get_doc ( root, tag_items) ;
483
488
let items_data = ebml:: get_doc ( items, tag_items_data) ;
@@ -526,8 +531,17 @@ fn each_path(intr: @ident_interner, cdata: cmd, f: fn(path_entry) -> bool) {
526
531
reexport_path = path + ~":: " + reexport_name;
527
532
}
528
533
534
+ // This reexport may be in yet another crate
535
+ let other_crates_items = if def_id. crate == cdata. cnum {
536
+ items
537
+ } else {
538
+ let crate_data = get_crate_data ( def_id. crate ) ;
539
+ let root = ebml:: Doc ( crate_data. data ) ;
540
+ ebml:: get_doc ( root, tag_items)
541
+ } ;
542
+
529
543
// Get the item.
530
- match maybe_find_item ( def_id. node , items ) {
544
+ match maybe_find_item ( def_id. node , other_crates_items ) {
531
545
None => { }
532
546
Some ( item_doc) => {
533
547
// Construct the def for this item.
@@ -1079,9 +1093,10 @@ fn get_crate_vers(data: @~[u8]) -> ~str {
1079
1093
} ;
1080
1094
}
1081
1095
1082
- fn iter_crate_items ( intr : @ident_interner ,
1083
- cdata : cmd , proc : fn ( ~str , ast:: def_id ) ) {
1084
- for each_path( intr, cdata) |path_entry| {
1096
+ fn iter_crate_items ( intr : @ident_interner , cdata : cmd ,
1097
+ get_crate_data : GetCrateDataCb ,
1098
+ proc : fn ( ~str , ast:: def_id ) ) {
1099
+ for each_path( intr, cdata, get_crate_data) |path_entry| {
1085
1100
match path_entry. def_like {
1086
1101
dl_impl( * ) | dl_field => { }
1087
1102
dl_def( def) => {
@@ -1091,7 +1106,8 @@ fn iter_crate_items(intr: @ident_interner,
1091
1106
}
1092
1107
}
1093
1108
1094
- fn get_crate_module_paths( intr : @ident_interner , cdata : cmd )
1109
+ fn get_crate_module_paths( intr : @ident_interner , cdata : cmd ,
1110
+ get_crate_data : GetCrateDataCb )
1095
1111
-> ~[ ( ast:: def_id , ~str ) ] {
1096
1112
fn mod_of_path ( p : ~str ) -> ~str {
1097
1113
str:: connect ( vec:: init ( str:: split_str ( p, ~":: ") ) , ~":: ")
@@ -1101,7 +1117,7 @@ fn get_crate_module_paths(intr: @ident_interner, cdata: cmd)
1101
1117
// fowarded path due to renamed import or reexport
1102
1118
let mut res = ~[ ] ;
1103
1119
let mods = map:: HashMap ( ) ;
1104
- do iter_crate_items ( intr, cdata) |path, did| {
1120
+ do iter_crate_items ( intr, cdata, get_crate_data ) |path, did| {
1105
1121
let m = mod_of_path ( path) ;
1106
1122
if str:: is_not_empty ( m) {
1107
1123
// if m has a sub-item, it must be a module
0 commit comments