| ... | @@ -20,6 +20,7 @@ pub const Node = struct { | ... | @@ -20,6 +20,7 @@ pub const Node = struct { |
| 20 | FnProto, | 20 | FnProto, |
| 21 | ParamDecl, | 21 | ParamDecl, |
| 22 | Block, | 22 | Block, |
| | 23 | Defer, |
| 23 | ErrorPayload, | 24 | ErrorPayload, |
| 24 | ValuePayload, | 25 | ValuePayload, |
| 25 | ValueIndexPayload, | 26 | ValueIndexPayload, |
| ... | @@ -65,6 +66,7 @@ pub const Node = struct { | ... | @@ -65,6 +66,7 @@ pub const Node = struct { |
| 65 | Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index), | 66 | Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index), |
| 66 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index), | 67 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index), |
| 67 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index), | 68 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index), |
| | 69 | Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index), |
| 68 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index), | 70 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index), |
| 69 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index), | 71 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index), |
| 70 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index), | 72 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index), |
| ... | @@ -111,6 +113,7 @@ pub const Node = struct { | ... | @@ -111,6 +113,7 @@ pub const Node = struct { |
| 111 | Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(), | 113 | Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(), |
| 112 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(), | 114 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(), |
| 113 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(), | 115 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(), |
| | 116 | Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(), |
| 114 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(), | 117 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(), |
| 115 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(), | 118 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(), |
| 116 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(), | 119 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(), |
| ... | @@ -157,6 +160,7 @@ pub const Node = struct { | ... | @@ -157,6 +160,7 @@ pub const Node = struct { |
| 157 | Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(), | 160 | Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(), |
| 158 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(), | 161 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(), |
| 159 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(), | 162 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(), |
| | 163 | Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(), |
| 160 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(), | 164 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(), |
| 161 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(), | 165 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(), |
| 162 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(), | 166 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(), |
| ... | @@ -573,6 +577,35 @@ pub const NodeBlock = struct { | ... | @@ -573,6 +577,35 @@ pub const NodeBlock = struct { |
| 573 | } | 577 | } |
| 574 | }; | 578 | }; |
| 575 | | 579 | |
| | 580 | pub const NodeDefer = struct { |
| | 581 | base: Node, |
| | 582 | defer_token: Token, |
| | 583 | kind: Kind, |
| | 584 | expr: &Node, |
| | 585 | |
| | 586 | const Kind = enum { |
| | 587 | Error, |
| | 588 | Unconditional, |
| | 589 | }; |
| | 590 | |
| | 591 | pub fn iterate(self: &NodeDefer, index: usize) ?&Node { |
| | 592 | var i = index; |
| | 593 | |
| | 594 | if (i < 1) return self.expr; |
| | 595 | i -= 1; |
| | 596 | |
| | 597 | return null; |
| | 598 | } |
| | 599 | |
| | 600 | pub fn firstToken(self: &NodeDefer) Token { |
| | 601 | return self.defer_token; |
| | 602 | } |
| | 603 | |
| | 604 | pub fn lastToken(self: &NodeDefer) Token { |
| | 605 | return self.expr.lastToken(); |
| | 606 | } |
| | 607 | }; |
| | 608 | |
| 576 | pub const NodeErrorPayload = struct { | 609 | pub const NodeErrorPayload = struct { |
| 577 | base: Node, | 610 | base: Node, |
| 578 | lpipe: Token, | 611 | lpipe: Token, |