@@ -19,6 +19,25 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
1919use rustc_span:: { ErrorGuaranteed , Span } ;
2020use rustc_target:: spec:: abi:: Abi ;
2121
22+ pub fn until_within ( outer : Span , end : Span ) -> Span {
23+ if let Some ( end) = end. find_ancestor_inside ( outer) { outer. with_hi ( end. hi ( ) ) } else { outer }
24+ }
25+
26+ pub fn named_span ( item_span : Span , ident : Ident , generics_span : Option < Span > ) -> Span {
27+ if ident. name != kw:: Empty {
28+ let mut span = until_within ( item_span, ident. span ) ;
29+ if let Some ( g) = generics_span
30+ && !g. is_dummy ( )
31+ && let Some ( g_span) = g. find_ancestor_inside ( item_span)
32+ {
33+ span = span. to ( g_span) ;
34+ }
35+ span
36+ } else {
37+ item_span
38+ }
39+ }
40+
2241#[ inline]
2342pub fn associated_body ( node : Node < ' _ > ) -> Option < ( LocalDefId , BodyId ) > {
2443 match node {
@@ -847,110 +866,14 @@ impl<'hir> Map<'hir> {
847866 }
848867
849868 pub fn opt_span ( self , hir_id : HirId ) -> Option < Span > {
850- fn until_within ( outer : Span , end : Span ) -> Span {
851- if let Some ( end) = end. find_ancestor_inside ( outer) {
852- outer. with_hi ( end. hi ( ) )
853- } else {
854- outer
855- }
856- }
857-
858- fn named_span ( item_span : Span , ident : Ident , generics : Option < & Generics < ' _ > > ) -> Span {
859- if ident. name != kw:: Empty {
860- let mut span = until_within ( item_span, ident. span ) ;
861- if let Some ( g) = generics
862- && !g. span . is_dummy ( )
863- && let Some ( g_span) = g. span . find_ancestor_inside ( item_span)
864- {
865- span = span. to ( g_span) ;
866- }
867- span
868- } else {
869- item_span
870- }
869+ if let Some ( owner) = hir_id. as_owner ( ) {
870+ let span = self . tcx . def_span ( owner. def_id ) ;
871+ return Some ( span) ;
871872 }
872873
873874 let span = match self . tcx . opt_hir_node ( hir_id) ? {
874- // Function-like.
875- Node :: Item ( Item { kind : ItemKind :: Fn ( sig, ..) , span : outer_span, .. } )
876- | Node :: TraitItem ( TraitItem {
877- kind : TraitItemKind :: Fn ( sig, ..) ,
878- span : outer_span,
879- ..
880- } )
881- | Node :: ImplItem ( ImplItem {
882- kind : ImplItemKind :: Fn ( sig, ..) , span : outer_span, ..
883- } ) => {
884- // Ensure that the returned span has the item's SyntaxContext, and not the
885- // SyntaxContext of the visibility.
886- sig. span . find_ancestor_in_same_ctxt ( * outer_span) . unwrap_or ( * outer_span)
887- }
888- // Impls, including their where clauses.
889- Node :: Item ( Item {
890- kind : ItemKind :: Impl ( Impl { generics, .. } ) ,
891- span : outer_span,
892- ..
893- } ) => until_within ( * outer_span, generics. where_clause_span ) ,
894- // Constants and Statics.
895- Node :: Item ( Item {
896- kind : ItemKind :: Const ( ty, ..) | ItemKind :: Static ( ty, ..) ,
897- span : outer_span,
898- ..
899- } )
900- | Node :: TraitItem ( TraitItem {
901- kind : TraitItemKind :: Const ( ty, ..) ,
902- span : outer_span,
903- ..
904- } )
905- | Node :: ImplItem ( ImplItem {
906- kind : ImplItemKind :: Const ( ty, ..) ,
907- span : outer_span,
908- ..
909- } )
910- | Node :: ForeignItem ( ForeignItem {
911- kind : ForeignItemKind :: Static ( ty, ..) ,
912- span : outer_span,
913- ..
914- } ) => until_within ( * outer_span, ty. span ) ,
915- // With generics and bounds.
916- Node :: Item ( Item {
917- kind : ItemKind :: Trait ( _, _, generics, bounds, _) ,
918- span : outer_span,
919- ..
920- } )
921- | Node :: TraitItem ( TraitItem {
922- kind : TraitItemKind :: Type ( bounds, _) ,
923- generics,
924- span : outer_span,
925- ..
926- } ) => {
927- let end = if let Some ( b) = bounds. last ( ) { b. span ( ) } else { generics. span } ;
928- until_within ( * outer_span, end)
929- }
930- // Other cases.
931- Node :: Item ( item) => match & item. kind {
932- ItemKind :: Use ( path, _) => {
933- // Ensure that the returned span has the item's SyntaxContext, and not the
934- // SyntaxContext of the path.
935- path. span . find_ancestor_in_same_ctxt ( item. span ) . unwrap_or ( item. span )
936- }
937- _ => named_span ( item. span , item. ident , item. kind . generics ( ) ) ,
938- } ,
939875 Node :: Variant ( variant) => named_span ( variant. span , variant. ident , None ) ,
940- Node :: ImplItem ( item) => named_span ( item. span , item. ident , Some ( item. generics ) ) ,
941- Node :: ForeignItem ( item) => match item. kind {
942- ForeignItemKind :: Fn ( decl, _, _) => until_within ( item. span , decl. output . span ( ) ) ,
943- _ => named_span ( item. span , item. ident , None ) ,
944- } ,
945876 Node :: Ctor ( _) => return self . opt_span ( self . parent_id ( hir_id) ) ,
946- Node :: Expr ( Expr {
947- kind : ExprKind :: Closure ( Closure { fn_decl_span, .. } ) ,
948- span,
949- ..
950- } ) => {
951- // Ensure that the returned span has the item's SyntaxContext.
952- fn_decl_span. find_ancestor_inside ( * span) . unwrap_or ( * span)
953- }
954877 _ => self . span_with_body ( hir_id) ,
955878 } ;
956879 debug_assert_eq ! ( span. ctxt( ) , self . span_with_body( hir_id) . ctxt( ) ) ;
0 commit comments