@@ -140,26 +140,31 @@ FnReturn: Ty = {
140
140
};
141
141
142
142
FnDefn: FnDefn = {
143
- <abi:FnAbi?> "fn" <n:Id> <p:Angle<VariableKind>>"(" <args:FnArgs> ")"
143
+ <safety:Safety?> < abi:FnAbi?> "fn" <n:Id> <p:Angle<VariableKind>>"(" <args:FnArgs> ")"
144
144
<ret_ty:FnReturn?> <w:QuantifiedWhereClauses> ";" => FnDefn
145
145
{
146
146
name: n,
147
147
variable_kinds: p,
148
148
where_clauses: w,
149
- argument_types: args,
149
+ variadic: args.is_variadic(),
150
+ argument_types: args.to_tys(),
150
151
return_type: ret_ty.unwrap_or_else(|| Ty::Tuple { types: Vec::new() }),
151
152
abi: abi.unwrap_or_default(),
153
+ safety: safety.unwrap_or_default(),
152
154
}
153
155
};
154
156
155
157
FnAbi: FnAbi = "extern" "\"" <id:Id> "\"" => FnAbi(id.str);
156
158
157
- FnArg: Ty = {
158
- Id ":" <arg_ty: Ty> => arg_ty
159
+ FnArg: FnArg = {
160
+ Id ":" "..." => FnArg::Variadic,
161
+ Id ":" <arg_ty: Ty> => FnArg::NonVariadic(arg_ty),
159
162
};
160
163
161
- FnArgs: Vec<Ty> = {
162
- <Comma<FnArg>>
164
+ FnArgs: FnArgs = {
165
+ <Comma<FnArg>> =>? FnArgs::from_vec(<>).map_err(|e| lalrpop_util::ParseError::User {
166
+ error: e,
167
+ })
163
168
};
164
169
165
170
ClosureDefn: ClosureDefn = {
@@ -181,7 +186,7 @@ ClosureSelf: ClosureKind = {
181
186
}
182
187
183
188
ClosureArgs: Vec<Ty> = {
184
- "," <args:FnArgs> => args,
189
+ "," <args:FnArgs> => args.to_tys() ,
185
190
}
186
191
187
192
TraitDefn: TraitDefn = {
@@ -313,13 +318,32 @@ pub Ty: Ty = {
313
318
TyWithoutId,
314
319
};
315
320
321
+ Safety: Safety = {
322
+ "unsafe" => Safety::Unsafe,
323
+ };
324
+
325
+ FnArgTy: FnArg = {
326
+ "..." => FnArg::Variadic,
327
+ <arg_ty: Ty> => FnArg::NonVariadic(arg_ty),
328
+ };
329
+
330
+ FnArgTys: FnArgs = {
331
+ <Comma<FnArgTy>> =>? FnArgs::from_vec(<>).map_err(|e| lalrpop_util::ParseError::User {
332
+ error: e,
333
+ })
334
+ };
335
+
316
336
TyWithoutId: Ty = {
317
- <l:ForLifetimes?> "fn" "(" <types:Comma<Ty> > ")" <ret_ty:FnReturn?> => Ty::ForAll {
337
+ <l:ForLifetimes?> <safety:Safety?> <abi:FnAbi?> "fn" "(" <types:FnArgTys > ")" <ret_ty:FnReturn?> => Ty::ForAll {
318
338
lifetime_names: l.unwrap_or_default(),
339
+ variadic: types.is_variadic(),
319
340
types: types
341
+ .to_tys()
320
342
.into_iter()
321
343
.chain(std::iter::once(ret_ty.unwrap_or_else(|| Ty::Tuple { types: Vec::new() })))
322
- .map(Box::new).collect()
344
+ .map(Box::new).collect(),
345
+ safety: safety.unwrap_or_default(),
346
+ abi: abi.unwrap_or_default(),
323
347
},
324
348
<ScalarType> => Ty::Scalar { ty: <> },
325
349
"str" => Ty::Str,
0 commit comments