| ... | ... | @@ -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(); |