Skip to content

Commit af60d4c

Browse files
committed
Rollup merge of rust-lang#33370 - aochagavia:dump, r=nrc
save-analysis: use a decoupled representation for dumped data Closes rust-lang#33348 This will probably break any tool relying on the csv backend of save_analysis, for the following reasons: 1. Dumped spans don't contain extents anymore (`Dump` uses `SpanData` now instead of internal `Span`s). In case we still want to dump extents we could add them to `SpanData`. 1. `DefId`s are no longer dumped as a pair of `(ref_id, ref_crate)`. Instead, they are dumped as a single `Id`. @nrc You said something about storing the id in a `u64`, but you didn't explain why. I kept using `u32` in this branch but I can change it if you prefer that. r? @nrc By the way, the fact that this breaks tools relying on CSV may be a good occasion to start dumping CSV in a different way (i.e. using the serializer like in the JSON backend).
2 parents 383897d + 192e336 commit af60d4c

File tree

8 files changed

+746
-810
lines changed

8 files changed

+746
-810
lines changed

src/librustc_save_analysis/csv_dumper.rs

Lines changed: 51 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,20 @@
1010

1111
use std::io::Write;
1212

13-
use rustc::hir::def_id::{DefId, DefIndex};
14-
use syntax::codemap::Span;
15-
16-
use super::data::*;
13+
use super::external_data::*;
1714
use super::dump::Dump;
18-
use super::span_utils::SpanUtils;
1915

20-
pub struct CsvDumper<'tcx, 'b, W: 'b> {
21-
output: &'b mut W,
22-
span: SpanUtils<'tcx>
16+
pub struct CsvDumper<'b, W: 'b> {
17+
output: &'b mut W
2318
}
2419

