@@ -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
35423593 pub 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.
35443599 pub 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