@@ -15,6 +15,7 @@ use super::span_utils::SpanUtils;
15
15
16
16
use metadata:: cstore:: LOCAL_CRATE ;
17
17
use middle:: def_id:: { CRATE_DEF_INDEX , DefId } ;
18
+ use middle:: ty;
18
19
19
20
use std:: io:: Write ;
20
21
@@ -51,9 +52,10 @@ impl Recorder {
51
52
}
52
53
}
53
54
54
- pub struct FmtStrs < ' a > {
55
+ pub struct FmtStrs < ' a , ' tcx : ' a > {
55
56
pub recorder : Box < Recorder > ,
56
57
span : SpanUtils < ' a > ,
58
+ tcx : & ' a ty:: ctxt < ' tcx > ,
57
59
}
58
60
59
61
macro_rules! s { ( $e: expr) => { format!( "{}" , $e) } }
@@ -96,11 +98,29 @@ pub enum Row {
96
98
FnRef ,
97
99
}
98
100
99
- impl < ' a > FmtStrs < ' a > {
100
- pub fn new ( rec : Box < Recorder > , span : SpanUtils < ' a > ) -> FmtStrs < ' a > {
101
+ impl < ' a , ' tcx : ' a > FmtStrs < ' a , ' tcx > {
102
+ pub fn new ( rec : Box < Recorder > ,
103
+ span : SpanUtils < ' a > ,
104
+ tcx : & ' a ty:: ctxt < ' tcx > )
105
+ -> FmtStrs < ' a , ' tcx > {
101
106
FmtStrs {
102
107
recorder : rec,
103
108
span : span,
109
+ tcx : tcx,
110
+ }
111
+ }
112
+
113
+ // Emitted ids are used to cross-reference items across crates. DefIds and
114
+ // NodeIds do not usually correspond in any way. The strategy is to use the
115
+ // index from the DefId as a crate-local id. However, within a crate, DefId
116
+ // indices and NodeIds can overlap. So, we must adjust the NodeIds. If an
117
+ // item can be identified by a DefId as well as a NodeId, then we use the
118
+ // DefId index as the id. If it can't, then we have to use the NodeId, but
119
+ // need to adjust it so it will not clash with any possible DefId index.
120
+ fn normalize_node_id ( & self , id : NodeId ) -> usize {
121
+ match self . tcx . map . opt_local_def_id ( id) {
122
+ Some ( id) => id. index . as_usize ( ) ,
123
+ None => id as usize + self . tcx . map . num_local_def_ids ( )
104
124
}
105
125
}
106
126
@@ -321,6 +341,7 @@ impl<'a> FmtStrs<'a> {
321
341
let mut qualname = String :: from ( name) ;
322
342
qualname. push_str ( "$" ) ;
323
343
qualname. push_str ( & id. to_string ( ) ) ;
344
+ let id = self . normalize_node_id ( id) ;
324
345
self . check_and_record ( Variable ,
325
346
span,
326
347
sub_span,
@@ -338,6 +359,7 @@ impl<'a> FmtStrs<'a> {
338
359
let mut qualname = String :: from ( fn_name) ;
339
360
qualname. push_str ( "::" ) ;
340
361
qualname. push_str ( name) ;
362
+ let id = self . normalize_node_id ( id) ;
341
363
self . check_and_record ( Variable ,
342
364
span,
343
365
sub_span,
@@ -354,6 +376,8 @@ impl<'a> FmtStrs<'a> {
354
376
value : & str ,
355
377
typ : & str ,
356
378
scope_id : NodeId ) {
379
+ let id = self . normalize_node_id ( id) ;
380
+ let scope_id = self . normalize_node_id ( scope_id) ;
357
381
self . check_and_record ( Variable ,
358
382
span,
359
383
sub_span,
@@ -368,6 +392,8 @@ impl<'a> FmtStrs<'a> {
368
392
qualname : & str ,
369
393
typ : & str ,
370
394
scope_id : NodeId ) {
395
+ let id = self . normalize_node_id ( id) ;
396
+ let scope_id = self . normalize_node_id ( scope_id) ;
371
397
self . check_and_record ( Variable ,
372
398
span,
373
399
sub_span,
@@ -381,6 +407,8 @@ impl<'a> FmtStrs<'a> {
381
407
name : & str ,
382
408
scope_id : NodeId ,
383
409
value : & str ) {
410
+ let id = self . normalize_node_id ( id) ;
411
+ let scope_id = self . normalize_node_id ( scope_id) ;
384
412
self . check_and_record ( Enum , span, sub_span, svec ! ( id, name, scope_id, value) ) ;
385
413
}
386
414
@@ -393,6 +421,8 @@ impl<'a> FmtStrs<'a> {
393
421
typ : & str ,
394
422
val : & str ,
395
423
scope_id : NodeId ) {
424
+ let id = self . normalize_node_id ( id) ;
425
+ let scope_id = self . normalize_node_id ( scope_id) ;
396
426
self . check_and_record ( Variant ,
397
427
span,
398
428
sub_span,
@@ -408,6 +438,9 @@ impl<'a> FmtStrs<'a> {
408
438
typ : & str ,
409
439
val : & str ,
410
440
scope_id : NodeId ) {
441
+ let id = self . normalize_node_id ( id) ;
442
+ let scope_id = self . normalize_node_id ( scope_id) ;
443
+ let ctor_id = self . normalize_node_id ( ctor_id) ;
411
444
self . check_and_record ( VariantStruct ,
412
445
span,
413
446
sub_span,
@@ -420,6 +453,8 @@ impl<'a> FmtStrs<'a> {
420
453
id : NodeId ,
421
454
name : & str ,
422
455
scope_id : NodeId ) {
456
+ let id = self . normalize_node_id ( id) ;
457
+ let scope_id = self . normalize_node_id ( scope_id) ;
423
458
self . check_and_record ( Function ,
424
459
span,
425
460
sub_span,
@@ -433,6 +468,8 @@ impl<'a> FmtStrs<'a> {
433
468
name : & str ,
434
469
decl_id : Option < DefId > ,
435
470
scope_id : NodeId ) {
471
+ let id = self . normalize_node_id ( id) ;
472
+ let scope_id = self . normalize_node_id ( scope_id) ;
436
473
let values = match decl_id {
437
474
Some ( decl_id) => svec ! ( id,
438
475
name,
@@ -450,6 +487,8 @@ impl<'a> FmtStrs<'a> {
450
487
id : NodeId ,
451
488
name : & str ,
452
489
scope_id : NodeId ) {
490
+ let id = self . normalize_node_id ( id) ;
491
+ let scope_id = self . normalize_node_id ( scope_id) ;
453
492
self . check_and_record ( MethodDecl , span, sub_span, svec ! ( id, name, scope_id) ) ;
454
493
}
455
494
@@ -461,6 +500,9 @@ impl<'a> FmtStrs<'a> {
461
500
name : & str ,
462
501
scope_id : NodeId ,
463
502
value : & str ) {
503
+ let id = self . normalize_node_id ( id) ;
504
+ let scope_id = self . normalize_node_id ( scope_id) ;
505
+ let ctor_id = self . normalize_node_id ( ctor_id) ;
464
506
self . check_and_record ( Struct ,
465
507
span,
466
508
sub_span,
@@ -474,6 +516,8 @@ impl<'a> FmtStrs<'a> {
474
516
name : & str ,
475
517
scope_id : NodeId ,
476
518
value : & str ) {
519
+ let id = self . normalize_node_id ( id) ;
520
+ let scope_id = self . normalize_node_id ( scope_id) ;
477
521
self . check_and_record ( Trait , span, sub_span, svec ! ( id, name, scope_id, value) ) ;
478
522
}
479
523
@@ -484,6 +528,8 @@ impl<'a> FmtStrs<'a> {
484
528
ref_id : Option < DefId > ,
485
529
trait_id : Option < DefId > ,
486
530
scope_id : NodeId ) {
531
+ let id = self . normalize_node_id ( id) ;
532
+ let scope_id = self . normalize_node_id ( scope_id) ;
487
533
let ref_id = ref_id. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
488
534
let trait_id = trait_id. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
489
535
self . check_and_record ( Impl ,
@@ -504,6 +550,8 @@ impl<'a> FmtStrs<'a> {
504
550
name : & str ,
505
551
parent : NodeId ,
506
552
filename : & str ) {
553
+ let id = self . normalize_node_id ( id) ;
554
+ let parent = self . normalize_node_id ( parent) ;
507
555
self . check_and_record ( Module ,
508
556
span,
509
557
sub_span,
@@ -517,6 +565,8 @@ impl<'a> FmtStrs<'a> {
517
565
mod_id : Option < DefId > ,
518
566
name : & str ,
519
567
parent : NodeId ) {
568
+ let id = self . normalize_node_id ( id) ;
569
+ let parent = self . normalize_node_id ( parent) ;
520
570
let mod_id = mod_id. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
521
571
self . check_and_record ( UseAlias ,
522
572
span,
@@ -530,6 +580,8 @@ impl<'a> FmtStrs<'a> {
530
580
id : NodeId ,
531
581
values : & str ,
532
582
parent : NodeId ) {
583
+ let id = self . normalize_node_id ( id) ;
584
+ let parent = self . normalize_node_id ( parent) ;
533
585
self . check_and_record ( UseGlob , span, sub_span, svec ! ( id, values, parent) ) ;
534
586
}
535
587
@@ -541,6 +593,8 @@ impl<'a> FmtStrs<'a> {
541
593
name : & str ,
542
594
loc : & str ,
543
595
parent : NodeId ) {
596
+ let id = self . normalize_node_id ( id) ;
597
+ let parent = self . normalize_node_id ( parent) ;
544
598
self . check_and_record ( ExternCrate ,
545
599
span,
546
600
sub_span,
@@ -552,6 +606,7 @@ impl<'a> FmtStrs<'a> {
552
606
sub_span : Option < Span > ,
553
607
base_id : DefId ,
554
608
deriv_id : NodeId ) {
609
+ let deriv_id = self . normalize_node_id ( deriv_id) ;
555
610
self . check_and_record ( Inheritance ,
556
611
span,
557
612
sub_span,
@@ -563,6 +618,7 @@ impl<'a> FmtStrs<'a> {
563
618
sub_span : Option < Span > ,
564
619
id : DefId ,
565
620
scope_id : NodeId ) {
621
+ let scope_id = self . normalize_node_id ( scope_id) ;
566
622
self . check_and_record ( FnCall ,
567
623
span,
568
624
sub_span,
@@ -575,6 +631,7 @@ impl<'a> FmtStrs<'a> {
575
631
defid : Option < DefId > ,
576
632
declid : Option < DefId > ,
577
633
scope_id : NodeId ) {
634
+ let scope_id = self . normalize_node_id ( scope_id) ;
578
635
let defid = defid. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
579
636
let ( dcn, dck) = match declid {
580
637
Some ( declid) => ( s ! ( declid. index. as_usize( ) ) , s ! ( declid. krate) ) ,
@@ -587,6 +644,7 @@ impl<'a> FmtStrs<'a> {
587
644
}
588
645
589
646
pub fn sub_mod_ref_str ( & mut self , span : Span , sub_span : Span , qualname : & str , parent : NodeId ) {
647
+ let parent = self . normalize_node_id ( parent) ;
590
648
self . record_with_span ( ModRef , span, sub_span, svec ! ( 0 , 0 , qualname, parent) ) ;
591
649
}
592
650
@@ -596,6 +654,7 @@ impl<'a> FmtStrs<'a> {
596
654
id : NodeId ,
597
655
qualname : & str ,
598
656
value : & str ) {
657
+ let id = self . normalize_node_id ( id) ;
599
658
self . check_and_record ( Typedef , span, sub_span, svec ! ( id, qualname, value) ) ;
600
659
}
601
660
@@ -621,6 +680,7 @@ impl<'a> FmtStrs<'a> {
621
680
sub_span : Option < Span > ,
622
681
id : DefId ,
623
682
scope_id : NodeId ) {
683
+ let scope_id = self . normalize_node_id ( scope_id) ;
624
684
self . check_and_record ( kind,
625
685
span,
626
686
sub_span,
0 commit comments