@@ -39,7 +39,7 @@ use syntax::ast::{self, NodeId, PatKind};
39
39
use syntax:: codemap:: * ;
40
40
use syntax:: parse:: token:: { self , keywords} ;
41
41
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 } ;
43
43
use syntax:: ptr:: P ;
44
44
45
45
use super :: { escape, generated_code, SaveContext , PathCollector } ;
@@ -388,18 +388,23 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
388
388
389
389
if let Some ( method_data) = self . save_ctxt . get_method_data ( id, name, span) {
390
390
391
+ let sig_str = :: make_signature ( & sig. decl , & sig. generics ) ;
391
392
if body. is_some ( ) {
392
393
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 ) ) ;
394
397
}
395
398
self . process_formals ( & sig. decl . inputs , & method_data. qualname ) ;
396
399
} else {
397
400
if !self . span . filter_generated ( Some ( method_data. span ) , span) {
398
401
self . dumper . method ( MethodData {
399
402
id : method_data. id ,
403
+ name : method_data. name ,
400
404
span : method_data. span ,
401
405
scope : method_data. scope ,
402
406
qualname : method_data. qualname . clone ( ) ,
407
+ value : sig_str,
403
408
} . lower ( self . tcx ) ) ;
404
409
}
405
410
}
@@ -455,16 +460,18 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
455
460
let param_sub_spans = self . span . spans_for_ty_params ( full_span,
456
461
( generics. ty_params . len ( ) as isize ) ) ;
457
462
for ( param, param_ss) in generics. ty_params . iter ( ) . zip ( param_sub_spans) {
463
+ let name = escape ( self . span . snippet ( param_ss) ) ;
458
464
// 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) ;
463
469
if !self . span . filter_generated ( Some ( param_ss) , full_span) {
464
- self . dumper . typedef ( TypedefData {
470
+ self . dumper . typedef ( TypeDefData {
465
471
span : param_ss,
472
+ name : name,
466
473
id : param. id ,
467
- qualname : name ,
474
+ qualname : qualname ,
468
475
value : String :: new ( )
469
476
} . lower ( self . tcx ) ) ;
470
477
}
@@ -536,18 +543,33 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
536
543
self . visit_expr ( expr) ;
537
544
}
538
545
546
+ // FIXME tuple structs should generate tuple-specific data.
539
547
fn process_struct ( & mut self ,
540
548
item : & ast:: Item ,
541
549
def : & ast:: VariantData ,
542
550
ty_params : & ast:: Generics ) {
551
+ let name = item. ident . to_string ( ) ;
543
552
let qualname = format ! ( "::{}" , self . tcx. node_path_str( item. id) ) ;
544
553
545
- let val = self . span . snippet ( item. span ) ;
546
554
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
+
547
568
if !self . span . filter_generated ( sub_span, item. span ) {
548
569
self . dumper . struct_data ( StructData {
549
570
span : sub_span. expect ( "No span found for struct" ) ,
550
571
id : item. id ,
572
+ name : name,
551
573
ctor_id : def. id ( ) ,
552
574
qualname : qualname. clone ( ) ,
553
575
scope : self . cur_scope ,
@@ -580,33 +602,49 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
580
602
}
581
603
582
604
for variant in & enum_definition. variants {
583
- let name = & variant. node . name . name . as_str ( ) ;
605
+ let name = variant. node . name . name . to_string ( ) ;
584
606
let mut qualname = enum_data. qualname . clone ( ) ;
585
607
qualname. push_str ( "::" ) ;
586
- qualname. push_str ( name) ;
587
- let val = self . span . snippet ( variant. span ) ;
608
+ qualname. push_str ( & name) ;
588
609
589
610
match variant. node . data {
590
- ast:: VariantData :: Struct ( .. ) => {
611
+ ast:: VariantData :: Struct ( ref fields , _ ) => {
591
612
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) ;
592
620
if !self . span . filter_generated ( sub_span, variant. span ) {
593
621
self . dumper . struct_variant ( StructVariantData {
594
622
span : sub_span. expect ( "No span found for struct variant" ) ,
595
623
id : variant. node . data . id ( ) ,
624
+ name : name,
596
625
qualname : qualname,
597
626
type_value : enum_data. qualname . clone ( ) ,
598
627
value : val,
599
628
scope : enum_data. scope
600
629
} . lower ( self . tcx ) ) ;
601
630
}
602
631
}
603
- _ => {
632
+ ref v => {
604
633
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
+ }
605
643
if !self . span . filter_generated ( sub_span, variant. span ) {
606
644
self . dumper . tuple_variant ( TupleVariantData {
607
645
span : sub_span. expect ( "No span found for tuple variant" ) ,
608
646
id : variant. node . data . id ( ) ,
609
- name : name. to_string ( ) ,
647
+ name : name,
610
648
qualname : qualname,
611
649
type_value : enum_data. qualname . clone ( ) ,
612
650
value : val,
@@ -672,13 +710,22 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
672
710
generics : & ast:: Generics ,
673
711
trait_refs : & ast:: TyParamBounds ,
674
712
methods : & [ ast:: TraitItem ] ) {
713
+ let name = item. ident . to_string ( ) ;
675
714
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
+ }
677
723
let sub_span = self . span . sub_span_after_keyword ( item. span , keywords:: Trait ) ;
678
724
if !self . span . filter_generated ( sub_span, item. span ) {
679
725
self . dumper . trait_data ( TraitData {
680
726
span : sub_span. expect ( "No span found for trait" ) ,
681
727
id : item. id ,
728
+ name : name,
682
729
qualname : qualname. clone ( ) ,
683
730
scope : self . cur_scope ,
684
731
value : val
@@ -908,13 +955,15 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
908
955
self . visit_pat ( & p) ;
909
956
910
957
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 {
912
959
value. to_string ( )
913
960
} else {
914
961
"<mutable>" . to_string ( )
915
962
} ;
916
963
let types = self . tcx . node_types ( ) ;
917
964
let typ = types. get ( & id) . map ( |t| t. to_string ( ) ) . unwrap_or ( String :: new ( ) ) ;
965
+ value. push_str ( ": " ) ;
966
+ value. push_str ( & typ) ;
918
967
// Get the span only for the name of the variable (I hope the path
919
968
// is only ever a variable name, but who knows?).
920
969
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,
1107
1156
let value = ty_to_string ( & ty) ;
1108
1157
let sub_span = self . span . sub_span_after_keyword ( item. span , keywords:: Type ) ;
1109
1158
if !self . span . filter_generated ( sub_span, item. span ) {
1110
- self . dumper . typedef ( TypedefData {
1159
+ self . dumper . typedef ( TypeDefData {
1111
1160
span : sub_span. expect ( "No span found for typedef" ) ,
1161
+ name : item. ident . to_string ( ) ,
1112
1162
id : item. id ,
1113
1163
qualname : qualname. clone ( ) ,
1114
1164
value : value
@@ -1275,13 +1325,13 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
1275
1325
}
1276
1326
ast:: ExprKind :: ForLoop ( ref pattern, ref subexpression, ref block, _) |
1277
1327
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 ) ;
1279
1329
self . process_var_decl ( pattern, value) ;
1280
1330
visit:: walk_expr ( self , subexpression) ;
1281
1331
visit:: walk_block ( self , block) ;
1282
1332
}
1283
1333
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 ) ;
1285
1335
self . process_var_decl ( pattern, value) ;
1286
1336
visit:: walk_expr ( self , subexpression) ;
1287
1337
visit:: walk_block ( self , block) ;
@@ -1371,7 +1421,7 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
1371
1421
1372
1422
fn visit_local ( & mut self , l : & ast:: Local ) {
1373
1423
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 ( ) ) ;
1375
1425
self . process_var_decl ( & l. pat , value) ;
1376
1426
1377
1427
// Just walk the initialiser and type (don't want to walk the pattern again).
0 commit comments