Skip to content

Commit 7ac89d2

Browse files
committed
Auto merge of #29040 - nrc:save-defid, r=@nikomatsakis
With this change, normalised node ids correspond to def id indices where they exist, or are made disjoint from def ids otherwise. r? @nikomatsakis
2 parents 1ad1b7d + 06b5a95 commit 7ac89d2

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

src/librustc_trans/save/dump_csv.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ pub struct DumpCsvVisitor<'l, 'tcx: 'l> {
6969
analysis: &'l ty::CrateAnalysis,
7070

7171
span: SpanUtils<'l>,
72-
fmt: FmtStrs<'l>,
72+
fmt: FmtStrs<'l, 'tcx>,
7373

7474
cur_scope: NodeId,
7575
}
@@ -91,7 +91,8 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
9191
out: output_file,
9292
dump_spans: false,
9393
},
94-
span_utils),
94+
span_utils,
95+
tcx),
9596
cur_scope: 0,
9697
}
9798
}

src/librustc_trans/save/recorder.rs

+63-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use super::span_utils::SpanUtils;
1515

1616
use metadata::cstore::LOCAL_CRATE;
1717
use middle::def_id::{CRATE_DEF_INDEX, DefId};
18+
use middle::ty;
1819

1920
use 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

5961
macro_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

Comments
 (0)