authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 12:33:06+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 12:33:06+02:00
logb424cd75ab9df69f44fe47c10ded3fd25c2d27bb
treef20265bfb9229bce4f25aac0fc791a5ac0b2586b
parent22e38ffb54775c2e523665ac739f2a895d8757ad

std.zig.parser refactored call, slice and array access to be suffix op


2 files changed, 161 insertions(+), 185 deletions(-)

std/zig/ast.zig+84-99
...@@ -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;
494486
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};
528528
529pub 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
529pub const NodeIntegerLiteral = struct {599pub 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};
586656
587pub 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
614pub 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
641pub 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
672pub const NodeStringLiteral = struct {657pub const NodeStringLiteral = struct {
673 base: Node,658 base: Node,
674 token: Token,659 token: Token,
std/zig/parser.zig+77-86
...@@ -87,7 +87,7 @@ pub const Parser = struct {...@@ -87,7 +87,7 @@ pub const Parser = struct {
87 AfterOperand,87 AfterOperand,
88 InfixOp: &ast.NodeInfixOp,88 InfixOp: &ast.NodeInfixOp,
89 PrefixOp: &ast.NodePrefixOp,89 PrefixOp: &ast.NodePrefixOp,
90 SuffixOp: &ast.Node,90 SuffixOp: &ast.NodeSuffixOp,
91 SliceOrArrayAccess,91 SliceOrArrayAccess,
92 AddrOfModifiers: &ast.NodePrefixOp.AddrOfInfo,92 AddrOfModifiers: &ast.NodePrefixOp.AddrOfInfo,
93 TypeExpr: DestPtr,93 TypeExpr: DestPtr,
...@@ -602,20 +602,19 @@ pub const Parser = struct {...@@ -602,20 +602,19 @@ pub const Parser = struct {
602 } else if (token.id == Token.Id.LParen) {602 } else if (token.id == Token.Id.LParen) {
603 self.putBackToken(token);603 self.putBackToken(token);
604604
605 const node = try arena.create(ast.NodeCall);605 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
606 *node = ast.NodeCall {606 .Call = ast.NodeSuffixOp.CallInfo {
607 .base = self.initNode(ast.Node.Id.Call),607 .params = ArrayList(&ast.Node).init(arena),
608 .callee = undefined,608 .is_async = false, // TODO: ASYNC
609 .params = ArrayList(&ast.Node).init(arena),609 }
610 .rparen_token = undefined,610 });
611 };611 try stack.append(State { .SuffixOp = node });
612 try stack.append(State { .SuffixOp = &node.base });
613 try stack.append(State.AfterOperand);612 try stack.append(State.AfterOperand);
614 try stack.append(State {.ExprListItemOrEnd = &node.params });613 try stack.append(State {.ExprListItemOrEnd = &node.op.Call.params });
615 try stack.append(State {614 try stack.append(State {
616 .ExpectTokenSave = ExpectTokenSave {615 .ExpectTokenSave = ExpectTokenSave {
617 .id = Token.Id.LParen,616 .id = Token.Id.LParen,
618 .ptr = &node.rparen_token,617 .ptr = &node.rtoken,
619 },618 },
620 });619 });
621 continue;620 continue;
...@@ -643,16 +642,14 @@ pub const Parser = struct {...@@ -643,16 +642,14 @@ pub const Parser = struct {
643642
644 switch (rbracket_or_ellipsis2_token.id) {643 switch (rbracket_or_ellipsis2_token.id) {
645 Token.Id.Ellipsis2 => {644 Token.Id.Ellipsis2 => {
646 const node = try arena.create(ast.NodeSliceExpression);645 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
647 *node = ast.NodeSliceExpression {646 .Slice = ast.NodeSuffixOp.SliceRange {
648 .base = self.initNode(ast.Node.Id.SliceExpression),647 .start = expression,
649 .expr = undefined,648 .end = null,
650 .start = expression,649 }
651 .end = null,650 });
652 .rbracket_token = undefined,651
653 };652 try stack.append(State { .SuffixOp = node });
654
655 try stack.append(State { .SuffixOp = &node.base });
656 try stack.append(State.AfterOperand);653 try stack.append(State.AfterOperand);
657654
658 const rbracket_token = self.getNextToken();655 const rbracket_token = self.getNextToken();
...@@ -661,24 +658,21 @@ pub const Parser = struct {...@@ -661,24 +658,21 @@ pub const Parser = struct {
661 try stack.append(State {658 try stack.append(State {
662 .ExpectTokenSave = ExpectTokenSave {659 .ExpectTokenSave = ExpectTokenSave {
663 .id = Token.Id.RBracket,660 .id = Token.Id.RBracket,
664 .ptr = &node.rbracket_token,661 .ptr = &node.rtoken,
665 }662 }
666 });663 });
667 try stack.append(State { .Expression = DestPtr { .NullableField = &node.end } });664 try stack.append(State { .Expression = DestPtr { .NullableField = &node.op.Slice.end } });
668 } else {665 } else {
669 node.rbracket_token = rbracket_token;666 node.rtoken = rbracket_token;
670 }667 }
671 break;668 break;
672 },669 },
673 Token.Id.RBracket => {670 Token.Id.RBracket => {
674 const node = try arena.create(ast.NodeArrayAccess);671 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
675 *node = ast.NodeArrayAccess {672 .ArrayAccess = expression
676 .base = self.initNode(ast.Node.Id.ArrayAccess),673 });
677 .expr = undefined,674 node.rtoken = token;
678 .index = expression,675 try stack.append(State { .SuffixOp = node });
679 .rbracket_token = token,
680 };
681 try stack.append(State { .SuffixOp = &node.base });
682 try stack.append(State.AfterOperand);676 try stack.append(State.AfterOperand);
683 break;677 break;
684 },678 },
...@@ -950,27 +944,8 @@ pub const Parser = struct {...@@ -950,27 +944,8 @@ pub const Parser = struct {
950 while (true) {944 while (true) {
951 switch (stack.pop()) {945 switch (stack.pop()) {
952 State.SuffixOp => |suffix_op| {946 State.SuffixOp => |suffix_op| {
953 switch (suffix_op.id) {947 *left_leaf_ptr = &suffix_op.base;
954 ast.Node.Id.Call => {948 left_leaf_ptr = &suffix_op.lhs;
955 const call = @fieldParentPtr(ast.NodeCall, "base", suffix_op);
956 *left_leaf_ptr = &call.base;
957 left_leaf_ptr = &call.callee;
958 continue;
959 },
960 ast.Node.Id.ArrayAccess => {
961 const arr_access = @fieldParentPtr(ast.NodeArrayAccess, "base", suffix_op);
962 *left_leaf_ptr = &arr_access.base;
963 left_leaf_ptr = &arr_access.expr;
964 continue;
965 },
966 ast.Node.Id.SliceExpression => {
967 const slice_expr = @fieldParentPtr(ast.NodeSliceExpression, "base", suffix_op);
968 *left_leaf_ptr = &slice_expr.base;
969 left_leaf_ptr = &slice_expr.expr;
970 continue;
971 },
972 else => unreachable,
973 }
974 },949 },
975 State.Operand => |operand| {950 State.Operand => |operand| {
976 *left_leaf_ptr = operand;951 *left_leaf_ptr = operand;
...@@ -1172,6 +1147,18 @@ pub const Parser = struct {...@@ -1172,6 +1147,18 @@ pub const Parser = struct {
1172 return node;1147 return node;
1173 }1148 }
11741149
1150 fn createSuffixOp(self: &Parser, arena: &mem.Allocator, op: &const ast.NodeSuffixOp.SuffixOp) !&ast.NodeSuffixOp {
1151 const node = try arena.create(ast.NodeSuffixOp);
1152
1153 *node = ast.NodeSuffixOp {
1154 .base = self.initNode(ast.Node.Id.SuffixOp),
1155 .lhs = undefined,
1156 .op = *op,
1157 .rtoken = undefined,
1158 };
1159 return node;
1160 }
1161
1175 fn createIdentifier(self: &Parser, arena: &mem.Allocator, name_token: &const Token) !&ast.NodeIdentifier {1162 fn createIdentifier(self: &Parser, arena: &mem.Allocator, name_token: &const Token) !&ast.NodeIdentifier {
1176 const node = try arena.create(ast.NodeIdentifier);1163 const node = try arena.create(ast.NodeIdentifier);
11771164
...@@ -1625,6 +1612,43 @@ pub const Parser = struct {...@@ -1625,6 +1612,43 @@ pub const Parser = struct {
1625 ast.NodePrefixOp.PrefixOp.UnwrapMaybe => try stream.write("??"),1612 ast.NodePrefixOp.PrefixOp.UnwrapMaybe => try stream.write("??"),
1626 }1613 }
1627 },1614 },
1615 ast.Node.Id.SuffixOp => {
1616 const suffix_op = @fieldParentPtr(ast.NodeSuffixOp, "base", base);
1617
1618 switch (suffix_op.op) {
1619 ast.NodeSuffixOp.SuffixOp.Call => |call_info| {
1620 try stack.append(RenderState { .Text = ")"});
1621 var i = call_info.params.len;
1622 while (i != 0) {
1623 i -= 1;
1624 const param_node = call_info.params.at(i);
1625 try stack.append(RenderState { .Expression = param_node});
1626 if (i != 0) {
1627 try stack.append(RenderState { .Text = ", " });
1628 }
1629 }
1630 try stack.append(RenderState { .Text = "("});
1631 },
1632 ast.NodeSuffixOp.SuffixOp.ArrayAccess => |index_expr| {
1633 try stack.append(RenderState { .Text = "]"});
1634 try stack.append(RenderState { .Expression = index_expr});
1635 try stack.append(RenderState { .Text = "["});
1636 },
1637 ast.NodeSuffixOp.SuffixOp.Slice => |range| {
1638 try stack.append(RenderState { .Text = "]"});
1639 if (range.end) |end| {
1640 try stack.append(RenderState { .Expression = end});
1641 }
1642 try stack.append(RenderState { .Text = ".."});
1643 try stack.append(RenderState { .Expression = range.start});
1644 try stack.append(RenderState { .Text = "["});
1645 },
1646 ast.NodeSuffixOp.SuffixOp.StructInitializer => @panic("TODO: StructInitializer"),
1647 ast.NodeSuffixOp.SuffixOp.ArrayInitializer => @panic("TODO: ArrayInitializer"),
1648 }
1649
1650 try stack.append(RenderState { .Expression = suffix_op.lhs });
1651 },
1628 ast.Node.Id.IntegerLiteral => {1652 ast.Node.Id.IntegerLiteral => {
1629 const integer_literal = @fieldParentPtr(ast.NodeIntegerLiteral, "base", base);1653 const integer_literal = @fieldParentPtr(ast.NodeIntegerLiteral, "base", base);
1630 try stream.print("{}", self.tokenizer.getTokenSlice(integer_literal.token));1654 try stream.print("{}", self.tokenizer.getTokenSlice(integer_literal.token));
...@@ -1693,39 +1717,6 @@ pub const Parser = struct {...@@ -1693,39 +1717,6 @@ pub const Parser = struct {
1693 }1717 }
1694 }1718 }
1695 },1719 },
1696 ast.Node.Id.Call => {
1697 const call = @fieldParentPtr(ast.NodeCall, "base", base);
1698 try stack.append(RenderState { .Text = ")"});
1699 var i = call.params.len;
1700 while (i != 0) {
1701 i -= 1;
1702 const param_node = call.params.at(i);
1703 try stack.append(RenderState { .Expression = param_node});
1704 if (i != 0) {
1705 try stack.append(RenderState { .Text = ", " });
1706 }
1707 }
1708 try stack.append(RenderState { .Text = "("});
1709 try stack.append(RenderState { .Expression = call.callee });
1710 },
1711 ast.Node.Id.ArrayAccess => {
1712 const arr_access = @fieldParentPtr(ast.NodeArrayAccess, "base", base);
1713 try stack.append(RenderState { .Text = "]"});
1714 try stack.append(RenderState { .Expression = arr_access.index});
1715 try stack.append(RenderState { .Text = "["});
1716 try stack.append(RenderState { .Expression = arr_access.expr });
1717 },
1718 ast.Node.Id.SliceExpression => {
1719 const slice_expr = @fieldParentPtr(ast.NodeSliceExpression, "base", base);
1720 try stack.append(RenderState { .Text = "]"});
1721 if (slice_expr.end) |end| {
1722 try stack.append(RenderState { .Expression = end});
1723 }
1724 try stack.append(RenderState { .Text = ".."});
1725 try stack.append(RenderState { .Expression = slice_expr.start});
1726 try stack.append(RenderState { .Text = "["});
1727 try stack.append(RenderState { .Expression = slice_expr.expr});
1728 },
1729 ast.Node.Id.FnProto => @panic("TODO fn proto in an expression"),1720 ast.Node.Id.FnProto => @panic("TODO fn proto in an expression"),
1730 ast.Node.Id.LineComment => @panic("TODO render line comment in an expression"),1721 ast.Node.Id.LineComment => @panic("TODO render line comment in an expression"),
17311722