| ... | @@ -336,6 +336,42 @@ pub const Parser = struct { | ... | @@ -336,6 +336,42 @@ pub const Parser = struct { |
| 336 | try stack.append(State.ExpectOperand); | 336 | try stack.append(State.ExpectOperand); |
| 337 | continue; | 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 | Token.Id.Ampersand => { | 375 | Token.Id.Ampersand => { |
| 340 | const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{ | 376 | const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{ |
| 341 | .AddrOf = ast.NodePrefixOp.AddrOfInfo { | 377 | .AddrOf = ast.NodePrefixOp.AddrOfInfo { |
| ... | @@ -1323,12 +1359,6 @@ pub const Parser = struct { | ... | @@ -1323,12 +1359,6 @@ pub const Parser = struct { |
| 1323 | const prefix_op_node = @fieldParentPtr(ast.NodePrefixOp, "base", base); | 1359 | const prefix_op_node = @fieldParentPtr(ast.NodePrefixOp, "base", base); |
| 1324 | try stack.append(RenderState { .Expression = prefix_op_node.rhs }); | 1360 | try stack.append(RenderState { .Expression = prefix_op_node.rhs }); |
| 1325 | switch (prefix_op_node.op) { | 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 | ast.NodePrefixOp.PrefixOp.AddrOf => |addr_of_info| { | 1362 | ast.NodePrefixOp.PrefixOp.AddrOf => |addr_of_info| { |
| 1333 | try stream.write("&"); | 1363 | try stream.write("&"); |
| 1334 | if (addr_of_info.volatile_token != null) { | 1364 | if (addr_of_info.volatile_token != null) { |
| ... | @@ -1343,6 +1373,14 @@ pub const Parser = struct { | ... | @@ -1343,6 +1373,14 @@ pub const Parser = struct { |
| 1343 | try stack.append(RenderState { .Expression = align_expr}); | 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 | ast.Node.Id.IntegerLiteral => { | 1386 | ast.Node.Id.IntegerLiteral => { |
| ... | @@ -1627,7 +1665,7 @@ test "zig fmt" { | ... | @@ -1627,7 +1665,7 @@ test "zig fmt" { |
| 1627 | ); | 1665 | ); |
| 1628 | | 1666 | |
| 1629 | try testCanonical( | 1667 | try testCanonical( |
| 1630 | \\test "operators" { | 1668 | \\test "infix operators" { |
| 1631 | \\ var i = undefined; | 1669 | \\ var i = undefined; |
| 1632 | \\ i = 2; | 1670 | \\ i = 2; |
| 1633 | \\ i *= 2; | 1671 | \\ i *= 2; |
| ... | @@ -1676,6 +1714,13 @@ test "zig fmt" { | ... | @@ -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 | try testCanonical( | 1724 | try testCanonical( |
| 1680 | \\test "test calls" { | 1725 | \\test "test calls" { |
| 1681 | \\ a(); | 1726 | \\ a(); |