@@ -15,6 +15,7 @@ use super::span_utils::SpanUtils;
1515
1616use metadata:: cstore:: LOCAL_CRATE ;
1717use middle:: def_id:: { CRATE_DEF_INDEX , DefId } ;
18+ use middle:: ty;
1819
1920use std:: io:: Write ;
2021
@@ -51,9 +52,10 @@ impl Recorder {
5152 }
5253}
5354
54- pub struct FmtStrs < ' a > {
55+ pub struct FmtStrs < ' a , ' tcx : ' a > {
5556 pub recorder : Box < Recorder > ,
5657 span : SpanUtils < ' a > ,
58+ tcx : & ' a ty:: ctxt < ' tcx > ,
5759}
5860
5961macro_rules! s { ( $e: expr) => { format!( "{}" , $e) } }
@@ -96,11 +98,29 @@ pub enum Row {
9698 FnRef ,
9799}
98100
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 > {
101106 FmtStrs {
102107 recorder : rec,
103108 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 ( )
104124 }
105125 }
106126
@@ -321,6 +341,7 @@ impl<'a> FmtStrs<'a> {
321341 let mut qualname = String :: from ( name) ;
322342 qualname. push_str ( "$" ) ;
323343 qualname. push_str ( & id. to_string ( ) ) ;
344+ let id = self . normalize_node_id ( id) ;
324345 self . check_and_record ( Variable ,
325346 span,
326347 sub_span,
@@ -338,6 +359,7 @@ impl<'a> FmtStrs<'a> {
338359 let mut qualname = String :: from ( fn_name) ;
339360 qualname. push_str ( "::" ) ;
340361 qualname. push_str ( name) ;
362+ let id = self . normalize_node_id ( id) ;
341363 self . check_and_record ( Variable ,
342364 span,
343365 sub_span,
@@ -354,6 +376,8 @@ impl<'a> FmtStrs<'a> {
354376 value : & str ,
355377 typ : & str ,
356378 scope_id : NodeId ) {
379+ let id = self . normalize_node_id ( id) ;
380+ let scope_id = self . normalize_node_id ( scope_id) ;
357381 self . check_and_record ( Variable ,
358382 span,
359383 sub_span,
@@ -368,6 +392,8 @@ impl<'a> FmtStrs<'a> {
368392 qualname : & str ,
369393 typ : & str ,
370394 scope_id : NodeId ) {
395+ let id = self . normalize_node_id ( id) ;
396+ let scope_id = self . normalize_node_id ( scope_id) ;
371397 self . check_and_record ( Variable ,
372398 span,
373399 sub_span,
@@ -381,6 +407,8 @@ impl<'a> FmtStrs<'a> {
381407 name : & str ,
382408 scope_id : NodeId ,
383409 value : & str ) {
410+ let id = self . normalize_node_id ( id) ;
411+ let scope_id = self . normalize_node_id ( scope_id) ;
384412 self . check_and_record ( Enum , span, sub_span, svec ! ( id, name, scope_id, value) ) ;
385413 }
386414
@@ -393,6 +421,8 @@ impl<'a> FmtStrs<'a> {
393421 typ : & str ,
394422 val : & str ,
395423 scope_id : NodeId ) {
424+ let id = self . normalize_node_id ( id) ;
425+ let scope_id = self . normalize_node_id ( scope_id) ;
396426 self . check_and_record ( Variant ,
397427 span,
398428 sub_span,
@@ -408,6 +438,9 @@ impl<'a> FmtStrs<'a> {
408438 typ : & str ,
409439 val : & str ,
410440 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) ;
411444 self . check_and_record ( VariantStruct ,
412445 span,
413446 sub_span,
@@ -420,6 +453,8 @@ impl<'a> FmtStrs<'a> {
420453 id : NodeId ,
421454 name : & str ,
422455 scope_id : NodeId ) {
456+ let id = self . normalize_node_id ( id) ;
457+ let scope_id = self . normalize_node_id ( scope_id) ;
423458 self . check_and_record ( Function ,
424459 span,
425460 sub_span,
@@ -433,6 +468,8 @@ impl<'a> FmtStrs<'a> {
433468 name : & str ,
434469 decl_id : Option < DefId > ,
435470 scope_id : NodeId ) {
471+ let id = self . normalize_node_id ( id) ;
472+ let scope_id = self . normalize_node_id ( scope_id) ;
436473 let values = match decl_id {
437474 Some ( decl_id) => svec ! ( id,
438475 name,
@@ -450,6 +487,8 @@ impl<'a> FmtStrs<'a> {
450487 id : NodeId ,
451488 name : & str ,
452489 scope_id : NodeId ) {
490+ let id = self . normalize_node_id ( id) ;
491+ let scope_id = self . normalize_node_id ( scope_id) ;
453492 self . check_and_record ( MethodDecl , span, sub_span, svec ! ( id, name, scope_id) ) ;
454493 }
455494
@@ -461,6 +500,9 @@ impl<'a> FmtStrs<'a> {
461500 name : & str ,
462501 scope_id : NodeId ,
463502 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) ;
464506 self . check_and_record ( Struct ,
465507 span,
466508 sub_span,
@@ -474,6 +516,8 @@ impl<'a> FmtStrs<'a> {
474516 name : & str ,
475517 scope_id : NodeId ,
476518 value : & str ) {
519+ let id = self . normalize_node_id ( id) ;
520+ let scope_id = self . normalize_node_id ( scope_id) ;
477521 self . check_and_record ( Trait , span, sub_span, svec ! ( id, name, scope_id, value) ) ;
478522 }
479523
@@ -484,6 +528,8 @@ impl<'a> FmtStrs<'a> {
484528 ref_id : Option < DefId > ,
485529 trait_id : Option < DefId > ,
486530 scope_id : NodeId ) {
531+ let id = self . normalize_node_id ( id) ;
532+ let scope_id = self . normalize_node_id ( scope_id) ;
487533 let ref_id = ref_id. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
488534 let trait_id = trait_id. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
489535 self . check_and_record ( Impl ,
@@ -504,6 +550,8 @@ impl<'a> FmtStrs<'a> {
504550 name : & str ,
505551 parent : NodeId ,
506552 filename : & str ) {
553+ let id = self . normalize_node_id ( id) ;
554+ let parent = self . normalize_node_id ( parent) ;
507555 self . check_and_record ( Module ,
508556 span,
509557 sub_span,
@@ -517,6 +565,8 @@ impl<'a> FmtStrs<'a> {
517565 mod_id : Option < DefId > ,
518566 name : & str ,
519567 parent : NodeId ) {
568+ let id = self . normalize_node_id ( id) ;
569+ let parent = self . normalize_node_id ( parent) ;
520570 let mod_id = mod_id. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
521571 self . check_and_record ( UseAlias ,
522572 span,
@@ -530,6 +580,8 @@ impl<'a> FmtStrs<'a> {
530580 id : NodeId ,
531581 values : & str ,
532582 parent : NodeId ) {
583+ let id = self . normalize_node_id ( id) ;
584+ let parent = self . normalize_node_id ( parent) ;
533585 self . check_and_record ( UseGlob , span, sub_span, svec ! ( id, values, parent) ) ;
534586 }
535587
@@ -541,6 +593,8 @@ impl<'a> FmtStrs<'a> {
541593 name : & str ,
542594 loc : & str ,
543595 parent : NodeId ) {
596+ let id = self . normalize_node_id ( id) ;
597+ let parent = self . normalize_node_id ( parent) ;
544598 self . check_and_record ( ExternCrate ,
545599 span,
546600 sub_span,
@@ -552,6 +606,7 @@ impl<'a> FmtStrs<'a> {
552606 sub_span : Option < Span > ,
553607 base_id : DefId ,
554608 deriv_id : NodeId ) {
609+ let deriv_id = self . normalize_node_id ( deriv_id) ;
555610 self . check_and_record ( Inheritance ,
556611 span,
557612 sub_span,
@@ -563,6 +618,7 @@ impl<'a> FmtStrs<'a> {
563618 sub_span : Option < Span > ,
564619 id : DefId ,
565620 scope_id : NodeId ) {
621+ let scope_id = self . normalize_node_id ( scope_id) ;
566622 self . check_and_record ( FnCall ,
567623 span,
568624 sub_span,
@@ -575,6 +631,7 @@ impl<'a> FmtStrs<'a> {
575631 defid : Option < DefId > ,
576632 declid : Option < DefId > ,
577633 scope_id : NodeId ) {
634+ let scope_id = self . normalize_node_id ( scope_id) ;
578635 let defid = defid. unwrap_or ( CRATE_ROOT_DEF_ID ) ;
579636 let ( dcn, dck) = match declid {
580637 Some ( declid) => ( s ! ( declid. index. as_usize( ) ) , s ! ( declid. krate) ) ,
@@ -587,6 +644,7 @@ impl<'a> FmtStrs<'a> {
587644 }
588645
589646 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) ;
590648 self . record_with_span ( ModRef , span, sub_span, svec ! ( 0 , 0 , qualname, parent) ) ;
591649 }
592650
@@ -596,6 +654,7 @@ impl<'a> FmtStrs<'a> {
596654 id : NodeId ,
597655 qualname : & str ,
598656 value : & str ) {
657+ let id = self . normalize_node_id ( id) ;
599658 self . check_and_record ( Typedef , span, sub_span, svec ! ( id, qualname, value) ) ;
600659 }
601660
@@ -621,6 +680,7 @@ impl<'a> FmtStrs<'a> {
621680 sub_span : Option < Span > ,
622681 id : DefId ,
623682 scope_id : NodeId ) {
683+ let scope_id = self . normalize_node_id ( scope_id) ;
624684 self . check_and_record ( kind,
625685 span,
626686 sub_span,
0 commit comments