@@ -2284,6 +2284,54 @@ pub struct FnSig {
22842284    pub  span :  Span , 
22852285} 
22862286
2287+ impl  FnSig  { 
2288+     /// Return a span encompassing the header, or where to insert it if empty. 
2289+ pub  fn  header_span ( & self )  -> Span  { 
2290+         match  self . header . ext  { 
2291+             Extern :: Implicit ( span)  | Extern :: Explicit ( _,  span)  => { 
2292+                 return  self . span . with_hi ( span. hi ( ) ) ; 
2293+             } 
2294+             Extern :: None  => { } 
2295+         } 
2296+ 
2297+         match  self . header . safety  { 
2298+             Safety :: Unsafe ( span)  | Safety :: Safe ( span)  => return  self . span . with_hi ( span. hi ( ) ) , 
2299+             Safety :: Default  => { } 
2300+         } ; 
2301+ 
2302+         if  let  Some ( coroutine_kind)  = self . header . coroutine_kind  { 
2303+             return  self . span . with_hi ( coroutine_kind. span ( ) . hi ( ) ) ; 
2304+         } 
2305+ 
2306+         if  let  Const :: Yes ( span)  = self . header . constness  { 
2307+             return  self . span . with_hi ( span. hi ( ) ) ; 
2308+         } 
2309+ 
2310+         self . span . shrink_to_lo ( ) 
2311+     } 
2312+ 
2313+     /// The span of the header's safety, or where to insert it if empty. 
2314+ pub  fn  safety_span ( & self )  -> Span  { 
2315+         match  self . header . safety  { 
2316+             Safety :: Unsafe ( span)  | Safety :: Safe ( span)  => span, 
2317+             Safety :: Default  => { 
2318+                 // Insert after the `coroutine_kind` if available. 
2319+                 if  let  Some ( extern_span)  = self . header . ext . span ( )  { 
2320+                     return  extern_span. shrink_to_lo ( ) ; 
2321+                 } 
2322+ 
2323+                 // Insert right at the front of the signature. 
2324+                 self . header_span ( ) . shrink_to_hi ( ) 
2325+             } 
2326+         } 
2327+     } 
2328+ 
2329+     /// The span of the header's extern, or where to insert it if empty. 
2330+ pub  fn  extern_span ( & self )  -> Span  { 
2331+         self . header . ext . span ( ) . unwrap_or ( self . safety_span ( ) . shrink_to_hi ( ) ) 
2332+     } 
2333+ } 
2334+ 
22872335/// A constraint on an associated item. 
22882336/// 
22892337/// ### Examples 
@@ -3526,6 +3574,13 @@ impl Extern {
35263574            None  => Extern :: Implicit ( span) , 
35273575        } 
35283576    } 
3577+ 
3578+     pub  fn  span ( self )  -> Option < Span >  { 
3579+         match  self  { 
3580+             Extern :: None  => None , 
3581+             Extern :: Implicit ( span)  | Extern :: Explicit ( _,  span)  => Some ( span) , 
3582+         } 
3583+     } 
35293584} 
35303585
35313586/// A function header. 
@@ -3534,12 +3589,12 @@ impl Extern {
35343589/// included in this struct (e.g., `async unsafe fn` or `const extern "C" fn`). 
35353590#[ derive( Clone ,  Copy ,  Encodable ,  Decodable ,  Debug ,  Walkable ) ]  
35363591pub  struct  FnHeader  { 
3537-     /// Whether this is `unsafe`, or has a default safety. 
3538- pub  safety :  Safety , 
3539-     /// Whether this is `async`, `gen`, or nothing. 
3540- pub  coroutine_kind :  Option < CoroutineKind > , 
35413592    /// The `const` keyword, if any 
35423593pub  constness :  Const , 
3594+     /// Whether this is `async`, `gen`, or nothing. 
3595+ pub  coroutine_kind :  Option < CoroutineKind > , 
3596+     /// Whether this is `unsafe`, or has a default safety. 
3597+ pub  safety :  Safety , 
35433598    /// The `extern` keyword and corresponding ABI string, if any. 
35443599pub  ext :  Extern , 
35453600} 
@@ -3553,38 +3608,6 @@ impl FnHeader {
35533608            || matches ! ( constness,  Const :: Yes ( _) ) 
35543609            || !matches ! ( ext,  Extern :: None ) 
35553610    } 
3556- 
3557-     /// Return a span encompassing the header, or none if all options are default. 
3558- pub  fn  span ( & self )  -> Option < Span >  { 
3559-         fn  append ( a :  & mut  Option < Span > ,  b :  Span )  { 
3560-             * a = match  a { 
3561-                 None  => Some ( b) , 
3562-                 Some ( x)  => Some ( x. to ( b) ) , 
3563-             } 
3564-         } 
3565- 
3566-         let  mut  full_span = None ; 
3567- 
3568-         match  self . safety  { 
3569-             Safety :: Unsafe ( span)  | Safety :: Safe ( span)  => append ( & mut  full_span,  span) , 
3570-             Safety :: Default  => { } 
3571-         } ; 
3572- 
3573-         if  let  Some ( coroutine_kind)  = self . coroutine_kind  { 
3574-             append ( & mut  full_span,  coroutine_kind. span ( ) ) ; 
3575-         } 
3576- 
3577-         if  let  Const :: Yes ( span)  = self . constness  { 
3578-             append ( & mut  full_span,  span) ; 
3579-         } 
3580- 
3581-         match  self . ext  { 
3582-             Extern :: Implicit ( span)  | Extern :: Explicit ( _,  span)  => append ( & mut  full_span,  span) , 
3583-             Extern :: None  => { } 
3584-         } 
3585- 
3586-         full_span
3587-     } 
35883611} 
35893612
35903613impl  Default  for  FnHeader  { 
0 commit comments