@@ -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,9 +388,12 @@ 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 {
@@ -401,7 +404,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
401
404
span : method_data. span ,
402
405
scope : method_data. scope ,
403
406
qualname : method_data. qualname . clone ( ) ,
404
- value : String :: new ( ) , // TODO
407
+ value : sig_str ,
405
408
} . lower ( self . tcx ) ) ;
406
409
}
407
410
}
@@ -540,19 +543,33 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
540
543
self . visit_expr ( expr) ;
541
544
}
542
545
546
+ // FIXME tuple structs should generate tuple-specific data.
543
547
fn process_struct ( & mut self ,
544
548
item : & ast:: Item ,
545
549
def : & ast:: VariantData ,
546
550
ty_params : & ast:: Generics ) {
551
+ let name = item. ident . to_string ( ) ;
547
552
let qualname = format ! ( "::{}" , self . tcx. node_path_str( item. id) ) ;
548
553
549
- let val = self . span . snippet ( item. span ) ;
550
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
+
551
568
if !self . span . filter_generated ( sub_span, item. span ) {
552
569
self . dumper . struct_data ( StructData {
553
570
span : sub_span. expect ( "No span found for struct" ) ,
554
571
id : item. id ,
555
- name : item . ident . to_string ( ) ,
572
+ name : name ,
556
573
ctor_id : def. id ( ) ,
557
574
qualname : qualname. clone ( ) ,
558
575
scope : self . cur_scope ,
@@ -589,11 +606,17 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
589
606
let mut qualname = enum_data. qualname . clone ( ) ;
590
607
qualname. push_str ( "::" ) ;
591
608
qualname. push_str ( & name) ;
592
- let val = self . span . snippet ( variant. span ) ;
593
609
594
610
match variant. node . data {
595
- ast:: VariantData :: Struct ( .. ) => {
611
+ ast:: VariantData :: Struct ( ref fields , _ ) => {
596
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) ;
597
620
if !self . span . filter_generated ( sub_span, variant. span ) {
598
621
self . dumper . struct_variant ( StructVariantData {
599
622
span : sub_span. expect ( "No span found for struct variant" ) ,
@@ -606,13 +629,22 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
606
629
} . lower ( self . tcx ) ) ;
607
630
}
608
631
}
609
- _ => {
632
+ ref v => {
610
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
+ }
611
643
if !self . span . filter_generated ( sub_span, variant. span ) {
612
644
self . dumper . tuple_variant ( TupleVariantData {
613
645
span : sub_span. expect ( "No span found for tuple variant" ) ,
614
646
id : variant. node . data . id ( ) ,
615
- name : name. to_string ( ) ,
647
+ name : name,
616
648
qualname : qualname,
617
649
type_value : enum_data. qualname . clone ( ) ,
618
650
value : val,
@@ -678,14 +710,22 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
678
710
generics : & ast:: Generics ,
679
711
trait_refs : & ast:: TyParamBounds ,
680
712
methods : & [ ast:: TraitItem ] ) {
713
+ let name = item. ident . to_string ( ) ;
681
714
let qualname = format ! ( "::{}" , self . tcx. node_path_str( item. id) ) ;
682
- 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
+ }
683
723
let sub_span = self . span . sub_span_after_keyword ( item. span , keywords:: Trait ) ;
684
724
if !self . span . filter_generated ( sub_span, item. span ) {
685
725
self . dumper . trait_data ( TraitData {
686
726
span : sub_span. expect ( "No span found for trait" ) ,
687
727
id : item. id ,
688
- name : item . ident . to_string ( ) ,
728
+ name : name ,
689
729
qualname : qualname. clone ( ) ,
690
730
scope : self . cur_scope ,
691
731
value : val
@@ -915,13 +955,15 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
915
955
self . visit_pat ( & p) ;
916
956
917
957
for & ( id, ref p, immut, _) in & collector. collected_paths {
918
- let value = if immut == ast:: Mutability :: Immutable {
958
+ let mut value = if immut == ast:: Mutability :: Immutable {
919
959
value. to_string ( )
920
960
} else {
921
961
"<mutable>" . to_string ( )
922
962
} ;
923
963
let types = self . tcx . node_types ( ) ;
924
964
let typ = types. get ( & id) . map ( |t| t. to_string ( ) ) . unwrap_or ( String :: new ( ) ) ;
965
+ value. push_str ( ": " ) ;
966
+ value. push_str ( & typ) ;
925
967
// Get the span only for the name of the variable (I hope the path
926
968
// is only ever a variable name, but who knows?).
927
969
let sub_span = self . span . span_for_last_ident ( p. span ) ;
@@ -1283,13 +1325,13 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
1283
1325
}
1284
1326
ast:: ExprKind :: ForLoop ( ref pattern, ref subexpression, ref block, _) |
1285
1327
ast:: ExprKind :: WhileLet ( ref pattern, ref subexpression, ref block, _) => {
1286
- let value = self . span . snippet ( mk_sp ( ex . span . lo , subexpression. span . hi ) ) ;
1328
+ let value = self . span . snippet ( subexpression. span ) ;
1287
1329
self . process_var_decl ( pattern, value) ;
1288
1330
visit:: walk_expr ( self , subexpression) ;
1289
1331
visit:: walk_block ( self , block) ;
1290
1332
}
1291
1333
ast:: ExprKind :: IfLet ( ref pattern, ref subexpression, ref block, ref opt_else) => {
1292
- let value = self . span . snippet ( mk_sp ( ex . span . lo , subexpression. span . hi ) ) ;
1334
+ let value = self . span . snippet ( subexpression. span ) ;
1293
1335
self . process_var_decl ( pattern, value) ;
1294
1336
visit:: walk_expr ( self , subexpression) ;
1295
1337
visit:: walk_block ( self , block) ;
@@ -1379,7 +1421,7 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
1379
1421
1380
1422
fn visit_local ( & mut self , l : & ast:: Local ) {
1381
1423
self . process_macro_use ( l. span , l. id ) ;
1382
- 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 ( ) ) ;
1383
1425
self . process_var_decl ( & l. pat , value) ;
1384
1426
1385
1427
// Just walk the initialiser and type (don't want to walk the pattern again).
0 commit comments