@@ -336,6 +336,42 @@ pub const Parser = struct {
336
336
try stack .append (State .ExpectOperand );
337
337
continue ;
338
338
},
339
+ Token .Id .Minus = > {
340
+ try stack .append (State { .PrefixOp = try self .createPrefixOp (arena , token ,
341
+ ast .NodePrefixOp .PrefixOp .Negation ) });
342
+ try stack .append (State .ExpectOperand );
343
+ continue ;
344
+ },
345
+ Token .Id .MinusPercent = > {
346
+ try stack .append (State { .PrefixOp = try self .createPrefixOp (arena , token ,
347
+ ast .NodePrefixOp .PrefixOp .NegationWrap ) });
348
+ try stack .append (State .ExpectOperand );
349
+ continue ;
350
+ },
351
+ Token .Id .Tilde = > {
352
+ try stack .append (State { .PrefixOp = try self .createPrefixOp (arena , token ,
353
+ ast .NodePrefixOp .PrefixOp .BitNot ) });
354
+ try stack .append (State .ExpectOperand );
355
+ continue ;
356
+ },
357
+ Token .Id .QuestionMarkQuestionMark = > {
358
+ try stack .append (State { .PrefixOp = try self .createPrefixOp (arena , token ,
359
+ ast .NodePrefixOp .PrefixOp .UnwrapMaybe ) });
360
+ try stack .append (State .ExpectOperand );
361
+ continue ;
362
+ },
363
+ Token .Id .Bang = > {
364
+ try stack .append (State { .PrefixOp = try self .createPrefixOp (arena , token ,
365
+ ast .NodePrefixOp .PrefixOp .BoolNot ) });
366
+ try stack .append (State .ExpectOperand );
367
+ continue ;
368
+ },
369
+ Token .Id .Asterisk = > {
370
+ try stack .append (State { .PrefixOp = try self .createPrefixOp (arena , token ,
371
+ ast .NodePrefixOp .PrefixOp .Deref ) });
372
+ try stack .append (State .ExpectOperand );
373
+ continue ;
374
+ },
339
375
Token .Id .Ampersand = > {
340
376
const prefix_op = try self .createPrefixOp (arena , token , ast.NodePrefixOp.PrefixOp {
341
377
.AddrOf = ast.NodePrefixOp.AddrOfInfo {
@@ -1323,12 +1359,6 @@ pub const Parser = struct {
1323
1359
const prefix_op_node = @fieldParentPtr (ast .NodePrefixOp , "base" , base );
1324
1360
try stack .append (RenderState { .Expression = prefix_op_node .rhs });
1325
1361
switch (prefix_op_node .op ) {
1326
- ast .NodePrefixOp .PrefixOp .Return = > {
1327
- try stream .write ("return " );
1328
- },
1329
- ast .NodePrefixOp .PrefixOp .Try = > {
1330
- try stream .write ("try " );
1331
- },
1332
1362
ast .NodePrefixOp .PrefixOp .AddrOf = > | addr_of_info | {
1333
1363
try stream .write ("&" );
1334
1364
if (addr_of_info .volatile_token != null ) {
@@ -1343,6 +1373,14 @@ pub const Parser = struct {
1343
1373
try stack .append (RenderState { .Expression = align_expr });
1344
1374
}
1345
1375
},
1376
+ ast .NodePrefixOp .PrefixOp .BitNot = > try stream .write ("~" ),
1377
+ ast .NodePrefixOp .PrefixOp .BoolNot = > try stream .write ("!" ),
1378
+ ast .NodePrefixOp .PrefixOp .Deref = > try stream .write ("*" ),
1379
+ ast .NodePrefixOp .PrefixOp .Negation = > try stream .write ("-" ),
1380
+ ast .NodePrefixOp .PrefixOp .NegationWrap = > try stream .write ("-%" ),
1381
+ ast .NodePrefixOp .PrefixOp .Return = > try stream .write ("return " ),
1382
+ ast .NodePrefixOp .PrefixOp .Try = > try stream .write ("try " ),
1383
+ ast .NodePrefixOp .PrefixOp .UnwrapMaybe = > try stream .write ("??" ),
1346
1384
}
1347
1385
},
1348
1386
ast .Node .Id .IntegerLiteral = > {
@@ -1627,7 +1665,7 @@ test "zig fmt" {
1627
1665
);
1628
1666
1629
1667
try testCanonical (
1630
- \\test "operators" {
1668
+ \\test "infix operators" {
1631
1669
\\ var i = undefined;
1632
1670
\\ i = 2;
1633
1671
\\ i *= 2;
@@ -1676,6 +1714,13 @@ test "zig fmt" {
1676
1714
\\
1677
1715
);
1678
1716
1717
+ try testCanonical (
1718
+ \\test "prefix operators" {
1719
+ \\ --%~??!*&0;
1720
+ \\}
1721
+ \\
1722
+ );
1723
+
1679
1724
try testCanonical (
1680
1725
\\test "test calls" {
1681
1726
\\ a();
0 commit comments