@@ -10,6 +10,7 @@ import common::*;
10
10
import middle:: trans:: common:: crate_ctxt;
11
11
import middle:: ty;
12
12
import middle:: ty:: node_id_to_type;
13
+ import middle:: ast_map;
13
14
import front:: attr;
14
15
import driver:: session:: session;
15
16
@@ -233,8 +234,9 @@ fn encode_enum_id(ebml_w: ebml::writer, id: def_id) {
233
234
}
234
235
235
236
fn encode_enum_variant_info ( ecx : @encode_ctxt , ebml_w : ebml:: writer ,
236
- id : node_id , variants : [ variant ] ,
237
- & index: [ entry < int > ] , ty_params : [ ty_param ] ) {
237
+ id : node_id , variants : [ variant ] ,
238
+ path : ast_map:: path , & index: [ entry < int > ] ,
239
+ ty_params : [ ty_param ] ) {
238
240
let disr_val = 0 ;
239
241
let i = 0 ;
240
242
let vi = ty:: enum_variants ( ecx. ccx . tcx , { crate : local_crate, node: id} ) ;
@@ -256,14 +258,38 @@ fn encode_enum_variant_info(ecx: @encode_ctxt, ebml_w: ebml::writer,
256
258
disr_val = vi[ i] . disr_val ;
257
259
}
258
260
encode_type_param_bounds ( ebml_w, ecx, ty_params) ;
261
+ encode_path ( ebml_w, path, ast_map:: path_name ( variant. node . name ) ) ;
259
262
ebml:: end_tag ( ebml_w) ;
260
263
disr_val += 1 ;
261
264
i += 1 ;
262
265
}
263
266
}
264
267
268
+ fn encode_path ( ebml_w : ebml:: writer ,
269
+ path : ast_map:: path ,
270
+ name : ast_map:: path_elt ) {
271
+ fn encode_path_elt ( ebml_w : ebml:: writer , elt : ast_map:: path_elt ) {
272
+ let ( tag, name) = alt elt {
273
+ ast_map : : path_mod ( name) { ( tag_path_elt_mod, name) }
274
+ ast_map:: path_name ( name) { ( tag_path_elt_name, name) }
275
+ } ;
276
+
277
+ ebml_w. wr_tag ( tag) { ||
278
+ ebml_w. wr_str ( name)
279
+ }
280
+ }
281
+
282
+ ebml_w. wr_tag ( tag_path) { ||
283
+ ebml_w. wr_tag ( tag_path_len) { ||
284
+ ebml_w. wr_uint ( vec:: len ( path) + 1 u) ;
285
+ }
286
+ vec:: iter ( path) { |pe| encode_path_elt ( ebml_w, pe) ; }
287
+ encode_path_elt ( ebml_w, name) ;
288
+ }
289
+ }
290
+
265
291
fn encode_info_for_mod ( ecx : @encode_ctxt , ebml_w : ebml:: writer , md : _mod ,
266
- id : node_id , name : ident ) {
292
+ id : node_id , path : ast_map :: path , name : ident ) {
267
293
ebml:: start_tag ( ebml_w, tag_items_data_item) ;
268
294
encode_def_id ( ebml_w, local_def ( id) ) ;
269
295
encode_family ( ebml_w, 'm' as u8 ) ;
@@ -281,11 +307,12 @@ fn encode_info_for_mod(ecx: @encode_ctxt, ebml_w: ebml::writer, md: _mod,
281
307
_ { ecx. ccx . tcx . sess . bug ( "encode_info_for_mod: \
282
308
undocumented invariant") ; }
283
309
}
310
+ encode_path ( ebml_w, path, ast_map:: path_mod ( name) ) ;
284
311
ebml:: end_tag ( ebml_w) ;
285
312
}
286
313
287
314
fn encode_info_for_item ( ecx : @encode_ctxt , ebml_w : ebml:: writer , item: @item,
288
- & index: [ entry < int > ] ) {
315
+ & index: [ entry < int > ] , path : ast_map :: path ) {
289
316
let tcx = ecx. ccx . tcx ;
290
317
alt item. node {
291
318
item_const ( _, _) {
@@ -294,6 +321,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
294
321
encode_family ( ebml_w, 'c' as u8 ) ;
295
322
encode_type ( ecx, ebml_w, node_id_to_type ( tcx, item. id ) ) ;
296
323
encode_symbol ( ecx, ebml_w, item. id ) ;
324
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
297
325
ebml:: end_tag ( ebml_w) ;
298
326
}
299
327
item_fn ( decl, tps, _) {
@@ -308,16 +336,18 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
308
336
encode_type_param_bounds ( ebml_w, ecx, tps) ;
309
337
encode_type ( ecx, ebml_w, node_id_to_type ( tcx, item. id ) ) ;
310
338
encode_symbol ( ecx, ebml_w, item. id ) ;
339
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
311
340
ebml:: end_tag ( ebml_w) ;
312
341
}
313
342
item_mod ( m) {
314
- encode_info_for_mod ( ecx, ebml_w, m, item. id , item. ident ) ;
343
+ encode_info_for_mod ( ecx, ebml_w, m, item. id , path , item. ident ) ;
315
344
}
316
345
item_native_mod ( _) {
317
346
ebml:: start_tag ( ebml_w, tag_items_data_item) ;
318
347
encode_def_id ( ebml_w, local_def ( item. id ) ) ;
319
348
encode_family ( ebml_w, 'n' as u8 ) ;
320
349
encode_name ( ebml_w, item. ident ) ;
350
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
321
351
ebml:: end_tag ( ebml_w) ;
322
352
}
323
353
item_ty ( _, tps) {
@@ -327,6 +357,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
327
357
encode_type_param_bounds ( ebml_w, ecx, tps) ;
328
358
encode_type ( ecx, ebml_w, node_id_to_type ( tcx, item. id ) ) ;
329
359
encode_name ( ebml_w, item. ident ) ;
360
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
330
361
ebml:: end_tag ( ebml_w) ;
331
362
}
332
363
item_enum ( variants, tps) {
@@ -339,8 +370,10 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
339
370
for v: variant in variants {
340
371
encode_variant_id ( ebml_w, local_def ( v. node . id ) ) ;
341
372
}
373
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
342
374
ebml:: end_tag ( ebml_w) ;
343
- encode_enum_variant_info ( ecx, ebml_w, item. id , variants, index, tps) ;
375
+ encode_enum_variant_info ( ecx, ebml_w, item. id , variants,
376
+ path, index, tps) ;
344
377
}
345
378
item_class ( _, _, _, _, _) {
346
379
fail "encode: implement item_class" ;
@@ -355,6 +388,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
355
388
encode_type ( ecx, ebml_w, ty:: ty_fn_ret ( fn_ty) ) ;
356
389
encode_name ( ebml_w, item. ident ) ;
357
390
encode_symbol ( ecx, ebml_w, item. id ) ;
391
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
358
392
ebml:: end_tag ( ebml_w) ;
359
393
360
394
index += [ { val: ctor_id, pos: ebml_w. writer . tell ( ) } ] ;
@@ -364,6 +398,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
364
398
encode_type_param_bounds ( ebml_w, ecx, tps) ;
365
399
encode_type ( ecx, ebml_w, fn_ty) ;
366
400
encode_symbol ( ecx, ebml_w, ctor_id) ;
401
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
367
402
ebml:: end_tag ( ebml_w) ;
368
403
}
369
404
item_impl ( tps, ifce, _, methods) {
@@ -388,8 +423,10 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
388
423
}
389
424
_ { }
390
425
}
426
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
391
427
ebml:: end_tag ( ebml_w) ;
392
428
429
+ let impl_path = path + [ ast_map:: path_name ( item. ident ) ] ;
393
430
for m in methods {
394
431
index += [ { val: m. id , pos: ebml_w. writer . tell ( ) } ] ;
395
432
ebml:: start_tag ( ebml_w, tag_items_data_item) ;
@@ -400,6 +437,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
400
437
node_id_to_type ( tcx, m. id ) ) ;
401
438
encode_name ( ebml_w, m. ident ) ;
402
439
encode_symbol ( ecx, ebml_w, m. id ) ;
440
+ encode_path ( ebml_w, impl_path, ast_map:: path_name ( m. ident ) ) ;
403
441
ebml:: end_tag ( ebml_w) ;
404
442
}
405
443
}
@@ -419,13 +457,14 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
419
457
ebml:: end_tag ( ebml_w) ;
420
458
i += 1 u;
421
459
}
460
+ encode_path ( ebml_w, path, ast_map:: path_name ( item. ident ) ) ;
422
461
ebml:: end_tag ( ebml_w) ;
423
462
}
424
463
}
425
464
}
426
465
427
466
fn encode_info_for_native_item ( ecx : @encode_ctxt , ebml_w : ebml:: writer ,
428
- nitem : @native_item ) {
467
+ nitem : @native_item , path : ast_map :: path ) {
429
468
ebml:: start_tag ( ebml_w, tag_items_data_item) ;
430
469
alt nitem. node {
431
470
native_item_fn ( fn_decl, tps) {
@@ -439,6 +478,7 @@ fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer,
439
478
encode_type_param_bounds ( ebml_w, ecx, tps) ;
440
479
encode_type ( ecx, ebml_w, node_id_to_type ( ecx. ccx . tcx , nitem. id ) ) ;
441
480
encode_symbol ( ecx, ebml_w, nitem. id ) ;
481
+ encode_path ( ebml_w, path, ast_map:: path_name ( nitem. ident ) ) ;
442
482
}
443
483
}
444
484
ebml:: end_tag ( ebml_w) ;
@@ -449,16 +489,16 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer,
449
489
let index: [ entry < int > ] = [ ] ;
450
490
ebml:: start_tag ( ebml_w, tag_items_data) ;
451
491
index += [ { val: crate_node_id, pos: ebml_w. writer . tell ( ) } ] ;
452
- encode_info_for_mod ( ecx, ebml_w, crate_mod, crate_node_id, "" ) ;
492
+ encode_info_for_mod ( ecx, ebml_w, crate_mod, crate_node_id, [ ] , "" ) ;
453
493
ecx. ccx . ast_map . items { |key, val|
454
494
alt val {
455
- middle : : ast_map:: node_item ( i, _ ) {
495
+ middle : : ast_map:: node_item ( i, path ) {
456
496
index += [ { val: key, pos: ebml_w. writer . tell ( ) } ] ;
457
- encode_info_for_item ( ecx, ebml_w, i, index) ;
497
+ encode_info_for_item ( ecx, ebml_w, i, index, * path ) ;
458
498
}
459
- middle:: ast_map:: node_native_item ( i, _ ) {
499
+ middle:: ast_map:: node_native_item ( i, path ) {
460
500
index += [ { val: key, pos: ebml_w. writer . tell ( ) } ] ;
461
- encode_info_for_native_item ( ecx, ebml_w, i) ;
501
+ encode_info_for_native_item ( ecx, ebml_w, i, * path ) ;
462
502
}
463
503
_ { }
464
504
}
0 commit comments