@@ -16,94 +16,90 @@ use crate::rust::FormalityLang as Rust;
16
16
// Implement custom parsing for rigid types.
17
17
impl CoreParse < Rust > for RigidTy {
18
18
fn parse < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Self > {
19
- let mut parser: Parser < ' _ , ' _ , RigidTy , Rust > = Parser :: new ( scope, text, "AliasTy" ) ;
20
-
21
- // Parse a `ScalarId` (and upcast it to `RigidTy`) with the highest
22
- // precedence. If someone writes `u8`, we always interpret it as a
23
- // scalar-id.
24
- parser. parse_variant_cast :: < ScalarId > ( 1 ) ;
25
-
26
- // Parse something like `Id<...>` as an ADT.
27
- parser. parse_variant ( "Adt" , 0 , |p| {
28
- let name: AdtId = p. nonterminal ( ) ?;
29
- let parameters: Vec < Parameter > = parse_parameters ( p) ?;
30
- Ok ( RigidTy {
31
- name : name. upcast ( ) ,
32
- parameters,
33
- } )
34
- } ) ;
35
-
36
- // Parse `&`
37
- parser. parse_variant ( "Ref" , 0 , |p| {
38
- p. expect_char ( '&' ) ?;
39
- let lt: Lt = p. nonterminal ( ) ?;
40
- let ty: Ty = p. nonterminal ( ) ?;
41
- Ok ( RigidTy {
42
- name : RigidName :: Ref ( RefKind :: Shared ) ,
43
- parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
44
- }
45
- . upcast ( ) )
46
- } ) ;
47
-
48
- parser. parse_variant ( "RefMut" , 0 , |p| {
49
- p. expect_char ( '&' ) ?;
50
- p. expect_keyword ( "mut" ) ?;
51
- let lt: Lt = p. nonterminal ( ) ?;
52
- let ty: Ty = p. nonterminal ( ) ?;
53
- Ok ( RigidTy {
54
- name : RigidName :: Ref ( RefKind :: Mut ) ,
55
- parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
56
- } )
57
- } ) ;
58
-
59
- parser. parse_variant ( "Tuple" , 0 , |p| {
60
- p. expect_char ( '(' ) ?;
61
- p. reject_custom_keywords ( & [ "alias" , "rigid" , "predicate" ] ) ?;
62
- let types: Vec < Ty > = p. comma_nonterminal ( ) ?;
63
- p. expect_char ( ')' ) ?;
64
- let name = RigidName :: Tuple ( types. len ( ) ) ;
65
- Ok ( RigidTy {
66
- name,
67
- parameters : types. upcast ( ) ,
68
- } )
69
- } ) ;
70
-
71
- parser. finish ( )
19
+ Parser :: multi_variant ( scope, text, "AliasTy" , |parser| {
20
+ // Parse a `ScalarId` (and upcast it to `RigidTy`) with the highest
21
+ // precedence. If someone writes `u8`, we always interpret it as a
22
+ // scalar-id.
23
+ parser. parse_variant_cast :: < ScalarId > ( 1 ) ;
24
+
25
+ // Parse something like `Id<...>` as an ADT.
26
+ parser. parse_variant ( "Adt" , 0 , |p| {
27
+ let name: AdtId = p. nonterminal ( ) ?;
28
+ let parameters: Vec < Parameter > = parse_parameters ( p) ?;
29
+ Ok ( RigidTy {
30
+ name : name. upcast ( ) ,
31
+ parameters,
32
+ } )
33
+ } ) ;
34
+
35
+ // Parse `&`
36
+ parser. parse_variant ( "Ref" , 0 , |p| {
37
+ p. expect_char ( '&' ) ?;
38
+ let lt: Lt = p. nonterminal ( ) ?;
39
+ let ty: Ty = p. nonterminal ( ) ?;
40
+ Ok ( RigidTy {
41
+ name : RigidName :: Ref ( RefKind :: Shared ) ,
42
+ parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
43
+ }
44
+ . upcast ( ) )
45
+ } ) ;
46
+
47
+ parser. parse_variant ( "RefMut" , 0 , |p| {
48
+ p. expect_char ( '&' ) ?;
49
+ p. expect_keyword ( "mut" ) ?;
50
+ let lt: Lt = p. nonterminal ( ) ?;
51
+ let ty: Ty = p. nonterminal ( ) ?;
52
+ Ok ( RigidTy {
53
+ name : RigidName :: Ref ( RefKind :: Mut ) ,
54
+ parameters : seq ! [ lt. upcast( ) , ty. upcast( ) ] ,
55
+ } )
56
+ } ) ;
57
+
58
+ parser. parse_variant ( "Tuple" , 0 , |p| {
59
+ p. expect_char ( '(' ) ?;
60
+ p. reject_custom_keywords ( & [ "alias" , "rigid" , "predicate" ] ) ?;
61
+ let types: Vec < Ty > = p. comma_nonterminal ( ) ?;
62
+ p. expect_char ( ')' ) ?;
63
+ let name = RigidName :: Tuple ( types. len ( ) ) ;
64
+ Ok ( RigidTy {
65
+ name,
66
+ parameters : types. upcast ( ) ,
67
+ } )
68
+ } ) ;
69
+ } )
72
70
}
73
71
}
74
72
// ANCHOR_END: RigidTy_impl
75
73
76
74
impl CoreParse < Rust > for AliasTy {
77
75
fn parse < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Self > {
78
- let mut parser: Parser < ' _ , ' _ , AliasTy , Rust > = Parser :: new ( scope, text, "AliasTy" ) ;
79
-
80
- parser. parse_variant ( "associated type" , 0 , |p| {
81
- p. expect_char ( '<' ) ?;
82
- let ty0: Ty = p. nonterminal ( ) ?;
83
- let ( ) = p. expect_keyword ( "as" ) ?;
84
- let trait_id: TraitId = p. nonterminal ( ) ?;
85
- let trait_parameters1 = parse_parameters ( p) ?;
86
- p. expect_char ( '>' ) ?;
87
- p. expect_char ( ':' ) ?;
88
- p. expect_char ( ':' ) ?;
89
- let item_id: AssociatedItemId = p. nonterminal ( ) ?;
90
- let item_parameters = parse_parameters ( p) ?;
91
- let name = AssociatedTyName {
92
- trait_id,
93
- item_id,
94
- item_arity : item_parameters. len ( ) ,
95
- } ;
96
- let parameters: Vec < Parameter > = std:: iter:: once ( ty0. upcast ( ) )
97
- . chain ( trait_parameters1)
98
- . chain ( item_parameters)
99
- . collect ( ) ;
100
- Ok ( AliasTy {
101
- name : name. upcast ( ) ,
102
- parameters,
103
- } )
104
- } ) ;
105
-
106
- parser. finish ( )
76
+ Parser :: multi_variant ( scope, text, "AliasTy" , |parser| {
77
+ parser. parse_variant ( "associated type" , 0 , |p| {
78
+ p. expect_char ( '<' ) ?;
79
+ let ty0: Ty = p. nonterminal ( ) ?;
80
+ let ( ) = p. expect_keyword ( "as" ) ?;
81
+ let trait_id: TraitId = p. nonterminal ( ) ?;
82
+ let trait_parameters1 = parse_parameters ( p) ?;
83
+ p. expect_char ( '>' ) ?;
84
+ p. expect_char ( ':' ) ?;
85
+ p. expect_char ( ':' ) ?;
86
+ let item_id: AssociatedItemId = p. nonterminal ( ) ?;
87
+ let item_parameters = parse_parameters ( p) ?;
88
+ let name = AssociatedTyName {
89
+ trait_id,
90
+ item_id,
91
+ item_arity : item_parameters. len ( ) ,
92
+ } ;
93
+ let parameters: Vec < Parameter > = std:: iter:: once ( ty0. upcast ( ) )
94
+ . chain ( trait_parameters1)
95
+ . chain ( item_parameters)
96
+ . collect ( ) ;
97
+ Ok ( AliasTy {
98
+ name : name. upcast ( ) ,
99
+ parameters,
100
+ } )
101
+ } ) ;
102
+ } )
107
103
}
108
104
}
109
105
@@ -122,19 +118,17 @@ fn parse_parameters<'t>(
122
118
// writing tests so much more pleasant.
123
119
impl CoreParse < Rust > for ConstData {
124
120
fn parse < ' t > ( scope : & Scope < Rust > , text : & ' t str ) -> ParseResult < ' t , Self > {
125
- let mut parser: Parser < ' _ , ' _ , ConstData , Rust > = Parser :: new ( scope, text, "Ty" ) ;
126
-
127
- parser. parse_variant ( "Variable" , 1 , |p| p. variable ( ) ) ;
128
-
129
- parser. parse_variant_cast :: < Bool > ( 1 ) ;
130
-
131
- parser. parse_variant ( "Int" , 0 , |p| {
132
- let n: u128 = p. number ( ) ?;
133
- p. expect_char ( '_' ) ?;
134
- let ty: Ty = p. nonterminal ( ) ?;
135
- Ok ( ConstData :: Value ( Scalar :: new ( n) . upcast ( ) , ty) )
136
- } ) ;
137
-
138
- parser. finish ( )
121
+ Parser :: multi_variant ( scope, text, "ConstData" , |parser| {
122
+ parser. parse_variant ( "Variable" , 1 , |p| p. variable ( ) ) ;
123
+
124
+ parser. parse_variant_cast :: < Bool > ( 1 ) ;
125
+
126
+ parser. parse_variant ( "Int" , 0 , |p| {
127
+ let n: u128 = p. number ( ) ?;
128
+ p. expect_char ( '_' ) ?;
129
+ let ty: Ty = p. nonterminal ( ) ?;
130
+ Ok ( ConstData :: Value ( Scalar :: new ( n) . upcast ( ) , ty) )
131
+ } ) ;
132
+ } )
139
133
}
140
134
}
0 commit comments