@@ -848,50 +848,55 @@ impl<'hir> Map<'hir> {
848848 /// Gets the span of the definition of the specified HIR node.
849849 /// This is used by `tcx.get_span`
850850 pub fn span ( & self , hir_id : HirId ) -> Span {
851- match self . find_entry ( hir_id) . map ( |entry| entry. node ) {
852- Some ( Node :: Param ( param) ) => param. span ,
853- Some ( Node :: Item ( item) ) => match & item. kind {
851+ self . opt_span ( hir_id)
852+ . unwrap_or_else ( || bug ! ( "hir::map::Map::span: id not in map: {:?}" , hir_id) )
853+ }
854+
855+ pub fn opt_span ( & self , hir_id : HirId ) -> Option < Span > {
856+ let span = match self . find_entry ( hir_id) ?. node {
857+ Node :: Param ( param) => param. span ,
858+ Node :: Item ( item) => match & item. kind {
854859 ItemKind :: Fn ( sig, _, _) => sig. span ,
855860 _ => item. span ,
856861 } ,
857- Some ( Node :: ForeignItem ( foreign_item) ) => foreign_item. span ,
858- Some ( Node :: TraitItem ( trait_item) ) => match & trait_item. kind {
862+ Node :: ForeignItem ( foreign_item) => foreign_item. span ,
863+ Node :: TraitItem ( trait_item) => match & trait_item. kind {
859864 TraitItemKind :: Fn ( sig, _) => sig. span ,
860865 _ => trait_item. span ,
861866 } ,
862- Some ( Node :: ImplItem ( impl_item) ) => match & impl_item. kind {
867+ Node :: ImplItem ( impl_item) => match & impl_item. kind {
863868 ImplItemKind :: Fn ( sig, _) => sig. span ,
864869 _ => impl_item. span ,
865870 } ,
866- Some ( Node :: Variant ( variant) ) => variant. span ,
867- Some ( Node :: Field ( field) ) => field. span ,
868- Some ( Node :: AnonConst ( constant) ) => self . body ( constant. body ) . value . span ,
869- Some ( Node :: Expr ( expr) ) => expr. span ,
870- Some ( Node :: Stmt ( stmt) ) => stmt. span ,
871- Some ( Node :: PathSegment ( seg) ) => seg. ident . span ,
872- Some ( Node :: Ty ( ty) ) => ty. span ,
873- Some ( Node :: TraitRef ( tr) ) => tr. path . span ,
874- Some ( Node :: Binding ( pat) ) => pat. span ,
875- Some ( Node :: Pat ( pat) ) => pat. span ,
876- Some ( Node :: Arm ( arm) ) => arm. span ,
877- Some ( Node :: Block ( block) ) => block. span ,
878- Some ( Node :: Ctor ( ..) ) => match self . find ( self . get_parent_node ( hir_id) ) {
879- Some ( Node :: Item ( item) ) => item. span ,
880- Some ( Node :: Variant ( variant) ) => variant. span ,
871+ Node :: Variant ( variant) => variant. span ,
872+ Node :: Field ( field) => field. span ,
873+ Node :: AnonConst ( constant) => self . body ( constant. body ) . value . span ,
874+ Node :: Expr ( expr) => expr. span ,
875+ Node :: Stmt ( stmt) => stmt. span ,
876+ Node :: PathSegment ( seg) => seg. ident . span ,
877+ Node :: Ty ( ty) => ty. span ,
878+ Node :: TraitRef ( tr) => tr. path . span ,
879+ Node :: Binding ( pat) => pat. span ,
880+ Node :: Pat ( pat) => pat. span ,
881+ Node :: Arm ( arm) => arm. span ,
882+ Node :: Block ( block) => block. span ,
883+ Node :: Ctor ( ..) => match self . find ( self . get_parent_node ( hir_id) ) ? {
884+ Node :: Item ( item) => item. span ,
885+ Node :: Variant ( variant) => variant. span ,
881886 _ => unreachable ! ( ) ,
882887 } ,
883- Some ( Node :: Lifetime ( lifetime) ) => lifetime. span ,
884- Some ( Node :: GenericParam ( param) ) => param. span ,
885- Some ( Node :: Visibility ( & Spanned {
888+ Node :: Lifetime ( lifetime) => lifetime. span ,
889+ Node :: GenericParam ( param) => param. span ,
890+ Node :: Visibility ( & Spanned {
886891 node : VisibilityKind :: Restricted { ref path, .. } ,
887892 ..
888- } ) ) => path. span ,
889- Some ( Node :: Visibility ( v) ) => bug ! ( "unexpected Visibility {:?}" , v) ,
890- Some ( Node :: Local ( local) ) => local. span ,
891- Some ( Node :: MacroDef ( macro_def) ) => macro_def. span ,
892- Some ( Node :: Crate ( item) ) => item. span ,
893- None => bug ! ( "hir::map::Map::span: id not in map: {:?}" , hir_id ) ,
894- }
893+ } ) => path. span ,
894+ Node :: Visibility ( v) => bug ! ( "unexpected Visibility {:?}" , v) ,
895+ Node :: Local ( local) => local. span ,
896+ Node :: MacroDef ( macro_def) => macro_def. span ,
897+ Node :: Crate ( item) => item. span ,
898+ } ;
899+ Some ( span )
895900 }
896901
897902 /// Like `hir.span()`, but includes the body of function items
@@ -907,7 +912,7 @@ impl<'hir> Map<'hir> {
907912 }
908913
909914 pub fn span_if_local ( & self , id : DefId ) -> Option < Span > {
910- id. as_local ( ) . map ( |id| self . span ( self . local_def_id_to_hir_id ( id) ) )
915+ id. as_local ( ) . and_then ( |id| self . opt_span ( self . local_def_id_to_hir_id ( id) ) )
911916 }
912917
913918 pub fn res_span ( & self , res : Res ) -> Option < Span > {
0 commit comments