@@ -19,6 +19,25 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
19
19
use rustc_span:: { ErrorGuaranteed , Span } ;
20
20
use rustc_target:: spec:: abi:: Abi ;
21
21
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
+
22
41
#[ inline]
23
42
pub fn associated_body ( node : Node < ' _ > ) -> Option < ( LocalDefId , BodyId ) > {
24
43
match node {
@@ -847,110 +866,14 @@ impl<'hir> Map<'hir> {
847
866
}
848
867
849
868
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) ;
871
872
}
872
873
873
874
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
- } ,
939
875
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
- } ,
945
876
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
- }
954
877
_ => self . span_with_body ( hir_id) ,
955
878
} ;
956
879
debug_assert_eq ! ( span. ctxt( ) , self . span_with_body( hir_id) . ctxt( ) ) ;
0 commit comments