@@ -848,50 +848,55 @@ impl<'hir> Map<'hir> {
848
848
/// Gets the span of the definition of the specified HIR node.
849
849
/// This is used by `tcx.get_span`
850
850
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 {
854
859
ItemKind :: Fn ( sig, _, _) => sig. span ,
855
860
_ => item. span ,
856
861
} ,
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 {
859
864
TraitItemKind :: Fn ( sig, _) => sig. span ,
860
865
_ => trait_item. span ,
861
866
} ,
862
- Some ( Node :: ImplItem ( impl_item) ) => match & impl_item. kind {
867
+ Node :: ImplItem ( impl_item) => match & impl_item. kind {
863
868
ImplItemKind :: Fn ( sig, _) => sig. span ,
864
869
_ => impl_item. span ,
865
870
} ,
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 ,
881
886
_ => unreachable ! ( ) ,
882
887
} ,
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 {
886
891
node : VisibilityKind :: Restricted { ref path, .. } ,
887
892
..
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 )
895
900
}
896
901
897
902
/// Like `hir.span()`, but includes the body of function items
@@ -907,7 +912,7 @@ impl<'hir> Map<'hir> {
907
912
}
908
913
909
914
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) ) )
911
916
}
912
917
913
918
pub fn res_span ( & self , res : Res ) -> Option < Span > {
0 commit comments