2727//! is used for recording the output in a format-agnostic way (see CsvDumper
2828//! for an example).
2929
30+ use rustc:: hir;
3031use rustc:: hir:: def:: Def ;
3132use rustc:: hir:: def_id:: DefId ;
32- use rustc:: hir:: map:: Node ;
33+ use rustc:: hir:: map:: { Node , NodeItem } ;
3334use rustc:: session:: Session ;
3435use rustc:: ty:: { self , TyCtxt , ImplOrTraitItem , ImplOrTraitItemContainer } ;
3536
@@ -47,7 +48,7 @@ use syntax_pos::*;
4748use super :: { escape, generated_code, SaveContext , PathCollector , docs_for_attrs} ;
4849use super :: data:: * ;
4950use super :: dump:: Dump ;
50- use super :: external_data:: Lower ;
51+ use super :: external_data:: { Lower , make_def_id } ;
5152use super :: span_utils:: SpanUtils ;
5253use super :: recorder;
5354
@@ -271,11 +272,13 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
271272
272273 // looks up anything, not just a type
273274 fn lookup_type_ref ( & self , ref_id : NodeId ) -> Option < DefId > {
274- match self . tcx . expect_def ( ref_id) {
275- Def :: PrimTy ( ..) => None ,
276- Def :: SelfTy ( ..) => None ,
277- def => Some ( def. def_id ( ) ) ,
278- }
275+ self . tcx . expect_def_or_none ( ref_id) . and_then ( |def| {
276+ match def {
277+ Def :: PrimTy ( ..) => None ,
278+ Def :: SelfTy ( ..) => None ,
279+ def => Some ( def. def_id ( ) ) ,
280+ }
281+ } )
279282 }
280283
281284 fn process_def_kind ( & mut self ,
@@ -399,20 +402,36 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
399402 if !self . span . filter_generated ( Some ( method_data. span ) , span) {
400403 let container =
401404 self . tcx . impl_or_trait_item ( self . tcx . map . local_def_id ( id) ) . container ( ) ;
402- let decl_id = if let ImplOrTraitItemContainer :: ImplContainer ( id) = container {
403- self . tcx . trait_id_of_impl ( id) . and_then ( |id| {
404- for item in & * * self . tcx . trait_items ( id) {
405- if let & ImplOrTraitItem :: MethodTraitItem ( ref m) = item {
406- if m. name == name {
407- return Some ( m. def_id ) ;
405+ let mut trait_id;
406+ let mut decl_id = None ;
407+ match container {
408+ ImplOrTraitItemContainer :: ImplContainer ( id) => {
409+ trait_id = self . tcx . trait_id_of_impl ( id) ;
410+
411+ match trait_id {
412+ Some ( id) => {
413+ for item in & * * self . tcx . trait_items ( id) {
414+ if let & ImplOrTraitItem :: MethodTraitItem ( ref m) = item {
415+ if m. name == name {
416+ decl_id = Some ( m. def_id ) ;
417+ break ;
418+ }
419+ }
420+ }
421+ }
422+ None => {
423+ if let Some ( NodeItem ( item) ) = self . tcx . map . get_if_local ( id) {
424+ if let hir:: ItemImpl ( _, _, _, _, ref ty, _) = item. node {
425+ trait_id = self . lookup_type_ref ( ty. id ) ;
426+ }
408427 }
409428 }
410429 }
411- None
412- } )
413- } else {
414- None
415- } ;
430+ }
431+ ImplOrTraitItemContainer :: TraitContainer ( id ) => {
432+ trait_id = Some ( id ) ;
433+ }
434+ }
416435
417436 self . dumper . method ( MethodData {
418437 id : method_data. id ,
@@ -422,6 +441,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
422441 qualname : method_data. qualname . clone ( ) ,
423442 value : sig_str,
424443 decl_id : decl_id,
444+ parent : trait_id,
425445 visibility : vis,
426446 docs : docs_for_attrs ( attrs) ,
427447 } . lower ( self . tcx ) ) ;
@@ -544,7 +564,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
544564 span : Span ,
545565 typ : & ast:: Ty ,
546566 expr : & ast:: Expr ,
547- parent_id : NodeId ,
567+ parent_id : DefId ,
548568 vis : Visibility ,
549569 attrs : & [ Attribute ] ) {
550570 let qualname = format ! ( "::{}" , self . tcx. node_path_str( id) ) ;
@@ -659,7 +679,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
659679 type_value : enum_data. qualname . clone ( ) ,
660680 value : val,
661681 scope : enum_data. scope ,
662- parent : Some ( item. id ) ,
682+ parent : Some ( make_def_id ( item. id , & self . tcx . map ) ) ,
663683 docs : docs_for_attrs ( & variant. node . attrs ) ,
664684 } . lower ( self . tcx ) ) ;
665685 }
@@ -684,7 +704,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
684704 type_value : enum_data. qualname . clone ( ) ,
685705 value : val,
686706 scope : enum_data. scope ,
687- parent : Some ( item. id ) ,
707+ parent : Some ( make_def_id ( item. id , & self . tcx . map ) ) ,
688708 docs : docs_for_attrs ( & variant. node . attrs ) ,
689709 } . lower ( self . tcx ) ) ;
690710 }
@@ -738,7 +758,8 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
738758 }
739759 self . process_generic_params ( type_parameters, item. span , "" , item. id ) ;
740760 for impl_item in impl_items {
741- self . process_impl_item ( impl_item, item. id ) ;
761+ let map = & self . tcx . map ;
762+ self . process_impl_item ( impl_item, make_def_id ( item. id , map) ) ;
742763 }
743764 }
744765
@@ -809,7 +830,8 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
809830 // walk generics and methods
810831 self . process_generic_params ( generics, item. span , & qualname, item. id ) ;
811832 for method in methods {
812- self . process_trait_item ( method, item. id )
833+ let map = & self . tcx . map ;
834+ self . process_trait_item ( method, make_def_id ( item. id , map) )
813835 }
814836 }
815837
@@ -1076,7 +1098,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
10761098 }
10771099 }
10781100
1079- fn process_trait_item ( & mut self , trait_item : & ast:: TraitItem , trait_id : NodeId ) {
1101+ fn process_trait_item ( & mut self , trait_item : & ast:: TraitItem , trait_id : DefId ) {
10801102 self . process_macro_use ( trait_item. span , trait_item. id ) ;
10811103 match trait_item. node {
10821104 ast:: TraitItemKind :: Const ( ref ty, Some ( ref expr) ) => {
@@ -1104,7 +1126,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
11041126 }
11051127 }
11061128
1107- fn process_impl_item ( & mut self , impl_item : & ast:: ImplItem , impl_id : NodeId ) {
1129+ fn process_impl_item ( & mut self , impl_item : & ast:: ImplItem , impl_id : DefId ) {
11081130 self . process_macro_use ( impl_item. span , impl_item. id ) ;
11091131 match impl_item. node {
11101132 ast:: ImplItemKind :: Const ( ref ty, ref expr) => {
0 commit comments