| ... | @@ -17,6 +17,7 @@ pub const Node = struct { | ... | @@ -17,6 +17,7 @@ pub const Node = struct { |
| 17 | Block, | 17 | Block, |
| 18 | InfixOp, | 18 | InfixOp, |
| 19 | PrefixOp, | 19 | PrefixOp, |
| | 20 | SuffixOp, |
| 20 | IntegerLiteral, | 21 | IntegerLiteral, |
| 21 | FloatLiteral, | 22 | FloatLiteral, |
| 22 | StringLiteral, | 23 | StringLiteral, |
| ... | @@ -29,9 +30,6 @@ pub const Node = struct { | ... | @@ -29,9 +30,6 @@ pub const Node = struct { |
| 29 | Unreachable, | 30 | Unreachable, |
| 30 | ErrorType, | 31 | ErrorType, |
| 31 | BuiltinCall, | 32 | BuiltinCall, |
| 32 | Call, | | |
| 33 | ArrayAccess, | | |
| 34 | SliceExpression, | | |
| 35 | LineComment, | 33 | LineComment, |
| 36 | TestDecl, | 34 | TestDecl, |
| 37 | }; | 35 | }; |
| ... | @@ -46,6 +44,7 @@ pub const Node = struct { | ... | @@ -46,6 +44,7 @@ pub const Node = struct { |
| 46 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index), | 44 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index), |
| 47 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index), | 45 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index), |
| 48 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index), | 46 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index), |
| | 47 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index), |
| 49 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index), | 48 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index), |
| 50 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index), | 49 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index), |
| 51 | Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index), | 50 | Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index), |
| ... | @@ -58,9 +57,6 @@ pub const Node = struct { | ... | @@ -58,9 +57,6 @@ pub const Node = struct { |
| 58 | Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index), | 57 | Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index), |
| 59 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index), | 58 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index), |
| 60 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index), | 59 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index), |
| 61 | Id.Call => @fieldParentPtr(NodeCall, "base", base).iterate(index), | | |
| 62 | Id.ArrayAccess => @fieldParentPtr(NodeArrayAccess, "base", base).iterate(index), | | |
| 63 | Id.SliceExpression => @fieldParentPtr(NodeSliceExpression, "base", base).iterate(index), | | |
| 64 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index), | 60 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index), |
| 65 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index), | 61 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index), |
| 66 | }; | 62 | }; |
| ... | @@ -76,6 +72,7 @@ pub const Node = struct { | ... | @@ -76,6 +72,7 @@ pub const Node = struct { |
| 76 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(), | 72 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(), |
| 77 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(), | 73 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(), |
| 78 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(), | 74 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(), |
| | 75 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(), |
| 79 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(), | 76 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(), |
| 80 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(), | 77 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(), |
| 81 | Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).firstToken(), | 78 | Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).firstToken(), |
| ... | @@ -88,9 +85,6 @@ pub const Node = struct { | ... | @@ -88,9 +85,6 @@ pub const Node = struct { |
| 88 | Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).firstToken(), | 85 | Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).firstToken(), |
| 89 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(), | 86 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(), |
| 90 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(), | 87 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(), |
| 91 | Id.Call => @fieldParentPtr(NodeCall, "base", base).firstToken(), | | |
| 92 | Id.ArrayAccess => @fieldParentPtr(NodeArrayAccess, "base", base).firstToken(), | | |
| 93 | Id.SliceExpression => @fieldParentPtr(NodeSliceExpression, "base", base).firstToken(), | | |
| 94 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(), | 88 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(), |
| 95 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(), | 89 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(), |
| 96 | }; | 90 | }; |
| ... | @@ -106,6 +100,7 @@ pub const Node = struct { | ... | @@ -106,6 +100,7 @@ pub const Node = struct { |
| 106 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(), | 100 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(), |
| 107 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(), | 101 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(), |
| 108 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(), | 102 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(), |
| | 103 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(), |
| 109 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(), | 104 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(), |
| 110 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(), | 105 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(), |
| 111 | Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).lastToken(), | 106 | Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).lastToken(), |
| ... | @@ -118,9 +113,6 @@ pub const Node = struct { | ... | @@ -118,9 +113,6 @@ pub const Node = struct { |
| 118 | Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(), | 113 | Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(), |
| 119 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(), | 114 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(), |
| 120 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(), | 115 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(), |
| 121 | Id.Call => @fieldParentPtr(NodeCall, "base", base).lastToken(), | | |
| 122 | Id.ArrayAccess => @fieldParentPtr(NodeArrayAccess, "base", base).lastToken(), | | |
| 123 | Id.SliceExpression => @fieldParentPtr(NodeSliceExpression, "base", base).lastToken(), | | |
| 124 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(), | 116 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(), |
| 125 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(), | 117 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(), |
| 126 | }; | 118 | }; |
| ... | @@ -493,20 +485,28 @@ pub const NodePrefixOp = struct { | ... | @@ -493,20 +485,28 @@ pub const NodePrefixOp = struct { |
| 493 | var i = index; | 485 | var i = index; |
| 494 | | 486 | |
| 495 | switch (self.op) { | 487 | switch (self.op) { |
| | 488 | PrefixOp.SliceType => |addr_of_info| { |
| | 489 | if (addr_of_info.align_expr) |align_expr| { |
| | 490 | if (i < 1) return align_expr; |
| | 491 | i -= 1; |
| | 492 | } |
| | 493 | }, |
| 496 | PrefixOp.AddrOf => |addr_of_info| { | 494 | PrefixOp.AddrOf => |addr_of_info| { |
| 497 | if (addr_of_info.align_expr) |align_expr| { | 495 | if (addr_of_info.align_expr) |align_expr| { |
| 498 | if (i < 1) return align_expr; | 496 | if (i < 1) return align_expr; |
| 499 | i -= 1; | 497 | i -= 1; |
| 500 | } | 498 | } |
| 501 | }, | 499 | }, |
| | 500 | PrefixOp.ArrayType => |size_expr| { |
| | 501 | if (i < 1) return size_expr; |
| | 502 | i -= 1; |
| | 503 | }, |
| 502 | PrefixOp.BitNot, | 504 | PrefixOp.BitNot, |
| 503 | PrefixOp.BoolNot, | 505 | PrefixOp.BoolNot, |
| 504 | PrefixOp.Deref, | 506 | PrefixOp.Deref, |
| 505 | PrefixOp.Negation, | 507 | PrefixOp.Negation, |
| 506 | PrefixOp.NegationWrap, | 508 | PrefixOp.NegationWrap, |
| 507 | PrefixOp.Return, | 509 | PrefixOp.Return, |
| 508 | PrefixOp.ArrayType, | | |
| 509 | PrefixOp.SliceType, | | |
| 510 | PrefixOp.Try, | 510 | PrefixOp.Try, |
| 511 | PrefixOp.UnwrapMaybe => {}, | 511 | PrefixOp.UnwrapMaybe => {}, |
| 512 | } | 512 | } |
| ... | @@ -526,6 +526,76 @@ pub const NodePrefixOp = struct { | ... | @@ -526,6 +526,76 @@ pub const NodePrefixOp = struct { |
| 526 | } | 526 | } |
| 527 | }; | 527 | }; |
| 528 | | 528 | |
| | 529 | pub const NodeSuffixOp = struct { |
| | 530 | base: Node, |
| | 531 | lhs: &Node, |
| | 532 | op: SuffixOp, |
| | 533 | rtoken: Token, |
| | 534 | |
| | 535 | const SuffixOp = union(enum) { |
| | 536 | Call: CallInfo, |
| | 537 | ArrayAccess: &Node, |
| | 538 | Slice: SliceRange, |
| | 539 | ArrayInitializer: ArrayList(&Node), |
| | 540 | StructInitializer: ArrayList(&Node), |
| | 541 | }; |
| | 542 | |
| | 543 | const CallInfo = struct { |
| | 544 | params: ArrayList(&Node), |
| | 545 | is_async: bool, |
| | 546 | }; |
| | 547 | |
| | 548 | const SliceRange = struct { |
| | 549 | start: &Node, |
| | 550 | end: ?&Node, |
| | 551 | }; |
| | 552 | |
| | 553 | pub fn iterate(self: &NodeSuffixOp, index: usize) ?&Node { |
| | 554 | var i = index; |
| | 555 | |
| | 556 | if (i < 1) return self.lhs; |
| | 557 | i -= 1; |
| | 558 | |
| | 559 | switch (self.op) { |
| | 560 | SuffixOp.Call => |call_info| { |
| | 561 | if (i < call_info.params.len) return call_info.params.at(i); |
| | 562 | i -= call_info.params.len; |
| | 563 | }, |
| | 564 | SuffixOp.ArrayAccess => |index_expr| { |
| | 565 | if (i < 1) return index_expr; |
| | 566 | i -= 1; |
| | 567 | }, |
| | 568 | SuffixOp.Slice => |range| { |
| | 569 | if (i < 1) return range.start; |
| | 570 | i -= 1; |
| | 571 | |
| | 572 | if (range.end) |end| { |
| | 573 | if (i < 1) return end; |
| | 574 | i -= 1; |
| | 575 | } |
| | 576 | }, |
| | 577 | SuffixOp.ArrayInitializer => |exprs| { |
| | 578 | if (i < exprs.len) return exprs.at(i); |
| | 579 | i -= exprs.len; |
| | 580 | }, |
| | 581 | SuffixOp.StructInitializer => |fields| { |
| | 582 | if (i < fields.len) return fields.at(i); |
| | 583 | i -= fields.len; |
| | 584 | }, |
| | 585 | } |
| | 586 | |
| | 587 | return null; |
| | 588 | } |
| | 589 | |
| | 590 | pub fn firstToken(self: &NodeSuffixOp) Token { |
| | 591 | return self.lhs.firstToken(); |
| | 592 | } |
| | 593 | |
| | 594 | pub fn lastToken(self: &NodeSuffixOp) Token { |
| | 595 | return self.rtoken; |
| | 596 | } |
| | 597 | }; |
| | 598 | |
| 529 | pub const NodeIntegerLiteral = struct { | 599 | pub const NodeIntegerLiteral = struct { |
| 530 | base: Node, | 600 | base: Node, |
| 531 | token: Token, | 601 | token: Token, |
| ... | @@ -584,91 +654,6 @@ pub const NodeBuiltinCall = struct { | ... | @@ -584,91 +654,6 @@ pub const NodeBuiltinCall = struct { |
| 584 | } | 654 | } |
| 585 | }; | 655 | }; |
| 586 | | 656 | |
| 587 | pub const NodeCall = struct { | | |
| 588 | base: Node, | | |
| 589 | callee: &Node, | | |
| 590 | params: ArrayList(&Node), | | |
| 591 | rparen_token: Token, | | |
| 592 | | | |
| 593 | pub fn iterate(self: &NodeCall, index: usize) ?&Node { | | |
| 594 | var i = index; | | |
| 595 | | | |
| 596 | if (i < 1) return self.callee; | | |
| 597 | i -= 1; | | |
| 598 | | | |
| 599 | if (i < self.params.len) return self.params.at(i); | | |
| 600 | i -= self.params.len; | | |
| 601 | | | |
| 602 | return null; | | |
| 603 | } | | |
| 604 | | | |
| 605 | pub fn firstToken(self: &NodeCall) Token { | | |
| 606 | return self.callee.firstToken(); | | |
| 607 | } | | |
| 608 | | | |
| 609 | pub fn lastToken(self: &NodeCall) Token { | | |
| 610 | return self.rparen_token; | | |
| 611 | } | | |
| 612 | }; | | |
| 613 | | | |
| 614 | pub const NodeArrayAccess = struct { | | |
| 615 | base: Node, | | |
| 616 | expr: &Node, | | |
| 617 | index: &Node, | | |
| 618 | rbracket_token: Token, | | |
| 619 | | | |
| 620 | pub fn iterate(self: &NodeArrayAccess, index: usize) ?&Node { | | |
| 621 | var i = index; | | |
| 622 | | | |
| 623 | if (i < 1) return self.expr; | | |
| 624 | i -= 1; | | |
| 625 | | | |
| 626 | if (i < 1) return self.index; | | |
| 627 | i -= 1; | | |
| 628 | | | |
| 629 | return null; | | |
| 630 | } | | |
| 631 | | | |
| 632 | pub fn firstToken(self: &NodeArrayAccess) Token { | | |
| 633 | return self.expr.firstToken(); | | |
| 634 | } | | |
| 635 | | | |
| 636 | pub fn lastToken(self: &NodeArrayAccess) Token { | | |
| 637 | return self.rbracket_token; | | |
| 638 | } | | |
| 639 | }; | | |
| 640 | | | |
| 641 | pub const NodeSliceExpression = struct { | | |
| 642 | base: Node, | | |
| 643 | expr: &Node, | | |
| 644 | start: &Node, | | |
| 645 | end: ?&Node, | | |
| 646 | rbracket_token: Token, | | |
| 647 | | | |
| 648 | pub fn iterate(self: &NodeSliceExpression, index: usize) ?&Node { | | |
| 649 | var i = index; | | |
| 650 | | | |
| 651 | if (i < 1) return self.callee; | | |
| 652 | i -= 1; | | |
| 653 | | | |
| 654 | if (i < 1) return self.start; | | |
| 655 | i -= 1; | | |
| 656 | | | |
| 657 | if (i < 1) return self.end; | | |
| 658 | i -= 1; | | |
| 659 | | | |
| 660 | return null; | | |
| 661 | } | | |
| 662 | | | |
| 663 | pub fn firstToken(self: &NodeSliceExpression) Token { | | |
| 664 | return self.expr.firstToken(); | | |
| 665 | } | | |
| 666 | | | |
| 667 | pub fn lastToken(self: &NodeSliceExpression) Token { | | |
| 668 | return self.rbracket_token; | | |
| 669 | } | | |
| 670 | }; | | |
| 671 | | | |
| 672 | pub const NodeStringLiteral = struct { | 657 | pub const NodeStringLiteral = struct { |
| 673 | base: Node, | 658 | base: Node, |
| 674 | token: Token, | 659 | token: Token, |