@@ -37,8 +37,10 @@ import Language.Rust.Data.Position
37
37
import Language.Rust .Parser .Lexer (lexNonSpace, lexShebangLine)
38
38
import Language.Rust .Parser .ParseMonad (pushToken, getPosition, P, parseError)
39
39
import Language.Rust .Parser .Literals (translateLit)
40
+ import Language.Rust .Parser .Reversed
40
41
41
- import Data.List .NonEmpty (NonEmpty (..), (<|), toList)
42
+ import Data.Foldable (toList)
43
+ import Data.List .NonEmpty (NonEmpty (..), (<|))
42
44
import qualified Data.List .NonEmpty as N
43
45
import Data.Semigroup ((<>))
44
46
import Text.Read (readMaybe)
@@ -323,8 +325,8 @@ gt :: { () }
323
325
-------------
324
326
325
327
-- | One or more occurences of ' p'
326
- some (p) :: { NonEmpty a }
327
- : some(p) p { $1 |> $ 2 }
328
+ some (p) :: { Reversed NonEmpty a }
329
+ : some(p) p { let Reversed xs = $1 in Reversed ($ 2 <| xs) }
328
330
| p { [$1 ] }
329
331
330
332
-- | Zero or more occurences of ' p'
@@ -333,8 +335,8 @@ many(p) :: { [a] }
333
335
| {- empty -} { [] }
334
336
335
337
-- | One or more occurences of ' p' , seperated by ' sep'
336
- sep_by1 (p,sep) :: { NonEmpty a }
337
- : sep_by1(p,sep) sep p { $1 |> $ 3 }
338
+ sep_by1 (p,sep) :: { Reversed NonEmpty a }
339
+ : sep_by1(p,sep) sep p { let Reversed xs = $1 in Reversed ($ 3 <| xs) }
338
340
| p { [$1 ] }
339
341
340
342
-- | Zero or more occurrences of ' p' , separated by ' sep'
@@ -343,7 +345,7 @@ sep_by(p,sep) :: { [a] }
343
345
| {- empty -} { [] }
344
346
345
347
-- | One or more occurrences of ' p' , seperated by ' sep' , optionally ending in ' sep'
346
- sep_by1T (p,sep) :: { NonEmpty a }
348
+ sep_by1T (p,sep) :: { Reversed NonEmpty a }
347
349
: sep_by1(p,sep) sep { $1 }
348
350
| sep_by1(p,sep) { $1 }
349
351
@@ -540,7 +542,7 @@ ty_qual_path :: { Spanned (QSelf Span, Path Span) }
540
542
541
543
-- parse_path_segments_without_colons()
542
544
path_segments_without_colons :: { Spanned (NonEmpty (Ident, PathParameters Span)) }
543
- : sep_by1(path_segment_without_colons, ' ::' ) { sequence $ 1 }
545
+ : sep_by1(path_segment_without_colons, ' ::' ) { sequence (toNonEmpty $ 1 ) }
544
546
545
547
-- No corresponding function - see path_segments_without_colons
546
548
path_segment_without_colons :: { Spanned (Ident, PathParameters Span) }
@@ -609,7 +611,7 @@ ty_general :: { Ty Span }
609
611
-- All types, including trait types with plus
610
612
ty :: { Ty Span }
611
613
: ty_no_plus { $1 }
612
- | poly_trait_ref_mod_bound ' +' sep_by1T(ty_param_bound_mod,' +' ) { TraitObject ($1 <| $3 ) ($1 # $3 ) }
614
+ | poly_trait_ref_mod_bound ' +' sep_by1T(ty_param_bound_mod,' +' ) { TraitObject ($1 <| toNonEmpty $3 ) ($1 # $3 ) }
613
615
614
616
-- parse_ty_no_plus()
615
617
ty_no_plus :: { Ty Span }
@@ -621,7 +623,7 @@ ty_no_plus :: { Ty Span }
621
623
ty_prim :: { Ty Span }
622
624
: no_for_ty_prim { $1 }
623
625
| for_ty_no_plus { $1 }
624
- | poly_trait_ref_mod_bound ' +' sep_by1T(ty_param_bound_mod,' +' ) { TraitObject ($1 <| $3 ) ($1 # $3 ) }
626
+ | poly_trait_ref_mod_bound ' +' sep_by1T(ty_param_bound_mod,' +' ) { TraitObject ($1 <| toNonEmpty $3 ) ($1 # $3 ) }
625
627
626
628
-- All (non-sum) types not starting with a ' for'
627
629
no_for_ty :: { Ty Span }
@@ -665,7 +667,7 @@ for_ty_no_plus :: { Ty Span }
665
667
}
666
668
667
669
impl_ty :: { Ty Span }
668
- : impl sep_by1 (ty_param_bound_mod,' +' ) %prec IMPLTRAIT { ImplTrait $ 2 ($1 # $2 ) }
670
+ : impl sep_by1 (ty_param_bound_mod,' +' ) %prec IMPLTRAIT { ImplTrait (toNonEmpty $ 2 ) ($1 # $2 ) }
669
671
670
672
-- An optional lifetime followed by an optional mutability
671
673
lifetime_mut :: { (Maybe (Lifetime Span), Mutability) }
@@ -810,8 +812,8 @@ pat_tup :: { ([Pat Span], Maybe Int, Bool) }
810
812
pat_slice :: { ([Pat Span], Maybe (Pat Span), [Pat Span]) }
811
813
: sep_by1(pat,' ,' ) ' ,' ' ..' ' ,' sep_by1T(pat,' ,' ) { (toList $1, Just (WildP mempty), toList $5) }
812
814
| sep_by1(pat,' ,' ) ' ,' ' ..' { (toList $1, Just (WildP mempty), []) }
813
- | sep_by1(pat,' ,' ) ' ..' ' ,' sep_by1T(pat,' ,' ) { (N.init $1, Just (N.last $1) , toList $4) }
814
- | sep_by1(pat,' ,' ) ' ..' { (N.init $1, Just (N.last $1) , []) }
815
+ | sep_by1(pat,' ,' ) ' ..' ' ,' sep_by1T(pat,' ,' ) { let (xs, x) = unsnoc $1 in (toList xs, Just x , toList $4) }
816
+ | sep_by1(pat,' ,' ) ' ..' { let (xs, x) = unsnoc $1 in (toList xs, Just x , []) }
815
817
| sep_by1T(pat,' ,' ) { (toList $1, Nothing, []) }
816
818
| ' ..' ' ,' sep_by1T(pat,' ,' ) { ([], Just (WildP mempty), toList $3) }
817
819
| ' ..' { ([], Just (WildP mempty), []) }
@@ -1050,7 +1052,7 @@ arms :: { [Arm Span] }
1050
1052
: ntArm { [$1 ] }
1051
1053
| ntArm arms { $1 : $2 }
1052
1054
| many(outer_attribute) sep_by1(pat,' |' ) arm_guard ' =>' expr_arms
1053
- { let (e,as) = $> in (Arm $1 $ 2 $3 e ($1 # $2 # e) : as) }
1055
+ { let (e,as) = $> in (Arm $1 (toNonEmpty $ 2 ) $3 e ($1 # $2 # e) : as) }
1054
1056
1055
1057
arm_guard :: { Maybe (Expr Span) }
1056
1058
: {- empty -} { Nothing }
@@ -1453,14 +1455,14 @@ def :: { Spanned Defaultness }
1453
1455
| default { Spanned Default (spanOf $1) }
1454
1456
1455
1457
view_path :: { ViewPath Span }
1456
- : ' ::' sep_by1(self_or_ident,' ::' ) { let n = fmap unspan $2 in ViewPathSimple True (N.init n ) (PathListItem (N.last n) Nothing mempty) ($1 # $>) }
1457
- | ' ::' sep_by1(self_or_ident,' ::' ) as ident { let n = fmap unspan $2 in ViewPathSimple True (N.init n ) (PathListItem (N.last n) (Just (unspan $>)) mempty) ($1 # $>) }
1458
+ : ' ::' sep_by1(self_or_ident,' ::' ) { let (ns,n) = unsnoc ( fmap unspan $2) in ViewPathSimple True (toList ns ) (PathListItem n Nothing mempty) ($1 # $>) }
1459
+ | ' ::' sep_by1(self_or_ident,' ::' ) as ident { let (ns,n) = unsnoc ( fmap unspan $2) in ViewPathSimple True (toList ns ) (PathListItem n (Just (unspan $>)) mempty) ($1 # $>) }
1458
1460
| ' ::' ' *' { ViewPathGlob True [] ($1 # $2) }
1459
1461
| ' ::' sep_by1(self_or_ident,' ::' ) ' ::' ' *' { ViewPathGlob True (fmap unspan (toList $2)) ($1 # $>) }
1460
1462
| ' ::' sep_by1(self_or_ident,' ::' ) ' ::' ' {' sep_byT(plist,' ,' ) ' }' { ViewPathList True (map unspan (toList $2)) $5 ($1 # $>) }
1461
1463
| ' ::' ' {' sep_byT(plist,' ,' ) ' }' { ViewPathList True [] $3 ($1 # $>) }
1462
- | sep_by1(self_or_ident,' ::' ) { let n = fmap unspan $1 in ViewPathSimple False (N.init n ) (PathListItem (N.last n) Nothing mempty) ($1 # $>) }
1463
- | sep_by1(self_or_ident,' ::' ) as ident { let n = fmap unspan $1 in ViewPathSimple False (N.init n ) (PathListItem (N.last n) (Just (unspan $>)) mempty) ($1 # $>) }
1464
+ | sep_by1(self_or_ident,' ::' ) { let (ns,n) = unsnoc ( fmap unspan $1) in ViewPathSimple False (toList ns ) (PathListItem n Nothing mempty) ($1 # $>) }
1465
+ | sep_by1(self_or_ident,' ::' ) as ident { let (ns,n) = unsnoc ( fmap unspan $1) in ViewPathSimple False (toList ns ) (PathListItem n (Just (unspan $>)) mempty) ($1 # $>) }
1464
1466
| ' *' { ViewPathGlob False [] (spanOf $1) }
1465
1467
| sep_by1(self_or_ident,' ::' ) ' ::' ' *' { ViewPathGlob False (fmap unspan (toList $1)) ($1 # $>) }
1466
1468
| sep_by1(self_or_ident,' ::' ) ' ::' ' {' sep_byT(plist,' ,' ) ' }' { ViewPathList False (map unspan (toList $1)) $4 ($1 # $>) }
0 commit comments