Skip to content

Commit 5029a60

Browse files
committed
Auto merge of #33568 - nrc:save-json-2, r=pnkfelix
save-analysis: JSON mk2 cc @aochagavia r? @pnkfelix
2 parents 5f6eb14 + 6d6986b commit 5029a60

File tree

8 files changed

+536
-83
lines changed

8 files changed

+536
-83
lines changed

src/librustc_save_analysis/csv_dumper.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ impl<'b, W: Write + 'b> Dump for CsvDumper<'b, W> {
331331
self.record("type_ref", data.span, values);
332332
}
333333

334-
fn typedef(&mut self, data: TypedefData) {
334+
fn typedef(&mut self, data: TypeDefData) {
335335
let id = data.id.index.as_u32().to_string();
336336
let values = make_values_str(&[
337337
("id", &id),

src/librustc_save_analysis/data.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub enum Data {
6262
/// Data for a tuple variant.
6363
TupleVariantData(TupleVariantData),
6464
/// Data for a typedef.
65-
TypeDefData(TypedefData),
65+
TypeDefData(TypeDefData),
6666
/// Data for a reference to a type or trait.
6767
TypeRefData(TypeRefData),
6868
/// Data for a use statement.
@@ -97,6 +97,7 @@ pub struct ExternalCrateData {
9797
#[derive(Clone, Debug, RustcEncodable)]
9898
pub struct EnumData {
9999
pub id: NodeId,
100+
pub name: String,
100101
pub value: String,
101102
pub qualname: String,
102103
pub span: Span,
@@ -131,6 +132,7 @@ pub struct FunctionData {
131132
pub declaration: Option<DefId>,
132133
pub span: Span,
133134
pub scope: NodeId,
135+
pub value: String,
134136
}
135137

136138
/// Data about a function call.
@@ -205,9 +207,11 @@ pub struct MethodCallData {
205207
#[derive(Clone, Debug, RustcEncodable)]
206208
pub struct MethodData {
207209
pub id: NodeId,
210+
pub name: String,
208211
pub qualname: String,
209212
pub span: Span,
210213
pub scope: NodeId,
214+
pub value: String,
211215
}
212216

213217
/// Data for modules.
@@ -233,6 +237,7 @@ pub struct ModRefData {
233237
#[derive(Debug, RustcEncodable)]
234238
pub struct StructData {
235239
pub span: Span,
240+
pub name: String,
236241
pub id: NodeId,
237242
pub ctor_id: NodeId,
238243
pub qualname: String,
@@ -243,6 +248,7 @@ pub struct StructData {
243248
#[derive(Debug, RustcEncodable)]
244249
pub struct StructVariantData {
245250
pub span: Span,
251+
pub name: String,
246252
pub id: NodeId,
247253
pub qualname: String,
248254
pub type_value: String,
@@ -254,6 +260,7 @@ pub struct StructVariantData {
254260
pub struct TraitData {
255261
pub span: Span,
256262
pub id: NodeId,
263+
pub name: String,
257264
pub qualname: String,
258265
pub scope: NodeId,
259266
pub value: String
@@ -272,8 +279,9 @@ pub struct TupleVariantData {
272279

273280
/// Data for a typedef.
274281
#[derive(Debug, RustcEncodable)]
275-
pub struct TypedefData {
282+
pub struct TypeDefData {
276283
pub id: NodeId,
284+
pub name: String,
277285
pub span: Span,
278286
pub qualname: String,
279287
pub value: String,

src/librustc_save_analysis/dump.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub trait Dump {
3030
fn trait_data(&mut self, TraitData) {}
3131
fn tuple_variant(&mut self, TupleVariantData) {}
3232
fn type_ref(&mut self, TypeRefData) {}
33-
fn typedef(&mut self, TypedefData) {}
33+
fn typedef(&mut self, TypeDefData) {}
3434
fn use_data(&mut self, UseData) {}
3535
fn use_glob(&mut self, UseGlobData) {}
3636
fn variable(&mut self, VariableData) {}

src/librustc_save_analysis/dump_visitor.rs

+71-21
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use syntax::ast::{self, NodeId, PatKind};
3939
use syntax::codemap::*;
4040
use syntax::parse::token::{self, keywords};
4141
use syntax::visit::{self, Visitor};
42-
use syntax::print::pprust::{path_to_string, ty_to_string};
42+
use syntax::print::pprust::{path_to_string, ty_to_string, bounds_to_string, generics_to_string};
4343
use syntax::ptr::P;
4444

4545
use super::{escape, generated_code, SaveContext, PathCollector};
@@ -388,18 +388,23 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
388388

389389
if let Some(method_data) = self.save_ctxt.get_method_data(id, name, span) {
390390

391+
let sig_str = ::make_signature(&sig.decl, &sig.generics);
391392
if body.is_some() {
392393
if !self.span.filter_generated(Some(method_data.span), span) {
393-
self.dumper.function(method_data.clone().lower(self.tcx));
394+
let mut data = method_data.clone();
395+
data.value = sig_str;
396+
self.dumper.function(data.lower(self.tcx));
394397
}
395398
self.process_formals(&sig.decl.inputs, &method_data.qualname);
396399
} else {
397400
if !self.span.filter_generated(Some(method_data.span), span) {
398401
self.dumper.method(MethodData {
399402
id: method_data.id,
403+
name: method_data.name,
400404
span: method_data.span,
401405
scope: method_data.scope,
402406
qualname: method_data.qualname.clone(),
407+
value: sig_str,
403408
}.lower(self.tcx));
404409
}
405410
}
@@ -455,16 +460,18 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
455460
let param_sub_spans = self.span.spans_for_ty_params(full_span,
456461
(generics.ty_params.len() as isize));
457462
for (param, param_ss) in generics.ty_params.iter().zip(param_sub_spans) {
463+
let name = escape(self.span.snippet(param_ss));
458464
// Append $id to name to make sure each one is unique
459-
let name = format!("{}::{}${}",
460-
prefix,
461-
escape(self.span.snippet(param_ss)),
462-
id);
465+
let qualname = format!("{}::{}${}",
466+
prefix,
467+
name,
468+
id);
463469
if !self.span.filter_generated(Some(param_ss), full_span) {
464-
self.dumper.typedef(TypedefData {
470+
self.dumper.typedef(TypeDefData {
465471
span: param_ss,
472+
name: name,
466473
id: param.id,
467-
qualname: name,
474+
qualname: qualname,
468475
value: String::new()
469476
}.lower(self.tcx));
470477
}
@@ -536,18 +543,33 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
536543
self.visit_expr(expr);
537544
}
538545

546+
// FIXME tuple structs should generate tuple-specific data.
539547
fn process_struct(&mut self,
540548
item: &ast::Item,
541549
def: &ast::VariantData,
542550
ty_params: &ast::Generics) {
551+
let name = item.ident.to_string();
543552
let qualname = format!("::{}", self.tcx.node_path_str(item.id));
544553

545-
let val = self.span.snippet(item.span);
546554
let sub_span = self.span.sub_span_after_keyword(item.span, keywords::Struct);
555+
let val = if let ast::ItemKind::Struct(ast::VariantData::Struct(ref fields, _), _) =
556+
item.node {
557+
let fields_str = fields.iter()
558+
.enumerate()
559+
.map(|(i, f)| f.ident.map(|i| i.to_string())
560+
.unwrap_or(i.to_string()))
561+
.collect::<Vec<_>>()
562+
.join(", ");
563+
format!("{} {{ {} }}", name, fields_str)
564+
} else {
565+
String::new()
566+
};
567+
547568
if !self.span.filter_generated(sub_span, item.span) {
548569
self.dumper.struct_data(StructData {
549570
span: sub_span.expect("No span found for struct"),
550571
id: item.id,
572+
name: name,
551573
ctor_id: def.id(),
552574
qualname: qualname.clone(),
553575
scope: self.cur_scope,
@@ -580,33 +602,49 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
580602
}
581603

582604
for variant in &enum_definition.variants {
583-
let name = &variant.node.name.name.as_str();
605+
let name = variant.node.name.name.to_string();
584606
let mut qualname = enum_data.qualname.clone();
585607
qualname.push_str("::");
586-
qualname.push_str(name);
587-
let val = self.span.snippet(variant.span);
608+
qualname.push_str(&name);
588609

589610
match variant.node.data {
590-
ast::VariantData::Struct(..) => {
611+
ast::VariantData::Struct(ref fields, _) => {
591612
let sub_span = self.span.span_for_first_ident(variant.span);
613+
let fields_str = fields.iter()
614+
.enumerate()
615+
.map(|(i, f)| f.ident.map(|i| i.to_string())
616+
.unwrap_or(i.to_string()))
617+
.collect::<Vec<_>>()
618+
.join(", ");
619+
let val = format!("{}::{} {{ {} }}", enum_data.name, name, fields_str);
592620
if !self.span.filter_generated(sub_span, variant.span) {
593621
self.dumper.struct_variant(StructVariantData {
594622
span: sub_span.expect("No span found for struct variant"),
595623
id: variant.node.data.id(),
624+
name: name,
596625
qualname: qualname,
597626
type_value: enum_data.qualname.clone(),
598627
value: val,
599628
scope: enum_data.scope
600629
}.lower(self.tcx));
601630
}
602631
}
603-
_ => {
632+
ref v => {
604633
let sub_span = self.span.span_for_first_ident(variant.span);
634+
let mut val = format!("{}::{}", enum_data.name, name);
635+
if let &ast::VariantData::Tuple(ref fields, _) = v {
636+
val.push('(');
637+
val.push_str(&fields.iter()
638+
.map(|f| ty_to_string(&f.ty))
639+
.collect::<Vec<_>>()
640+
.join(", "));
641+
val.push(')');
642+
}
605643
if !self.span.filter_generated(sub_span, variant.span) {
606644
self.dumper.tuple_variant(TupleVariantData {
607645
span: sub_span.expect("No span found for tuple variant"),
608646
id: variant.node.data.id(),
609-
name: name.to_string(),
647+
name: name,
610648
qualname: qualname,
611649
type_value: enum_data.qualname.clone(),
612650
value: val,
@@ -672,13 +710,22 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
672710
generics: &ast::Generics,
673711
trait_refs: &ast::TyParamBounds,
674712
methods: &[ast::TraitItem]) {
713+
let name = item.ident.to_string();
675714
let qualname = format!("::{}", self.tcx.node_path_str(item.id));
676-
let val = self.span.snippet(item.span);
715+
let mut val = name.clone();
716+
if !generics.lifetimes.is_empty() || !generics.ty_params.is_empty() {
717+
val.push_str(&generics_to_string(generics));
718+
}
719+
if !trait_refs.is_empty() {
720+
val.push_str(": ");
721+
val.push_str(&bounds_to_string(trait_refs));
722+
}
677723
let sub_span = self.span.sub_span_after_keyword(item.span, keywords::Trait);
678724
if !self.span.filter_generated(sub_span, item.span) {
679725
self.dumper.trait_data(TraitData {
680726
span: sub_span.expect("No span found for trait"),
681727
id: item.id,
728+
name: name,
682729
qualname: qualname.clone(),
683730
scope: self.cur_scope,
684731
value: val
@@ -908,13 +955,15 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
908955
self.visit_pat(&p);
909956

910957
for &(id, ref p, immut, _) in &collector.collected_paths {
911-
let value = if immut == ast::Mutability::Immutable {
958+
let mut value = if immut == ast::Mutability::Immutable {
912959
value.to_string()
913960
} else {
914961
"<mutable>".to_string()
915962
};
916963
let types = self.tcx.node_types();
917964
let typ = types.get(&id).map(|t| t.to_string()).unwrap_or(String::new());
965+
value.push_str(": ");
966+
value.push_str(&typ);
918967
// Get the span only for the name of the variable (I hope the path
919968
// is only ever a variable name, but who knows?).
920969
let sub_span = self.span.span_for_last_ident(p.span);
@@ -1107,8 +1156,9 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
11071156
let value = ty_to_string(&ty);
11081157
let sub_span = self.span.sub_span_after_keyword(item.span, keywords::Type);
11091158
if !self.span.filter_generated(sub_span, item.span) {
1110-
self.dumper.typedef(TypedefData {
1159+
self.dumper.typedef(TypeDefData {
11111160
span: sub_span.expect("No span found for typedef"),
1161+
name: item.ident.to_string(),
11121162
id: item.id,
11131163
qualname: qualname.clone(),
11141164
value: value
@@ -1275,13 +1325,13 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
12751325
}
12761326
ast::ExprKind::ForLoop(ref pattern, ref subexpression, ref block, _) |
12771327
ast::ExprKind::WhileLet(ref pattern, ref subexpression, ref block, _) => {
1278-
let value = self.span.snippet(mk_sp(ex.span.lo, subexpression.span.hi));
1328+
let value = self.span.snippet(subexpression.span);
12791329
self.process_var_decl(pattern, value);
12801330
visit::walk_expr(self, subexpression);
12811331
visit::walk_block(self, block);
12821332
}
12831333
ast::ExprKind::IfLet(ref pattern, ref subexpression, ref block, ref opt_else) => {
1284-
let value = self.span.snippet(mk_sp(ex.span.lo, subexpression.span.hi));
1334+
let value = self.span.snippet(subexpression.span);
12851335
self.process_var_decl(pattern, value);
12861336
visit::walk_expr(self, subexpression);
12871337
visit::walk_block(self, block);
@@ -1371,7 +1421,7 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
13711421

13721422
fn visit_local(&mut self, l: &ast::Local) {
13731423
self.process_macro_use(l.span, l.id);
1374-
let value = self.span.snippet(l.span);
1424+
let value = l.init.as_ref().map(|i| self.span.snippet(i.span)).unwrap_or(String::new());
13751425
self.process_var_decl(&l.pat, value);
13761426

13771427
// Just walk the initialiser and type (don't want to walk the pattern again).

0 commit comments

Comments
 (0)