@@ -2284,6 +2284,54 @@ pub struct FnSig {
2284
2284
pub span : Span ,
2285
2285
}
2286
2286
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
+
2287
2335
/// A constraint on an associated item.
2288
2336
///
2289
2337
/// ### Examples
@@ -3526,6 +3574,13 @@ impl Extern {
3526
3574
None => Extern :: Implicit ( span) ,
3527
3575
}
3528
3576
}
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
+ }
3529
3584
}
3530
3585
3531
3586
/// A function header.
@@ -3534,12 +3589,12 @@ impl Extern {
3534
3589
/// included in this struct (e.g., `async unsafe fn` or `const extern "C" fn`).
3535
3590
#[ derive( Clone , Copy , Encodable , Decodable , Debug , Walkable ) ]
3536
3591
pub 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 > ,
3541
3592
/// The `const` keyword, if any
3542
3593
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 ,
3543
3598
/// The `extern` keyword and corresponding ABI string, if any.
3544
3599
pub ext : Extern ,
3545
3600
}
@@ -3553,38 +3608,6 @@ impl FnHeader {
3553
3608
|| matches ! ( constness, Const :: Yes ( _) )
3554
3609
|| !matches ! ( ext, Extern :: None )
3555
3610
}
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
- }
3588
3611
}
3589
3612
3590
3613
impl Default for FnHeader {
0 commit comments