1
+ use crate :: grammar:: types:: type_;
2
+
1
3
use super :: * ;
2
4
3
5
// test expr_literals
@@ -73,6 +75,9 @@ pub(super) fn atom_expr(
73
75
if let Some ( m) = literal ( p) {
74
76
return Some ( ( m, BlockLike :: NotBlock ) ) ;
75
77
}
78
+ if p. at_contextual_kw ( T ! [ builtin] ) && p. nth_at ( 1 , T ! [ #] ) {
79
+ return Some ( ( builtin_expr ( p) ?, BlockLike :: NotBlock ) ) ;
80
+ }
76
81
if paths:: is_path_start ( p) {
77
82
return Some ( path_expr ( p, r) ) ;
78
83
}
@@ -93,7 +98,6 @@ pub(super) fn atom_expr(
93
98
m. complete ( p, UNDERSCORE_EXPR )
94
99
}
95
100
T ! [ loop ] => loop_expr ( p, None ) ,
96
- T ! [ box] => box_expr ( p, None ) ,
97
101
T ! [ while ] => while_expr ( p, None ) ,
98
102
T ! [ try] => try_block_expr ( p, None ) ,
99
103
T ! [ match ] => match_expr ( p) ,
@@ -212,6 +216,38 @@ fn tuple_expr(p: &mut Parser<'_>) -> CompletedMarker {
212
216
m. complete ( p, if saw_expr && !saw_comma { PAREN_EXPR } else { TUPLE_EXPR } )
213
217
}
214
218
219
+ // test builtin_expr
220
+ // fn foo() {
221
+ // builtin#asm(0);
222
+ // builtin#format_args(0);
223
+ // builtin#builtin(0);
224
+ // }
225
+ fn builtin_expr ( p : & mut Parser < ' _ > ) -> Option < CompletedMarker > {
226
+ let m = p. start ( ) ;
227
+ p. bump_remap ( T ! [ builtin] ) ;
228
+ p. bump ( T ! [ #] ) ;
229
+ if p. at_contextual_kw ( T ! [ offset_of] ) {
230
+ p. expect ( T ! [ '(' ] ) ;
231
+ type_ ( p) ;
232
+ p. bump ( T ! [ , ] ) ;
233
+ p. expect ( T ! [ ')' ] ) ;
234
+ Some ( m. complete ( p, OFFSET_OF_EXPR ) )
235
+ } else if p. at_contextual_kw ( T ! [ format_args] ) {
236
+ p. expect ( T ! [ '(' ] ) ;
237
+ expr ( p) ;
238
+ p. expect ( T ! [ ')' ] ) ;
239
+ Some ( m. complete ( p, FORMAT_ARGS_EXPR ) )
240
+ } else if p. at_contextual_kw ( T ! [ asm] ) {
241
+ p. expect ( T ! [ '(' ] ) ;
242
+ expr ( p) ;
243
+ p. expect ( T ! [ ')' ] ) ;
244
+ Some ( m. complete ( p, ASM_EXPR ) )
245
+ } else {
246
+ m. abandon ( p) ;
247
+ None
248
+ }
249
+ }
250
+
215
251
// test array_expr
216
252
// fn foo() {
217
253
// [];
@@ -662,19 +698,3 @@ fn try_block_expr(p: &mut Parser<'_>, m: Option<Marker>) -> CompletedMarker {
662
698
}
663
699
m. complete ( p, BLOCK_EXPR )
664
700
}
665
-
666
- // test box_expr
667
- // fn foo() {
668
- // let x = box 1i32;
669
- // let y = (box 1i32, box 2i32);
670
- // let z = Foo(box 1i32, box 2i32);
671
- // }
672
- fn box_expr ( p : & mut Parser < ' _ > , m : Option < Marker > ) -> CompletedMarker {
673
- assert ! ( p. at( T ![ box] ) ) ;
674
- let m = m. unwrap_or_else ( || p. start ( ) ) ;
675
- p. bump ( T ! [ box] ) ;
676
- if p. at_ts ( EXPR_FIRST ) {
677
- expr ( p) ;
678
- }
679
- m. complete ( p, BOX_EXPR )
680
- }
0 commit comments