@@ -130,6 +130,10 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> {
130130 self . save_ctxt . span_from_span ( span)
131131 }
132132
133+ fn lookup_def_id ( & self , ref_id : NodeId ) -> Option < DefId > {
134+ self . save_ctxt . lookup_def_id ( ref_id)
135+ }
136+
133137 pub fn dump_crate_info ( & mut self , name : & str , krate : & ast:: Crate ) {
134138 let source_file = self . tcx . sess . local_crate_source_file . as_ref ( ) ;
135139 let crate_root = source_file. map ( |source_file| {
@@ -223,13 +227,6 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> {
223227 }
224228 }
225229
226- fn lookup_def_id ( & self , ref_id : NodeId ) -> Option < DefId > {
227- match self . save_ctxt . get_path_res ( ref_id) {
228- Res :: PrimTy ( ..) | Res :: SelfTy ( ..) | Res :: Err => None ,
229- def => Some ( def. def_id ( ) ) ,
230- }
231- }
232-
233230 fn process_formals ( & mut self , formals : & ' l [ ast:: Param ] , qualname : & str ) {
234231 for arg in formals {
235232 self . visit_pat ( & arg. pat ) ;
@@ -283,36 +280,32 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> {
283280 ) {
284281 debug ! ( "process_method: {}:{}" , id, ident) ;
285282
286- if let Some ( mut method_data) = self . save_ctxt . get_method_data ( id, ident, span) {
287- let sig_str = crate :: make_signature ( & sig. decl , & generics) ;
288- if body. is_some ( ) {
289- self . nest_tables (
290- id,
291- |v| v. process_formals ( & sig. decl . inputs , & method_data. qualname ) ,
292- ) ;
293- }
283+ let hir_id = self . tcx . hir ( ) . node_to_hir_id ( id) ;
284+ self . nest_tables ( id, |v| {
285+ if let Some ( mut method_data) = v. save_ctxt . get_method_data ( id, ident, span) {
286+ v. process_formals ( & sig. decl . inputs , & method_data. qualname ) ;
287+ v. process_generic_params ( & generics, & method_data. qualname , id) ;
294288
295- self . process_generic_params ( & generics, & method_data. qualname , id) ;
289+ method_data. value = crate :: make_signature ( & sig. decl , & generics) ;
290+ method_data. sig = sig:: method_signature ( id, ident, generics, sig, & v. save_ctxt ) ;
296291
297- method_data. value = sig_str;
298- method_data. sig = sig:: method_signature ( id, ident, generics, sig, & self . save_ctxt ) ;
299- let hir_id = self . tcx . hir ( ) . node_to_hir_id ( id) ;
300- self . dumper . dump_def ( & access_from_vis ! ( self . save_ctxt, vis, hir_id) , method_data) ;
301- }
292+ v. dumper . dump_def ( & access_from_vis ! ( v. save_ctxt, vis, hir_id) , method_data) ;
293+ }
302294
303- // walk arg and return types
304- for arg in & sig. decl . inputs {
305- self . visit_ty ( & arg. ty ) ;
306- }
295+ // walk arg and return types
296+ for arg in & sig. decl . inputs {
297+ v . visit_ty ( & arg. ty ) ;
298+ }
307299
308- if let ast:: FunctionRetTy :: Ty ( ref ret_ty) = sig. decl . output {
309- self . visit_ty ( ret_ty) ;
310- }
300+ if let ast:: FunctionRetTy :: Ty ( ref ret_ty) = sig. decl . output {
301+ v . visit_ty ( ret_ty) ;
302+ }
311303
312- // walk the fn body
313- if let Some ( body) = body {
314- self . nest_tables ( id, |v| v. visit_block ( body) ) ;
315- }
304+ // walk the fn body
305+ if let Some ( body) = body {
306+ v. visit_block ( body) ;
307+ }
308+ } ) ;
316309 }
317310
318311 fn process_struct_field_def ( & mut self , field : & ast:: StructField , parent_id : NodeId ) {
@@ -377,26 +370,31 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> {
377370 ty_params : & ' l ast:: Generics ,
378371 body : & ' l ast:: Block ,
379372 ) {
380- if let Some ( fn_data) = self . save_ctxt . get_item_data ( item) {
381- down_cast_data ! ( fn_data, DefData , item. span) ;
382- self . nest_tables (
383- item. id ,
384- |v| v. process_formals ( & decl. inputs , & fn_data. qualname ) ,
385- ) ;
386- self . process_generic_params ( ty_params, & fn_data. qualname , item. id ) ;
387- let hir_id = self . tcx . hir ( ) . node_to_hir_id ( item. id ) ;
388- self . dumper . dump_def ( & access_from ! ( self . save_ctxt, item, hir_id) , fn_data) ;
389- }
373+ let hir_id = self . tcx . hir ( ) . node_to_hir_id ( item. id ) ;
374+ self . nest_tables ( item. id , |v| {
375+ if let Some ( fn_data) = v. save_ctxt . get_item_data ( item) {
376+ down_cast_data ! ( fn_data, DefData , item. span) ;
377+ v. process_formals ( & decl. inputs , & fn_data. qualname ) ;
378+ v. process_generic_params ( ty_params, & fn_data. qualname , item. id ) ;
390379
391- for arg in & decl. inputs {
392- self . visit_ty ( & arg. ty ) ;
393- }
380+ v. dumper . dump_def ( & access_from ! ( v. save_ctxt, item, hir_id) , fn_data) ;
381+ }
394382
395- if let ast:: FunctionRetTy :: Ty ( ref ret_ty) = decl. output {
396- self . visit_ty ( & ret_ty) ;
397- }
383+ for arg in & decl. inputs {
384+ v. visit_ty ( & arg. ty )
385+ }
386+
387+ if let ast:: FunctionRetTy :: Ty ( ref ret_ty) = decl. output {
388+ if let ast:: TyKind :: ImplTrait ( ..) = ret_ty. node {
389+ // FIXME: Opaque type desugaring prevents us from easily
390+ // processing trait bounds. See `visit_ty` for more details.
391+ } else {
392+ v. visit_ty ( & ret_ty) ;
393+ }
394+ }
398395
399- self . nest_tables ( item. id , |v| v. visit_block ( & body) ) ;
396+ v. visit_block ( & body) ;
397+ } ) ;
400398 }
401399
402400 fn process_static_or_const_item (
@@ -1113,11 +1111,7 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> {
11131111 // FIXME: uses of the assoc type should ideally point to this
11141112 // 'def' and the name here should be a ref to the def in the
11151113 // trait.
1116- for bound in bounds. iter ( ) {
1117- if let ast:: GenericBound :: Trait ( trait_ref, _) = bound {
1118- self . process_path ( trait_ref. trait_ref . ref_id , & trait_ref. trait_ref . path )
1119- }
1120- }
1114+ self . process_bounds ( & bounds) ;
11211115 }
11221116 ast:: ImplItemKind :: Macro ( _) => { }
11231117 }
@@ -1364,10 +1358,10 @@ impl<'l, 'tcx> Visitor<'l> for DumpVisitor<'l, 'tcx> {
13641358 self . visit_ty ( & ty) ;
13651359 self . process_generic_params ( ty_params, & qualname, item. id ) ;
13661360 }
1367- OpaqueTy ( ref _bounds , ref ty_params) => {
1361+ OpaqueTy ( ref bounds , ref ty_params) => {
13681362 let qualname = format ! ( "::{}" ,
13691363 self . tcx. def_path_str( self . tcx. hir( ) . local_def_id_from_node_id( item. id) ) ) ;
1370- // FIXME do something with _bounds
1364+
13711365 let value = String :: new ( ) ;
13721366 if !self . span . filter_generated ( item. ident . span ) {
13731367 let span = self . span_from_span ( item. ident . span ) ;
@@ -1393,6 +1387,7 @@ impl<'l, 'tcx> Visitor<'l> for DumpVisitor<'l, 'tcx> {
13931387 ) ;
13941388 }
13951389
1390+ self . process_bounds ( bounds) ;
13961391 self . process_generic_params ( ty_params, & qualname, item. id ) ;
13971392 }
13981393 Mac ( _) => ( ) ,
@@ -1449,6 +1444,18 @@ impl<'l, 'tcx> Visitor<'l> for DumpVisitor<'l, 'tcx> {
14491444 self . visit_ty ( element) ;
14501445 self . nest_tables ( length. id , |v| v. visit_expr ( & length. value ) ) ;
14511446 }
1447+ ast:: TyKind :: ImplTrait ( id, ref bounds) => {
1448+ // FIXME: As of writing, the opaque type lowering introduces
1449+ // another DefPath scope/segment (used to declare the resulting
1450+ // opaque type item).
1451+ // However, the synthetic scope does *not* have associated
1452+ // typeck tables, which means we can't nest it and we fire an
1453+ // assertion when resolving the qualified type paths in trait
1454+ // bounds...
1455+ // This will panic if called on return type `impl Trait`, which
1456+ // we guard against in `process_fn`.
1457+ self . nest_tables ( id, |v| v. process_bounds ( bounds) ) ;
1458+ }
14521459 _ => visit:: walk_ty ( self , t) ,
14531460 }
14541461 }
0 commit comments