25-
impl<'a, 'b, W: Write> CsvDumper<'a, 'b, W> {
26-
pub fn new(writer: &'b mut W, span: SpanUtils<'a>) -> CsvDumper<'a, 'b, W> {
27-
CsvDumper { output: writer, span: span }
20+
impl<'b, W: Write> CsvDumper<'b, W> {
21+
pub fn new(writer: &'b mut W) -> CsvDumper<'b, W> {
22+
CsvDumper { output: writer }
2823
}
2924

30-
fn record(&mut self, kind: &str, span: Span, values: String) {
31-
let span_str = self.span.extent_str(span);
25+
fn record(&mut self, kind: &str, span: SpanData, values: String) {
26+
let span_str = span_extent_str(span);
3227
if let Err(_) = write!(self.output, "{},{}{}\n", kind, span_str, values) {
3328
error!("Error writing output");
3429
}
@@ -41,7 +36,7 @@ impl<'a, 'b, W: Write> CsvDumper<'a, 'b, W> {
4136
}
4237
}
4338

44-
impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
39+
impl<'b, W: Write + 'b> Dump for CsvDumper<'b, W> {
4540
fn crate_prelude(&mut self, data: CratePreludeData) {
4641
let values = make_values_str(&[
4742
("name", &data.crate_name),
@@ -65,8 +60,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
6560
}
6661

6762
fn enum_data(&mut self, data: EnumData) {
68-
let id = data.id.to_string();
69-
let scope = data.scope.to_string();
63+
let id = data.id.index.as_u32().to_string();
64+
let scope = data.scope.index.as_u32().to_string();
7065
let values = make_values_str(&[
7166
("id", &id),
7267
("qualname", &data.qualname),
@@ -78,9 +73,9 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
7873
}
7974

8075
fn extern_crate(&mut self, data: ExternCrateData) {
81-
let id = data.id.to_string();
76+
let id = data.id.index.as_u32().to_string();
8277
let crate_num = data.crate_num.to_string();
83-
let scope = data.scope.to_string();
78+
let scope = data.scope.index.as_u32().to_string();
8479
let values = make_values_str(&[
8580
("id", &id),
8681
("name", &data.name),
@@ -96,12 +91,12 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
9691
let self_ref = data.self_ref.unwrap_or(null_def_id());
9792
let trait_ref = data.trait_ref.unwrap_or(null_def_id());
9893

99-
let id = data.id.to_string();
94+
let id = data.id.index.as_u32().to_string();
10095
let ref_id = self_ref.index.as_usize().to_string();
10196
let ref_id_crate = self_ref.krate.to_string();
10297
let trait_id = trait_ref.index.as_usize().to_string();
10398
let trait_id_crate = trait_ref.krate.to_string();
104-
let scope = data.scope.to_string();
99+
let scope = data.scope.index.as_u32().to_string();
105100
let values = make_values_str(&[
106101
("id", &id),
107102
("refid", &ref_id),
@@ -117,8 +112,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
117112
fn inheritance(&mut self, data: InheritanceData) {
118113
let base_id = data.base_id.index.as_usize().to_string();
119114
let base_crate = data.base_id.krate.to_string();
120-
let deriv_id = data.deriv_id.to_string();
121-
let deriv_crate = 0.to_string();
115+
let deriv_id = data.deriv_id.index.as_u32().to_string();
116+
let deriv_crate = data.deriv_id.krate.to_string();
122117
let values = make_values_str(&[
123118
("base", &base_id),
124119
("basecrate", &base_crate),
@@ -135,8 +130,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
135130
None => (String::new(), String::new())
136131
};
137132

138-
let id = data.id.to_string();
139-
let scope = data.scope.to_string();
133+
let id = data.id.index.as_u32().to_string();
134+
let scope = data.scope.index.as_u32().to_string();
140135
let values = make_values_str(&[
141136
("id", &id),
142137
("qualname", &data.qualname),
@@ -151,7 +146,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
151146
fn function_ref(&mut self, data: FunctionRefData) {
152147
let ref_id = data.ref_id.index.as_usize().to_string();
153148
let ref_crate = data.ref_id.krate.to_string();
154-
let scope = data.scope.to_string();
149+
let scope = data.scope.index.as_u32().to_string();
155150
let values = make_values_str(&[
156151
("refid", &ref_id),
157152
("refidcrate", &ref_crate),
@@ -166,7 +161,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
166161
let ref_id = data.ref_id.index.as_usize().to_string();
167162
let ref_crate = data.ref_id.krate.to_string();
168163
let qualname = String::new();
169-
let scope = data.scope.to_string();
164+
let scope = data.scope.index.as_u32().to_string();
170165
let values = make_values_str(&[
171166
("refid", &ref_id),
172167
("refidcrate", &ref_crate),
@@ -178,8 +173,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
178173
}
179174

180175
fn method(&mut self, data: MethodData) {
181-
let id = data.id.to_string();
182-
let scope = data.scope.to_string();
176+
let id = data.id.index.as_u32().to_string();
177+
let scope = data.scope.index.as_u32().to_string();
183178
let values = make_values_str(&[
184179
("id", &id),
185180
("qualname", &data.qualname),
@@ -199,7 +194,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
199194

200195
let def_id = ref_id.index.as_usize().to_string();
201196
let def_crate = ref_id.krate.to_string();
202-
let scope = data.scope.to_string();
197+
let scope = data.scope.index.as_u32().to_string();
203198
let values = make_values_str(&[
204199
("refid", &def_id),
205200
("refidcrate", &def_crate),
@@ -221,7 +216,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
221216
}
222217

223218
fn macro_use(&mut self, data: MacroUseData) {
224-
let scope = data.scope.to_string();
219+
let scope = data.scope.index.as_u32().to_string();
225220
let values = make_values_str(&[
226221
("callee_name", &data.name),
227222
("qualname", &data.qualname),
@@ -232,8 +227,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
232227
}
233228

234229
fn mod_data(&mut self, data: ModData) {
235-
let id = data.id.to_string();
236-
let scope = data.scope.to_string();
230+
let id = data.id.index.as_u32().to_string();
231+
let scope = data.scope.index.as_u32().to_string();
237232
let values = make_values_str(&[
238233
("id", &id),
239234
("qualname", &data.qualname),
@@ -250,7 +245,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
250245
None => (0.to_string(), 0.to_string())
251246
};
252247

253-
let scope = data.scope.to_string();
248+
let scope = data.scope.index.as_u32().to_string();
254249
let values = make_values_str(&[
255250
("refid", &ref_id),
256251
("refidcrate", &ref_crate),
@@ -262,9 +257,9 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
262257
}
263258

264259
fn struct_data(&mut self, data: StructData) {
265-
let id = data.id.to_string();
266-
let ctor_id = data.ctor_id.to_string();
267-
let scope = data.scope.to_string();
260+
let id = data.id.index.as_u32().to_string();
261+
let ctor_id = data.ctor_id.index.as_u32().to_string();
262+
let scope = data.scope.index.as_u32().to_string();
268263
let values = make_values_str(&[
269264
("id", &id),
270265
("ctor_id", &ctor_id),
@@ -277,8 +272,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
277272
}
278273

279274
fn struct_variant(&mut self, data: StructVariantData) {
280-
let id = data.id.to_string();
281-
let scope = data.scope.to_string();
275+
let id = data.id.index.as_u32().to_string();
276+
let scope = data.scope.index.as_u32().to_string();
282277
let values = make_values_str(&[
283278
("id", &id),
284279
("ctor_id", &id),
@@ -292,8 +287,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
292287
}
293288

294289
fn trait_data(&mut self, data: TraitData) {
295-
let id = data.id.to_string();
296-
let scope = data.scope.to_string();
290+
let id = data.id.index.as_u32().to_string();
291+
let scope = data.scope.index.as_u32().to_string();
297292
let values = make_values_str(&[
298293
("id", &id),
299294
("qualname", &data.qualname),
@@ -305,8 +300,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
305300
}
306301

307302
fn tuple_variant(&mut self, data: TupleVariantData) {
308-
let id = data.id.to_string();
309-
let scope = data.scope.to_string();
303+
let id = data.id.index.as_u32().to_string();
304+
let scope = data.scope.index.as_u32().to_string();
310305
let values = make_values_str(&[
311306
("id", &id),
312307
("name", &data.name),
@@ -325,7 +320,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
325320
None => (0.to_string(), 0.to_string())
326321
};
327322

328-
let scope = data.scope.to_string();
323+
let scope = data.scope.index.as_u32().to_string();
329324
let values = make_values_str(&[
330325
("refid", &ref_id),
331326
("refidcrate", &ref_crate),
@@ -337,7 +332,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
337332
}
338333

339334
fn typedef(&mut self, data: TypedefData) {
340-
let id = data.id.to_string();
335+
let id = data.id.index.as_u32().to_string();
341336
let values = make_values_str(&[
342337
("id", &id),
343338
("qualname", &data.qualname),
@@ -350,10 +345,10 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
350345
fn use_data(&mut self, data: UseData) {
351346
let mod_id = data.mod_id.unwrap_or(null_def_id());
352347

353-
let id = data.id.to_string();
348+
let id = data.id.index.as_u32().to_string();
354349
let ref_id = mod_id.index.as_usize().to_string();
355350
let ref_crate = mod_id.krate.to_string();
356-
let scope = data.scope.to_string();
351+
let scope = data.scope.index.as_u32().to_string();
357352
let values = make_values_str(&[
358353
("id", &id),
359354
("refid", &ref_id),
@@ -368,8 +363,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
368363
fn use_glob(&mut self, data: UseGlobData) {
369364
let names = data.names.join(", ");
370365

371-
let id = data.id.to_string();
372-
let scope = data.scope.to_string();
366+
let id = data.id.index.as_u32().to_string();
367+
let scope = data.scope.index.as_u32().to_string();
373368
let values = make_values_str(&[
374369
("id", &id),
375370
("value", &names),
@@ -380,8 +375,8 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
380375
}
381376

382377
fn variable(&mut self, data: VariableData) {
383-
let id = data.id.to_string();
384-
let scope = data.scope.to_string();
378+
let id = data.id.index.as_u32().to_string();
379+
let scope = data.scope.index.as_u32().to_string();
385380
let values = make_values_str(&[
386381
("id", &id),
387382
("name", &data.name),
@@ -397,7 +392,7 @@ impl<'a, 'b, W: Write + 'b> Dump for CsvDumper<'a, 'b, W> {
397392
fn variable_ref(&mut self, data: VariableRefData) {
398393
let ref_id = data.ref_id.index.as_usize().to_string();
399394
let ref_crate = data.ref_id.krate.to_string();
400-
let scope = data.scope.to_string();
395+
let scope = data.scope.index.as_u32().to_string();
401396
let values = make_values_str(&[
402397
("refid", &ref_id),
403398
("refidcrate", &ref_crate),
@@ -431,9 +426,9 @@ fn make_values_str(pairs: &[(&'static str, &str)]) -> String {
431426
})
432427
}
433428

434-
fn null_def_id() -> DefId {
435-
DefId {
436-
krate: 0,
437-
index: DefIndex::new(0),
438-
}
429+
fn span_extent_str(span: SpanData) -> String {
430+
format!("file_name,\"{}\",file_line,{},file_col,{},byte_start,{}\
431+
file_line_end,{},file_col_end,{},byte_end,{}",
432+
span.file_name, span.line_start, span.column_start, span.byte_start,
433+
span.line_end, span.column_end, span.byte_end)
439434
}

src/librustc_save_analysis/data.rs

Lines changed: 1 addition & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,8 @@
1414
//! retrieve the data from a crate.
1515
1616
use rustc::hir::def_id::DefId;
17-
use rustc::ty;
1817
use syntax::ast::{CrateNum, NodeId};
19-
use syntax::codemap::{Span, CodeMap};
20-
21-
#[derive(Debug, Clone, RustcEncodable)]
22-
pub struct SpanData {
23-
file_name: String,
24-
byte_start: u32,
25-
byte_end: u32,
26-
/// 1-based.
27-
line_start: usize,
28-
line_end: usize,
29-
/// 1-based, character offset.
30-
column_start: usize,
31-
column_end: usize,
32-
}
33-
34-
impl SpanData {
35-
pub fn from_span(span: Span, cm: &CodeMap) -> SpanData {
36-
let start = cm.lookup_char_pos(span.lo);
37-
let end = cm.lookup_char_pos(span.hi);
38-
39-
SpanData {
40-
file_name: start.file.name.clone(),
41-
byte_start: span.lo.0,
42-
byte_end: span.hi.0,
43-
line_start: start.line,
44-
line_end: end.line,
45-
column_start: start.col.0 + 1,
46-
column_end: end.col.0 + 1,
47-
}
48-
}
49-
}
18+
use syntax::codemap::Span;
5019

5120
pub struct CrateData {
5221
pub name: String,
@@ -357,58 +326,3 @@ pub struct VariableRefData {
357326
pub scope: NodeId,
358327
pub ref_id: DefId,
359328
}
360-
361-
// Emitted ids are used to cross-reference items across crates. DefIds and
362-
// NodeIds do not usually correspond in any way. The strategy is to use the
363-
// index from the DefId as a crate-local id. However, within a crate, DefId
364-
// indices and NodeIds can overlap. So, we must adjust the NodeIds. If an
365-
// item can be identified by a DefId as well as a NodeId, then we use the
366-
// DefId index as the id. If it can't, then we have to use the NodeId, but
367-
// need to adjust it so it will not clash with any possible DefId index.
368-
pub fn normalize_node_id<'a>(tcx: &ty::TyCtxt<'a>, id: NodeId) -> usize {
369-
match tcx.map.opt_local_def_id(id) {
370-
Some(id) => id.index.as_usize(),
371-
None => id as usize + tcx.map.num_local_def_ids()
372-
}
373-
}
374-
375-
// Macro to implement a normalize() function (see below for usage)
376-
macro_rules! impl_normalize {
377-
($($t:ty => $($field:ident),*);*) => {
378-
$(
379-
impl $t {
380-
pub fn normalize<'a>(mut self, tcx: &ty::TyCtxt<'a>) -> $t {
381-
$(
382-
self.$field = normalize_node_id(tcx, self.$field) as u32;
383-
)*
384-
self
385-
}
386-
}
387-
)*
388-
}
389-
}
390-
391-
impl_normalize! {
392-
EnumData => id, scope;
393-
ExternCrateData => id, scope;
394-
FunctionCallData => scope;
395-
FunctionData => id, scope;
396-
FunctionRefData => scope;
397-
ImplData => id, scope;
398-
InheritanceData => deriv_id;
399-
MacroUseData => scope;
400-
MethodCallData => scope;
401-
MethodData => id, scope;
402-
ModData => id, scope;
403-
ModRefData => scope;
404-
StructData => ctor_id, id, scope;
405-
StructVariantData => id, scope;
406-
TupleVariantData => id, scope;
407-
TraitData => id, scope;
408-
TypedefData => id;
409-
TypeRefData => scope;
410-
UseData => id, scope;
411-
UseGlobData => id, scope;
412-
VariableData => id;
413-
VariableRefData => scope
414-
}

0 commit comments

Comments
 (0)