@@ -39,7 +39,7 @@ use syntax::ast::{self, NodeId, PatKind};
3939use syntax:: codemap:: * ;
4040use syntax:: parse:: token:: { self , keywords} ;
4141use 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 } ;
4343use syntax:: ptr:: P ;
4444
4545use 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