authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-11 10:37:04+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-11 10:37:04+02:00
logdae287524d94219b1f3a2ec82d410b9f34fb2546
treeb9a90c0a8357ce481cbe6db5039aca947eee75e6
parentf43711e5fbbedafa1c28c933fdca0949427c77cd

std.zig: Major refactor

* There now exists a few function to allocate all nodes in parser.zig * ast.zig now have a table of Ids and their corrisponding type

2 files changed, 954 insertions(+), 974 deletions(-)

std/zig/ast.zig+147-188
......@@ -9,38 +9,34 @@ pub const Node = struct {
99 comment: ?&NodeLineComment,
1010
1111 pub const Id = enum {
12 // Top level
1213 Root,
13 VarDecl,
1414 Use,
15 ErrorSetDecl,
16 ContainerDecl,
17 StructField,
18 UnionTag,
19 EnumTag,
20 Identifier,
21 AsyncAttribute,
22 FnProto,
23 ParamDecl,
24 Block,
15 TestDecl,
16
17 // Statements
18 VarDecl,
2519 Defer,
26 Comptime,
27 Payload,
28 PointerPayload,
29 PointerIndexPayload,
30 Else,
20
21 // Operators
22 InfixOp,
23 PrefixOp,
24 SuffixOp,
25
26 // Control flow
3127 Switch,
32 SwitchCase,
33 SwitchElse,
3428 While,
3529 For,
3630 If,
37 InfixOp,
38 PrefixOp,
39 SuffixOp,
40 GroupedExpression,
4131 ControlFlowExpression,
4232 Suspend,
43 FieldInitializer,
33
34 // Type expressions
35 VarType,
36 ErrorType,
37 FnProto,
38
39 // Primary expressions
4440 IntegerLiteral,
4541 FloatLiteral,
4642 StringLiteral,
......@@ -50,180 +46,143 @@ pub const Node = struct {
5046 NullLiteral,
5147 UndefinedLiteral,
5248 ThisLiteral,
53 Asm,
54 AsmInput,
55 AsmOutput,
5649 Unreachable,
57 ErrorType,
58 VarType,
50 Identifier,
51 GroupedExpression,
5952 BuiltinCall,
53 ErrorSetDecl,
54 ContainerDecl,
55 Asm,
56 Comptime,
57 Block,
58
59 // Misc
6060 LineComment,
61 TestDecl,
61 SwitchCase,
62 SwitchElse,
63 Else,
64 Payload,
65 PointerPayload,
66 PointerIndexPayload,
67 StructField,
68 UnionTag,
69 EnumTag,
70 AsmInput,
71 AsmOutput,
72 AsyncAttribute,
73 ParamDecl,
74 FieldInitializer,
6275 };
6376
77 const IdTypePair = struct {
78 id: Id,
79 Type: type,
80 };
81
82 // TODO: When @field exists, we could generate this by iterating over all members of `Id`,
83 // and making an array of `IdTypePair { .id = @field(Id, @memberName(Id, i)), .Type = @field(ast, "Node" ++ @memberName(Id, i)) }`
84 const idTypeTable = []IdTypePair {
85 IdTypePair { .id = Id.Root, .Type = NodeRoot },
86 IdTypePair { .id = Id.Use, .Type = NodeUse },
87 IdTypePair { .id = Id.TestDecl, .Type = NodeTestDecl },
88
89 IdTypePair { .id = Id.VarDecl, .Type = NodeVarDecl },
90 IdTypePair { .id = Id.Defer, .Type = NodeDefer },
91
92 IdTypePair { .id = Id.InfixOp, .Type = NodeInfixOp },
93 IdTypePair { .id = Id.PrefixOp, .Type = NodePrefixOp },
94 IdTypePair { .id = Id.SuffixOp, .Type = NodeSuffixOp },
95
96 IdTypePair { .id = Id.Switch, .Type = NodeSwitch },
97 IdTypePair { .id = Id.While, .Type = NodeWhile },
98 IdTypePair { .id = Id.For, .Type = NodeFor },
99 IdTypePair { .id = Id.If, .Type = NodeIf },
100 IdTypePair { .id = Id.ControlFlowExpression, .Type = NodeControlFlowExpression },
101 IdTypePair { .id = Id.Suspend, .Type = NodeSuspend },
102
103 IdTypePair { .id = Id.VarType, .Type = NodeVarType },
104 IdTypePair { .id = Id.ErrorType, .Type = NodeErrorType },
105 IdTypePair { .id = Id.FnProto, .Type = NodeFnProto },
106
107 IdTypePair { .id = Id.IntegerLiteral, .Type = NodeIntegerLiteral },
108 IdTypePair { .id = Id.FloatLiteral, .Type = NodeFloatLiteral },
109 IdTypePair { .id = Id.StringLiteral, .Type = NodeStringLiteral },
110 IdTypePair { .id = Id.MultilineStringLiteral, .Type = NodeMultilineStringLiteral },
111 IdTypePair { .id = Id.CharLiteral, .Type = NodeCharLiteral },
112 IdTypePair { .id = Id.BoolLiteral, .Type = NodeBoolLiteral },
113 IdTypePair { .id = Id.NullLiteral, .Type = NodeNullLiteral },
114 IdTypePair { .id = Id.UndefinedLiteral, .Type = NodeUndefinedLiteral },
115 IdTypePair { .id = Id.ThisLiteral, .Type = NodeThisLiteral },
116 IdTypePair { .id = Id.Unreachable, .Type = NodeUnreachable },
117 IdTypePair { .id = Id.Identifier, .Type = NodeIdentifier },
118 IdTypePair { .id = Id.GroupedExpression, .Type = NodeGroupedExpression },
119 IdTypePair { .id = Id.BuiltinCall, .Type = NodeBuiltinCall },
120 IdTypePair { .id = Id.ErrorSetDecl, .Type = NodeErrorSetDecl },
121 IdTypePair { .id = Id.ContainerDecl, .Type = NodeContainerDecl },
122 IdTypePair { .id = Id.Asm, .Type = NodeAsm },
123 IdTypePair { .id = Id.Comptime, .Type = NodeComptime },
124 IdTypePair { .id = Id.Block, .Type = NodeBlock },
125
126 IdTypePair { .id = Id.LineComment, .Type = NodeLineComment },
127 IdTypePair { .id = Id.SwitchCase, .Type = NodeSwitchCase },
128 IdTypePair { .id = Id.SwitchElse, .Type = NodeSwitchElse },
129 IdTypePair { .id = Id.Else, .Type = NodeElse },
130 IdTypePair { .id = Id.Payload, .Type = NodePayload },
131 IdTypePair { .id = Id.PointerPayload, .Type = NodePointerPayload },
132 IdTypePair { .id = Id.PointerIndexPayload, .Type = NodePointerIndexPayload },
133 IdTypePair { .id = Id.StructField, .Type = NodeStructField },
134 IdTypePair { .id = Id.UnionTag, .Type = NodeUnionTag },
135 IdTypePair { .id = Id.EnumTag, .Type = NodeEnumTag },
136 IdTypePair { .id = Id.AsmInput, .Type = NodeAsmInput },
137 IdTypePair { .id = Id.AsmOutput, .Type = NodeAsmOutput },
138 IdTypePair { .id = Id.AsyncAttribute, .Type = NodeAsyncAttribute },
139 IdTypePair { .id = Id.ParamDecl, .Type = NodeParamDecl },
140 IdTypePair { .id = Id.FieldInitializer, .Type = NodeFieldInitializer },
141 };
142
143 pub fn IdToType(comptime id: Id) type {
144 inline for (idTypeTable) |id_type_pair| {
145 if (id == id_type_pair.id)
146 return id_type_pair.Type;
147 }
148
149 unreachable;
150 }
151
152 pub fn typeToId(comptime T: type) Id {
153 inline for (idTypeTable) |id_type_pair| {
154 if (T == id_type_pair.Type)
155 return id_type_pair.id;
156 }
157
158 unreachable;
159 }
160
64161 pub fn iterate(base: &Node, index: usize) ?&Node {
65 return switch (base.id) {
66 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),
67 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),
68 Id.Use => @fieldParentPtr(NodeUse, "base", base).iterate(index),
69 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).iterate(index),
70 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),
71 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index),
72 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index),
73 Id.EnumTag => @fieldParentPtr(NodeEnumTag, "base", base).iterate(index),
74 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).iterate(index),
75 Id.AsyncAttribute => @fieldParentPtr(NodeAsyncAttribute, "base", base).iterate(index),
76 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index),
77 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
78 Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index),
79 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index),
80 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).iterate(index),
81 Id.Payload => @fieldParentPtr(NodePayload, "base", base).iterate(index),
82 Id.PointerPayload => @fieldParentPtr(NodePointerPayload, "base", base).iterate(index),
83 Id.PointerIndexPayload => @fieldParentPtr(NodePointerIndexPayload, "base", base).iterate(index),
84 Id.Else => @fieldParentPtr(NodeSwitch, "base", base).iterate(index),
85 Id.Switch => @fieldParentPtr(NodeSwitch, "base", base).iterate(index),
86 Id.SwitchCase => @fieldParentPtr(NodeSwitchCase, "base", base).iterate(index),
87 Id.SwitchElse => @fieldParentPtr(NodeSwitchElse, "base", base).iterate(index),
88 Id.While => @fieldParentPtr(NodeWhile, "base", base).iterate(index),
89 Id.For => @fieldParentPtr(NodeFor, "base", base).iterate(index),
90 Id.If => @fieldParentPtr(NodeIf, "base", base).iterate(index),
91 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index),
92 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),
93 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index),
94 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).iterate(index),
95 Id.ControlFlowExpression => @fieldParentPtr(NodeControlFlowExpression, "base", base).iterate(index),
96 Id.Suspend => @fieldParentPtr(NodeSuspend, "base", base).iterate(index),
97 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).iterate(index),
98 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),
99 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),
100 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index),
101 Id.MultilineStringLiteral => @fieldParentPtr(NodeMultilineStringLiteral, "base", base).iterate(index),
102 Id.CharLiteral => @fieldParentPtr(NodeCharLiteral, "base", base).iterate(index),
103 Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).iterate(index),
104 Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).iterate(index),
105 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).iterate(index),
106 Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).iterate(index),
107 Id.Asm => @fieldParentPtr(NodeAsm, "base", base).iterate(index),
108 Id.AsmInput => @fieldParentPtr(NodeAsmInput, "base", base).iterate(index),
109 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).iterate(index),
110 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index),
111 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index),
112 Id.VarType => @fieldParentPtr(NodeVarType, "base", base).iterate(index),
113 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
114 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index),
115 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index),
116 };
162 inline for (idTypeTable) |id_type_pair| {
163 if (base.id == id_type_pair.id)
164 return @fieldParentPtr(id_type_pair.Type, "base", base).iterate(index);
165 }
166
167 unreachable;
117168 }
118169
119170 pub fn firstToken(base: &Node) Token {
120 return switch (base.id) {
121 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),
122 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),
123 Id.Use => @fieldParentPtr(NodeUse, "base", base).firstToken(),
124 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).firstToken(),
125 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),
126 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(),
127 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(),
128 Id.EnumTag => @fieldParentPtr(NodeEnumTag, "base", base).firstToken(),
129 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).firstToken(),
130 Id.AsyncAttribute => @fieldParentPtr(NodeAsyncAttribute, "base", base).firstToken(),
131 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(),
132 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
133 Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(),
134 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(),
135 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).firstToken(),
136 Id.Payload => @fieldParentPtr(NodePayload, "base", base).firstToken(),
137 Id.PointerPayload => @fieldParentPtr(NodePointerPayload, "base", base).firstToken(),
138 Id.PointerIndexPayload => @fieldParentPtr(NodePointerIndexPayload, "base", base).firstToken(),
139 Id.Else => @fieldParentPtr(NodeSwitch, "base", base).firstToken(),
140 Id.Switch => @fieldParentPtr(NodeSwitch, "base", base).firstToken(),
141 Id.SwitchCase => @fieldParentPtr(NodeSwitchCase, "base", base).firstToken(),
142 Id.SwitchElse => @fieldParentPtr(NodeSwitchElse, "base", base).firstToken(),
143 Id.While => @fieldParentPtr(NodeWhile, "base", base).firstToken(),
144 Id.For => @fieldParentPtr(NodeFor, "base", base).firstToken(),
145 Id.If => @fieldParentPtr(NodeIf, "base", base).firstToken(),
146 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(),
147 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(),
148 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(),
149 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).firstToken(),
150 Id.ControlFlowExpression => @fieldParentPtr(NodeControlFlowExpression, "base", base).firstToken(),
151 Id.Suspend => @fieldParentPtr(NodeSuspend, "base", base).firstToken(),
152 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).firstToken(),
153 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(),
154 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(),
155 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).firstToken(),
156 Id.MultilineStringLiteral => @fieldParentPtr(NodeMultilineStringLiteral, "base", base).firstToken(),
157 Id.CharLiteral => @fieldParentPtr(NodeCharLiteral, "base", base).firstToken(),
158 Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).firstToken(),
159 Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).firstToken(),
160 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).firstToken(),
161 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).firstToken(),
162 Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).firstToken(),
163 Id.Asm => @fieldParentPtr(NodeAsm, "base", base).firstToken(),
164 Id.AsmInput => @fieldParentPtr(NodeAsmInput, "base", base).firstToken(),
165 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).firstToken(),
166 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(),
167 Id.VarType => @fieldParentPtr(NodeVarType, "base", base).firstToken(),
168 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),
169 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(),
170 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(),
171 };
171 inline for (idTypeTable) |id_type_pair| {
172 if (base.id == id_type_pair.id)
173 return @fieldParentPtr(id_type_pair.Type, "base", base).firstToken();
174 }
175
176 unreachable;
172177 }
173178
174179 pub fn lastToken(base: &Node) Token {
175 return switch (base.id) {
176 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),
177 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),
178 Id.Use => @fieldParentPtr(NodeUse, "base", base).lastToken(),
179 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).lastToken(),
180 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),
181 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(),
182 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(),
183 Id.EnumTag => @fieldParentPtr(NodeEnumTag, "base", base).lastToken(),
184 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).lastToken(),
185 Id.AsyncAttribute => @fieldParentPtr(NodeAsyncAttribute, "base", base).lastToken(),
186 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(),
187 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
188 Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(),
189 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(),
190 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).lastToken(),
191 Id.Payload => @fieldParentPtr(NodePayload, "base", base).lastToken(),
192 Id.PointerPayload => @fieldParentPtr(NodePointerPayload, "base", base).lastToken(),
193 Id.PointerIndexPayload => @fieldParentPtr(NodePointerIndexPayload, "base", base).lastToken(),
194 Id.Else => @fieldParentPtr(NodeElse, "base", base).lastToken(),
195 Id.Switch => @fieldParentPtr(NodeSwitch, "base", base).lastToken(),
196 Id.SwitchCase => @fieldParentPtr(NodeSwitchCase, "base", base).lastToken(),
197 Id.SwitchElse => @fieldParentPtr(NodeSwitchElse, "base", base).lastToken(),
198 Id.While => @fieldParentPtr(NodeWhile, "base", base).lastToken(),
199 Id.For => @fieldParentPtr(NodeFor, "base", base).lastToken(),
200 Id.If => @fieldParentPtr(NodeIf, "base", base).lastToken(),
201 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(),
202 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(),
203 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(),
204 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).lastToken(),
205 Id.ControlFlowExpression => @fieldParentPtr(NodeControlFlowExpression, "base", base).lastToken(),
206 Id.Suspend => @fieldParentPtr(NodeSuspend, "base", base).lastToken(),
207 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).lastToken(),
208 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(),
209 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(),
210 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).lastToken(),
211 Id.MultilineStringLiteral => @fieldParentPtr(NodeMultilineStringLiteral, "base", base).lastToken(),
212 Id.CharLiteral => @fieldParentPtr(NodeCharLiteral, "base", base).lastToken(),
213 Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).lastToken(),
214 Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).lastToken(),
215 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).lastToken(),
216 Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).lastToken(),
217 Id.Asm => @fieldParentPtr(NodeAsm, "base", base).lastToken(),
218 Id.AsmInput => @fieldParentPtr(NodeAsmInput, "base", base).lastToken(),
219 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).lastToken(),
220 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(),
221 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(),
222 Id.VarType => @fieldParentPtr(NodeVarType, "base", base).lastToken(),
223 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),
224 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(),
225 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(),
226 };
180 inline for (idTypeTable) |id_type_pair| {
181 if (base.id == id_type_pair.id)
182 return @fieldParentPtr(id_type_pair.Type, "base", base).lastToken();
183 }
184
185 unreachable;
227186 }
228187};
229188
......@@ -482,18 +441,18 @@ pub const NodeEnumTag = struct {
482441
483442pub const NodeIdentifier = struct {
484443 base: Node,
485 name_token: Token,
444 token: Token,
486445
487446 pub fn iterate(self: &NodeIdentifier, index: usize) ?&Node {
488447 return null;
489448 }
490449
491450 pub fn firstToken(self: &NodeIdentifier) Token {
492 return self.name_token;
451 return self.token;
493452 }
494453
495454 pub fn lastToken(self: &NodeIdentifier) Token {
496 return self.name_token;
455 return self.token;
497456 }
498457};
499458
std/zig/parser.zig+807-786
......@@ -240,7 +240,14 @@ pub const Parser = struct {
240240 errdefer arena_allocator.deinit();
241241
242242 const arena = &arena_allocator.allocator;
243 const root_node = try self.createRoot(arena);
243 const root_node = try self.createNode(arena, ast.NodeRoot,
244 ast.NodeRoot {
245 .base = undefined,
246 .decls = ArrayList(&ast.Node).init(arena),
247 // initialized when we get the eof token
248 .eof_token = undefined,
249 }
250 );
244251
245252 try stack.append(State.TopLevel);
246253
......@@ -297,9 +304,23 @@ pub const Parser = struct {
297304 const name_token = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue;
298305 const lbrace = (try self.eatToken(&stack, Token.Id.LBrace)) ?? continue;
299306
300 const name = try self.createStringLiteral(arena, name_token);
301 const block = try self.createBlock(arena, (?Token)(null), token);
302 const test_decl = try self.createAttachTestDecl(arena, &root_node.decls, token, &name.base, block);
307 const block = try self.createNode(arena, ast.NodeBlock,
308 ast.NodeBlock {
309 .base = undefined,
310 .label = null,
311 .lbrace = lbrace,
312 .statements = ArrayList(&ast.Node).init(arena),
313 .rbrace = undefined,
314 }
315 );
316 _ = try self.createAttachNode(arena, &root_node.decls, ast.NodeTestDecl,
317 ast.NodeTestDecl {
318 .base = undefined,
319 .test_token = token,
320 .name = &(try self.createLiteral(arena, ast.NodeStringLiteral, name_token)).base,
321 .body_node = &block.base,
322 }
323 );
303324 stack.append(State { .Block = block }) catch unreachable;
304325 continue;
305326 },
......@@ -320,13 +341,13 @@ pub const Parser = struct {
320341 continue;
321342 },
322343 Token.Id.Keyword_comptime => {
323 const node = try arena.create(ast.NodeComptime);
324 *node = ast.NodeComptime {
325 .base = self.initNode(ast.Node.Id.Comptime),
326 .comptime_token = token,
327 .expr = undefined,
328 };
329 try root_node.decls.append(&node.base);
344 const node = try self.createAttachNode(arena, &root_node.decls, ast.NodeComptime,
345 ast.NodeComptime {
346 .base = undefined,
347 .comptime_token = token,
348 .expr = undefined,
349 }
350 );
330351 stack.append(State.TopLevel) catch unreachable;
331352 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
332353 continue;
......@@ -350,15 +371,14 @@ pub const Parser = struct {
350371 const token = self.getNextToken();
351372 switch (token.id) {
352373 Token.Id.Keyword_use => {
353 const node = try arena.create(ast.NodeUse);
354 *node = ast.NodeUse {
355 .base = self.initNode(ast.Node.Id.Use),
356 .visib_token = ctx.visib_token,
357 .expr = undefined,
358 .semicolon_token = undefined,
359 };
360 try ctx.decls.append(&node.base);
361
374 const node = try self.createAttachNode(arena, ctx.decls, ast.NodeUse,
375 ast.NodeUse {
376 .base = undefined,
377 .visib_token = ctx.visib_token,
378 .expr = undefined,
379 .semicolon_token = undefined,
380 }
381 );
362382 stack.append(State {
363383 .ExpectTokenSave = ExpectTokenSave {
364384 .id = Token.Id.Semicolon,
......@@ -372,7 +392,7 @@ pub const Parser = struct {
372392 const lib_name_token = self.getNextToken();
373393 const lib_name = blk: {
374394 if (lib_name_token.id == Token.Id.StringLiteral) {
375 const res = try self.createStringLiteral(arena, lib_name_token);
395 const res = try self.createLiteral(arena, ast.NodeStringLiteral, lib_name_token);
376396 break :blk &res.base;
377397 } else {
378398 self.putBackToken(lib_name_token);
......@@ -401,24 +421,68 @@ pub const Parser = struct {
401421 const token = self.getNextToken();
402422 switch (token.id) {
403423 Token.Id.Keyword_var, Token.Id.Keyword_const => {
404 // TODO shouldn't need these casts
405 const var_decl_node = try self.createAttachVarDecl(arena, ctx.decls, ctx.visib_token,
406 token, (?Token)(null), ctx.extern_token, ctx.lib_name);
424 const var_decl_node = try self.createAttachNode(arena, ctx.decls, ast.NodeVarDecl,
425 ast.NodeVarDecl {
426 .base = undefined,
427 .visib_token = ctx.visib_token,
428 .mut_token = token,
429 .comptime_token = null,
430 .extern_token = ctx.extern_token,
431 .type_node = null,
432 .align_node = null,
433 .init_node = null,
434 .lib_name = ctx.lib_name,
435 // initialized later
436 .name_token = undefined,
437 .eq_token = undefined,
438 .semicolon_token = undefined,
439 }
440 );
407441 stack.append(State { .VarDecl = var_decl_node }) catch unreachable;
408442 continue;
409443 },
410444 Token.Id.Keyword_fn => {
411 // TODO shouldn't need these casts
412 const fn_proto = try self.createAttachFnProto(arena, ctx.decls, token,
413 ctx.extern_token, ctx.lib_name, (?Token)(null), ctx.visib_token, (?Token)(null));
445 const fn_proto = try self.createAttachNode(arena, ctx.decls, ast.NodeFnProto,
446 ast.NodeFnProto {
447 .base = undefined,
448 .visib_token = ctx.visib_token,
449 .name_token = null,
450 .fn_token = token,
451 .params = ArrayList(&ast.Node).init(arena),
452 .return_type = undefined,
453 .var_args_token = null,
454 .extern_token = ctx.extern_token,
455 .inline_token = null,
456 .cc_token = null,
457 .async_attr = null,
458 .body_node = null,
459 .lib_name = ctx.lib_name,
460 .align_expr = null,
461 }
462 );
414463 stack.append(State { .FnDef = fn_proto }) catch unreachable;
415464 try stack.append(State { .FnProto = fn_proto });
416465 continue;
417466 },
418467 Token.Id.Keyword_nakedcc, Token.Id.Keyword_stdcallcc => {
419 // TODO shouldn't need this cast
420 const fn_proto = try self.createAttachFnProto(arena, ctx.decls, Token(undefined),
421 ctx.extern_token, ctx.lib_name, (?Token)(token), (?Token)(null), (?Token)(null));
468 const fn_proto = try self.createAttachNode(arena, ctx.decls, ast.NodeFnProto,
469 ast.NodeFnProto {
470 .base = undefined,
471 .visib_token = ctx.visib_token,
472 .name_token = null,
473 .fn_token = undefined,
474 .params = ArrayList(&ast.Node).init(arena),
475 .return_type = undefined,
476 .var_args_token = null,
477 .extern_token = ctx.extern_token,
478 .inline_token = null,
479 .cc_token = token,
480 .async_attr = null,
481 .body_node = null,
482 .lib_name = ctx.lib_name,
483 .align_expr = null,
484 }
485 );
422486 stack.append(State { .FnDef = fn_proto }) catch unreachable;
423487 try stack.append(State { .FnProto = fn_proto });
424488 try stack.append(State {
......@@ -430,19 +494,33 @@ pub const Parser = struct {
430494 continue;
431495 },
432496 Token.Id.Keyword_async => {
433 // TODO shouldn't need this cast
434 const fn_proto = try self.createAttachFnProto(arena, ctx.decls, Token(undefined),
435 ctx.extern_token, ctx.lib_name, (?Token)(null), (?Token)(null), (?Token)(null));
436
437 const async_node = try arena.create(ast.NodeAsyncAttribute);
438 *async_node = ast.NodeAsyncAttribute {
439 .base = self.initNode(ast.Node.Id.AsyncAttribute),
440 .async_token = token,
441 .allocator_type = null,
442 .rangle_bracket = null,
443 };
497 const async_node = try self.createNode(arena, ast.NodeAsyncAttribute,
498 ast.NodeAsyncAttribute {
499 .base = undefined,
500 .async_token = token,
501 .allocator_type = null,
502 .rangle_bracket = null,
503 }
504 );
444505
445 fn_proto.async_attr = async_node;
506 const fn_proto = try self.createAttachNode(arena, ctx.decls, ast.NodeFnProto,
507 ast.NodeFnProto {
508 .base = undefined,
509 .visib_token = ctx.visib_token,
510 .name_token = null,
511 .fn_token = undefined,
512 .params = ArrayList(&ast.Node).init(arena),
513 .return_type = undefined,
514 .var_args_token = null,
515 .extern_token = ctx.extern_token,
516 .inline_token = null,
517 .cc_token = null,
518 .async_attr = async_node,
519 .body_node = null,
520 .lib_name = ctx.lib_name,
521 .align_expr = null,
522 }
523 );
446524 stack.append(State { .FnDef = fn_proto }) catch unreachable;
447525 try stack.append(State { .FnProto = fn_proto });
448526 try stack.append(State {
......@@ -525,30 +603,29 @@ pub const Parser = struct {
525603
526604 State.ContainerExtern => |ctx| {
527605 const token = self.getNextToken();
528
529 const node = try arena.create(ast.NodeContainerDecl);
530 *node = ast.NodeContainerDecl {
531 .base = self.initNode(ast.Node.Id.ContainerDecl),
532 .ltoken = ctx.ltoken,
533 .layout = ctx.layout,
534 .kind = switch (token.id) {
535 Token.Id.Keyword_struct => ast.NodeContainerDecl.Kind.Struct,
536 Token.Id.Keyword_union => ast.NodeContainerDecl.Kind.Union,
537 Token.Id.Keyword_enum => ast.NodeContainerDecl.Kind.Enum,
538 else => {
539 try self.parseError(&stack, token, "expected {}, {} or {}, found {}",
540 @tagName(Token.Id.Keyword_struct),
541 @tagName(Token.Id.Keyword_union),
542 @tagName(Token.Id.Keyword_enum),
543 @tagName(token.id));
544 continue;
606 const node = try self.createToDestNode(arena, ctx.dest_ptr, ast.NodeContainerDecl,
607 ast.NodeContainerDecl {
608 .base = undefined,
609 .ltoken = ctx.ltoken,
610 .layout = ctx.layout,
611 .kind = switch (token.id) {
612 Token.Id.Keyword_struct => ast.NodeContainerDecl.Kind.Struct,
613 Token.Id.Keyword_union => ast.NodeContainerDecl.Kind.Union,
614 Token.Id.Keyword_enum => ast.NodeContainerDecl.Kind.Enum,
615 else => {
616 try self.parseError(&stack, token, "expected {}, {} or {}, found {}",
617 @tagName(Token.Id.Keyword_struct),
618 @tagName(Token.Id.Keyword_union),
619 @tagName(Token.Id.Keyword_enum),
620 @tagName(token.id));
621 continue;
622 },
545623 },
546 },
547 .init_arg_expr = undefined,
548 .fields_and_decls = ArrayList(&ast.Node).init(arena),
549 .rbrace_token = undefined,
550 };
551 ctx.dest_ptr.store(&node.base);
624 .init_arg_expr = undefined,
625 .fields_and_decls = ArrayList(&ast.Node).init(arena),
626 .rbrace_token = undefined,
627 }
628 );
552629
553630 stack.append(State { .ContainerDecl = node }) catch unreachable;
554631 try stack.append(State { .ExpectToken = Token.Id.LBrace });
......@@ -587,13 +664,13 @@ pub const Parser = struct {
587664 Token.Id.Identifier => {
588665 switch (container_decl.kind) {
589666 ast.NodeContainerDecl.Kind.Struct => {
590 const node = try arena.create(ast.NodeStructField);
591 *node = ast.NodeStructField {
592 .base = self.initNode(ast.Node.Id.StructField),
593 .name_token = token,
594 .type_expr = undefined,
595 };
596 try container_decl.fields_and_decls.append(&node.base);
667 const node = try self.createAttachNode(arena, &container_decl.fields_and_decls, ast.NodeStructField,
668 ast.NodeStructField {
669 .base = undefined,
670 .name_token = token,
671 .type_expr = undefined,
672 }
673 );
597674
598675 stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable;
599676 try stack.append(State { .Expression = DestPtr { .Field = &node.type_expr } });
......@@ -601,13 +678,13 @@ pub const Parser = struct {
601678 continue;
602679 },
603680 ast.NodeContainerDecl.Kind.Union => {
604 const node = try arena.create(ast.NodeUnionTag);
605 *node = ast.NodeUnionTag {
606 .base = self.initNode(ast.Node.Id.UnionTag),
607 .name_token = token,
608 .type_expr = null,
609 };
610 try container_decl.fields_and_decls.append(&node.base);
681 const node = try self.createAttachNode(arena, &container_decl.fields_and_decls, ast.NodeUnionTag,
682 ast.NodeUnionTag {
683 .base = undefined,
684 .name_token = token,
685 .type_expr = null,
686 }
687 );
611688
612689 stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable;
613690
......@@ -621,13 +698,13 @@ pub const Parser = struct {
621698 continue;
622699 },
623700 ast.NodeContainerDecl.Kind.Enum => {
624 const node = try arena.create(ast.NodeEnumTag);
625 *node = ast.NodeEnumTag {
626 .base = self.initNode(ast.Node.Id.EnumTag),
627 .name_token = token,
628 .value = null,
629 };
630 try container_decl.fields_and_decls.append(&node.base);
701 const node = try self.createAttachNode(arena, &container_decl.fields_and_decls, ast.NodeEnumTag,
702 ast.NodeEnumTag {
703 .base = undefined,
704 .name_token = token,
705 .value = null,
706 }
707 );
631708
632709 stack.append(State { .FieldListCommaOrEnd = container_decl }) catch unreachable;
633710
......@@ -711,17 +788,17 @@ pub const Parser = struct {
711788 State.Expression => |dest_ptr| {
712789 const token = self.getNextToken();
713790 switch (token.id) {
714 Token.Id.Keyword_try => {
715 const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp.Try);
716 dest_ptr.store(&node.base);
717
718 stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
719 continue;
720 },
721791 Token.Id.Keyword_return => {
722 const node = try self.createControlFlowExpr(arena, token, ast.NodeControlFlowExpression.Kind.Return);
723 dest_ptr.store(&node.base);
792 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeControlFlowExpression,
793 ast.NodeControlFlowExpression {
794 .base = undefined,
795 .ltoken = token,
796 .kind = ast.NodeControlFlowExpression.Kind.Return,
797 .rhs = undefined,
798 }
799 );
724800
801 // TODO: Find another way to do optional expressions
725802 stack.append(State {
726803 .Optional = RevertState {
727804 .parser = *self,
......@@ -732,7 +809,7 @@ pub const Parser = struct {
732809 try stack.append(State { .Expression = DestPtr { .NullableField = &node.rhs } });
733810 continue;
734811 },
735 Token.Id.Keyword_break => {
812 Token.Id.Keyword_break, Token.Id.Keyword_continue => {
736813 const label = blk: {
737814 const colon = self.getNextToken();
738815 if (colon.id != Token.Id.Colon) {
......@@ -743,13 +820,20 @@ pub const Parser = struct {
743820 break :blk (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
744821 };
745822
746 const node = try self.createControlFlowExpr(arena, token,
747 ast.NodeControlFlowExpression.Kind {
748 .Break = label,
823 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeControlFlowExpression,
824 ast.NodeControlFlowExpression {
825 .base = undefined,
826 .ltoken = token,
827 .kind = switch (token.id) {
828 Token.Id.Keyword_break => ast.NodeControlFlowExpression.Kind { .Break = label },
829 Token.Id.Keyword_continue => ast.NodeControlFlowExpression.Kind { .Continue = label },
830 else => unreachable,
831 },
832 .rhs = undefined,
749833 }
750834 );
751 dest_ptr.store(&node.base);
752835
836 // TODO: Find another way to do optional expressions
753837 stack.append(State {
754838 .Optional = RevertState {
755839 .parser = *self,
......@@ -760,59 +844,49 @@ pub const Parser = struct {
760844 try stack.append(State { .Expression = DestPtr { .NullableField = &node.rhs } });
761845 continue;
762846 },
763 Token.Id.Keyword_continue => {
764 const label = blk: {
765 const colon = self.getNextToken();
766 if (colon.id != Token.Id.Colon) {
767 self.putBackToken(colon);
768 break :blk null;
769 }
770
771 break :blk (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
772 };
773
774 const node = try self.createControlFlowExpr(arena, token,
775 ast.NodeControlFlowExpression.Kind {
776 .Continue = label,
847 Token.Id.Keyword_try, Token.Id.Keyword_cancel, Token.Id.Keyword_resume => {
848 const node = try self.createToDestNode(arena, dest_ptr, ast.NodePrefixOp,
849 ast.NodePrefixOp {
850 .base = undefined,
851 .op_token = token,
852 .op = switch (token.id) {
853 Token.Id.Keyword_try => ast.NodePrefixOp.PrefixOp { .Try = void{} },
854 Token.Id.Keyword_cancel => ast.NodePrefixOp.PrefixOp { .Cancel = void{} },
855 Token.Id.Keyword_resume => ast.NodePrefixOp.PrefixOp { .Resume = void{} },
856 else => unreachable,
857 },
858 .rhs = undefined,
777859 }
778860 );
779 dest_ptr.store(&node.base);
861
862 stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
780863 continue;
781864 },
782 Token.Id.Keyword_cancel => {
783 const cancel_node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp.Cancel);
784 dest_ptr.store(&cancel_node.base);
785 stack.append(State { .Expression = DestPtr { .Field = &cancel_node.rhs } }) catch unreachable;
786 },
787 Token.Id.Keyword_resume => {
788 const resume_node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp.Resume);
789 dest_ptr.store(&resume_node.base);
790 stack.append(State { .Expression = DestPtr { .Field = &resume_node.rhs } }) catch unreachable;
791 },
792865 Token.Id.Keyword_suspend => {
793 const node = try arena.create(ast.NodeSuspend);
794 *node = ast.NodeSuspend {
795 .base = self.initNode(ast.Node.Id.Suspend),
796 .suspend_token = token,
797 .payload = null,
798 .body = null,
799 };
800 dest_ptr.store(&node.base);
866 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuspend,
867 ast.NodeSuspend {
868 .base = undefined,
869 .suspend_token = token,
870 .payload = null,
871 .body = null,
872 }
873 );
874
801875 stack.append(State { .SuspendBody = node }) catch unreachable;
802876 try stack.append(State { .Payload = &node.payload });
803877 continue;
804878 },
805879 Token.Id.Keyword_if => {
806 const node = try arena.create(ast.NodeIf);
807 *node = ast.NodeIf {
808 .base = self.initNode(ast.Node.Id.If),
809 .if_token = token,
810 .condition = undefined,
811 .payload = null,
812 .body = undefined,
813 .@"else" = null,
814 };
815 dest_ptr.store(&node.base);
880 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeIf,
881 ast.NodeIf {
882 .base = undefined,
883 .if_token = token,
884 .condition = undefined,
885 .payload = null,
886 .body = undefined,
887 .@"else" = null,
888 }
889 );
816890
817891 stack.append(State { .Else = &node.@"else" }) catch unreachable;
818892 try stack.append(State { .Expression = DestPtr { .Field = &node.body } });
......@@ -845,15 +919,15 @@ pub const Parser = struct {
845919 continue;
846920 },
847921 Token.Id.Keyword_switch => {
848 const node = try arena.create(ast.NodeSwitch);
849 *node = ast.NodeSwitch {
850 .base = self.initNode(ast.Node.Id.Switch),
851 .switch_token = token,
852 .expr = undefined,
853 .cases = ArrayList(&ast.NodeSwitchCase).init(arena),
854 .rbrace = undefined,
855 };
856 dest_ptr.store(&node.base);
922 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSwitch,
923 ast.NodeSwitch {
924 .base = undefined,
925 .switch_token = token,
926 .expr = undefined,
927 .cases = ArrayList(&ast.NodeSwitchCase).init(arena),
928 .rbrace = undefined,
929 }
930 );
857931
858932 stack.append(State {
859933 .SwitchCaseOrEnd = ListSave(&ast.NodeSwitchCase) {
......@@ -867,20 +941,26 @@ pub const Parser = struct {
867941 try stack.append(State { .ExpectToken = Token.Id.LParen });
868942 },
869943 Token.Id.Keyword_comptime => {
870 const node = try arena.create(ast.NodeComptime);
871 *node = ast.NodeComptime {
872 .base = self.initNode(ast.Node.Id.Comptime),
873 .comptime_token = token,
874 .expr = undefined,
875 };
876 dest_ptr.store(&node.base);
944 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeComptime,
945 ast.NodeComptime {
946 .base = undefined,
947 .comptime_token = token,
948 .expr = undefined,
949 }
950 );
877951 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
878952 continue;
879953 },
880954 Token.Id.LBrace => {
881 const block = try self.createBlock(arena, (?Token)(null), token);
882 dest_ptr.store(&block.base);
883
955 const block = try self.createToDestNode(arena, dest_ptr, ast.NodeBlock,
956 ast.NodeBlock {
957 .base = undefined,
958 .label = null,
959 .lbrace = token,
960 .statements = ArrayList(&ast.Node).init(arena),
961 .rbrace = undefined,
962 }
963 );
884964 stack.append(State { .Block = block }) catch unreachable;
885965 continue;
886966 },
......@@ -901,10 +981,15 @@ pub const Parser = struct {
901981 State.RangeExpressionEnd => |dest_ptr| {
902982 const token = self.getNextToken();
903983 if (token.id == Token.Id.Ellipsis3) {
904 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.Range);
905 node.lhs = dest_ptr.get();
906 dest_ptr.store(&node.base);
907
984 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
985 ast.NodeInfixOp {
986 .base = undefined,
987 .lhs = dest_ptr.get(),
988 .op_token = token,
989 .op = ast.NodeInfixOp.InfixOp.Range,
990 .rhs = undefined,
991 }
992 );
908993 stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
909994 continue;
910995 } else {
......@@ -922,10 +1007,15 @@ pub const Parser = struct {
9221007 State.AssignmentExpressionEnd => |dest_ptr| {
9231008 const token = self.getNextToken();
9241009 if (tokenIdToAssignment(token.id)) |ass_id| {
925 const node = try self.createInfixOp(arena, token, ass_id);
926 node.lhs = dest_ptr.get();
927 dest_ptr.store(&node.base);
928
1010 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1011 ast.NodeInfixOp {
1012 .base = undefined,
1013 .lhs = dest_ptr.get(),
1014 .op_token = token,
1015 .op = ass_id,
1016 .rhs = undefined,
1017 }
1018 );
9291019 stack.append(State { .AssignmentExpressionEnd = dest_ptr }) catch unreachable;
9301020 try stack.append(State { .Expression = DestPtr { .Field = &node.rhs } });
9311021 continue;
......@@ -944,23 +1034,27 @@ pub const Parser = struct {
9441034 State.UnwrapExpressionEnd => |dest_ptr| {
9451035 const token = self.getNextToken();
9461036 switch (token.id) {
947 Token.Id.Keyword_catch => {
948 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp { .Catch = null });
949 node.lhs = dest_ptr.get();
950 dest_ptr.store(&node.base);
1037 Token.Id.Keyword_catch, Token.Id.QuestionMarkQuestionMark => {
1038 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1039 ast.NodeInfixOp {
1040 .base = undefined,
1041 .lhs = dest_ptr.get(),
1042 .op_token = token,
1043 .op = switch (token.id) {
1044 Token.Id.Keyword_catch => ast.NodeInfixOp.InfixOp { .Catch = null },
1045 Token.Id.QuestionMarkQuestionMark => ast.NodeInfixOp.InfixOp { .UnwrapMaybe = void{} },
1046 else => unreachable,
1047 },
1048 .rhs = undefined,
1049 }
1050 );
9511051
9521052 stack.append(State { .UnwrapExpressionEnd = dest_ptr }) catch unreachable;
9531053 try stack.append(State { .Expression = DestPtr { .Field = &node.rhs } });
954 try stack.append(State { .Payload = &node.op.Catch });
955 continue;
956 },
957 Token.Id.QuestionMarkQuestionMark => {
958 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.UnwrapMaybe);
959 node.lhs = dest_ptr.get();
960 dest_ptr.store(&node.base);
9611054
962 stack.append(State { .UnwrapExpressionEnd = dest_ptr }) catch unreachable;
963 try stack.append(State { .Expression = DestPtr { .Field = &node.rhs } });
1055 if (node.op == ast.NodeInfixOp.InfixOp.Catch) {
1056 try stack.append(State { .Payload = &node.op.Catch });
1057 }
9641058 continue;
9651059 },
9661060 else => {
......@@ -980,10 +1074,15 @@ pub const Parser = struct {
9801074 const token = self.getNextToken();
9811075 switch (token.id) {
9821076 Token.Id.Keyword_or => {
983 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.BoolOr);
984 node.lhs = dest_ptr.get();
985 dest_ptr.store(&node.base);
986
1077 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1078 ast.NodeInfixOp {
1079 .base = undefined,
1080 .lhs = dest_ptr.get(),
1081 .op_token = token,
1082 .op = ast.NodeInfixOp.InfixOp.BoolOr,
1083 .rhs = undefined,
1084 }
1085 );
9871086 stack.append(State { .BoolOrExpressionEnd = dest_ptr }) catch unreachable;
9881087 try stack.append(State { .BoolAndExpressionBegin = DestPtr { .Field = &node.rhs } });
9891088 continue;
......@@ -1005,10 +1104,15 @@ pub const Parser = struct {
10051104 const token = self.getNextToken();
10061105 switch (token.id) {
10071106 Token.Id.Keyword_and => {
1008 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.BoolAnd);
1009 node.lhs = dest_ptr.get();
1010 dest_ptr.store(&node.base);
1011
1107 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1108 ast.NodeInfixOp {
1109 .base = undefined,
1110 .lhs = dest_ptr.get(),
1111 .op_token = token,
1112 .op = ast.NodeInfixOp.InfixOp.BoolAnd,
1113 .rhs = undefined,
1114 }
1115 );
10121116 stack.append(State { .BoolAndExpressionEnd = dest_ptr }) catch unreachable;
10131117 try stack.append(State { .ComparisonExpressionBegin = DestPtr { .Field = &node.rhs } });
10141118 continue;
......@@ -1029,10 +1133,15 @@ pub const Parser = struct {
10291133 State.ComparisonExpressionEnd => |dest_ptr| {
10301134 const token = self.getNextToken();
10311135 if (tokenIdToComparison(token.id)) |comp_id| {
1032 const node = try self.createInfixOp(arena, token, comp_id);
1033 node.lhs = dest_ptr.get();
1034 dest_ptr.store(&node.base);
1035
1136 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1137 ast.NodeInfixOp {
1138 .base = undefined,
1139 .lhs = dest_ptr.get(),
1140 .op_token = token,
1141 .op = comp_id,
1142 .rhs = undefined,
1143 }
1144 );
10361145 stack.append(State { .ComparisonExpressionEnd = dest_ptr }) catch unreachable;
10371146 try stack.append(State { .BinaryOrExpressionBegin = DestPtr { .Field = &node.rhs } });
10381147 continue;
......@@ -1052,10 +1161,15 @@ pub const Parser = struct {
10521161 const token = self.getNextToken();
10531162 switch (token.id) {
10541163 Token.Id.Pipe => {
1055 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.BitOr);
1056 node.lhs = dest_ptr.get();
1057 dest_ptr.store(&node.base);
1058
1164 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1165 ast.NodeInfixOp {
1166 .base = undefined,
1167 .lhs = dest_ptr.get(),
1168 .op_token = token,
1169 .op = ast.NodeInfixOp.InfixOp.BitOr,
1170 .rhs = undefined,
1171 }
1172 );
10591173 stack.append(State { .BinaryOrExpressionEnd = dest_ptr }) catch unreachable;
10601174 try stack.append(State { .BinaryXorExpressionBegin = DestPtr { .Field = &node.rhs } });
10611175 continue;
......@@ -1077,10 +1191,15 @@ pub const Parser = struct {
10771191 const token = self.getNextToken();
10781192 switch (token.id) {
10791193 Token.Id.Caret => {
1080 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.BitXor);
1081 node.lhs = dest_ptr.get();
1082 dest_ptr.store(&node.base);
1083
1194 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1195 ast.NodeInfixOp {
1196 .base = undefined,
1197 .lhs = dest_ptr.get(),
1198 .op_token = token,
1199 .op = ast.NodeInfixOp.InfixOp.BitXor,
1200 .rhs = undefined,
1201 }
1202 );
10841203 stack.append(State { .BinaryXorExpressionEnd = dest_ptr }) catch unreachable;
10851204 try stack.append(State { .BinaryAndExpressionBegin = DestPtr { .Field = &node.rhs } });
10861205 continue;
......@@ -1102,10 +1221,15 @@ pub const Parser = struct {
11021221 const token = self.getNextToken();
11031222 switch (token.id) {
11041223 Token.Id.Ampersand => {
1105 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.BitAnd);
1106 node.lhs = dest_ptr.get();
1107 dest_ptr.store(&node.base);
1108
1224 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1225 ast.NodeInfixOp {
1226 .base = undefined,
1227 .lhs = dest_ptr.get(),
1228 .op_token = token,
1229 .op = ast.NodeInfixOp.InfixOp.BitAnd,
1230 .rhs = undefined,
1231 }
1232 );
11091233 stack.append(State { .BinaryAndExpressionEnd = dest_ptr }) catch unreachable;
11101234 try stack.append(State { .BitShiftExpressionBegin = DestPtr { .Field = &node.rhs } });
11111235 continue;
......@@ -1126,10 +1250,15 @@ pub const Parser = struct {
11261250 State.BitShiftExpressionEnd => |dest_ptr| {
11271251 const token = self.getNextToken();
11281252 if (tokenIdToBitShift(token.id)) |bitshift_id| {
1129 const node = try self.createInfixOp(arena, token, bitshift_id);
1130 node.lhs = dest_ptr.get();
1131 dest_ptr.store(&node.base);
1132
1253 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1254 ast.NodeInfixOp {
1255 .base = undefined,
1256 .lhs = dest_ptr.get(),
1257 .op_token = token,
1258 .op = bitshift_id,
1259 .rhs = undefined,
1260 }
1261 );
11331262 stack.append(State { .BitShiftExpressionEnd = dest_ptr }) catch unreachable;
11341263 try stack.append(State { .AdditionExpressionBegin = DestPtr { .Field = &node.rhs } });
11351264 continue;
......@@ -1148,10 +1277,15 @@ pub const Parser = struct {
11481277 State.AdditionExpressionEnd => |dest_ptr| {
11491278 const token = self.getNextToken();
11501279 if (tokenIdToAddition(token.id)) |add_id| {
1151 const node = try self.createInfixOp(arena, token, add_id);
1152 node.lhs = dest_ptr.get();
1153 dest_ptr.store(&node.base);
1154
1280 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1281 ast.NodeInfixOp {
1282 .base = undefined,
1283 .lhs = dest_ptr.get(),
1284 .op_token = token,
1285 .op = add_id,
1286 .rhs = undefined,
1287 }
1288 );
11551289 stack.append(State { .AdditionExpressionEnd = dest_ptr }) catch unreachable;
11561290 try stack.append(State { .MultiplyExpressionBegin = DestPtr { .Field = &node.rhs } });
11571291 continue;
......@@ -1170,10 +1304,15 @@ pub const Parser = struct {
11701304 State.MultiplyExpressionEnd => |dest_ptr| {
11711305 const token = self.getNextToken();
11721306 if (tokenIdToMultiply(token.id)) |mult_id| {
1173 const node = try self.createInfixOp(arena, token, mult_id);
1174 node.lhs = dest_ptr.get();
1175 dest_ptr.store(&node.base);
1176
1307 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1308 ast.NodeInfixOp {
1309 .base = undefined,
1310 .lhs = dest_ptr.get(),
1311 .op_token = token,
1312 .op = mult_id,
1313 .rhs = undefined,
1314 }
1315 );
11771316 stack.append(State { .MultiplyExpressionEnd = dest_ptr }) catch unreachable;
11781317 try stack.append(State { .CurlySuffixExpressionBegin = DestPtr { .Field = &node.rhs } });
11791318 continue;
......@@ -1199,12 +1338,16 @@ pub const Parser = struct {
11991338 const next = self.getNextToken();
12001339 switch (next.id) {
12011340 Token.Id.Period => {
1202 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
1203 .StructInitializer = ArrayList(&ast.NodeFieldInitializer).init(arena),
1204 });
1205 node.lhs = dest_ptr.get();
1206 dest_ptr.store(&node.base);
1207
1341 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1342 ast.NodeSuffixOp {
1343 .base = undefined,
1344 .lhs = dest_ptr.get(),
1345 .op = ast.NodeSuffixOp.SuffixOp {
1346 .StructInitializer = ArrayList(&ast.NodeFieldInitializer).init(arena),
1347 },
1348 .rtoken = undefined,
1349 }
1350 );
12081351 stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable;
12091352 try stack.append(State {
12101353 .FieldInitListItemOrEnd = ListSave(&ast.NodeFieldInitializer) {
......@@ -1216,12 +1359,16 @@ pub const Parser = struct {
12161359 continue;
12171360 },
12181361 else => {
1219 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
1220 .ArrayInitializer = ArrayList(&ast.Node).init(arena),
1221 });
1222 node.lhs = dest_ptr.get();
1223 dest_ptr.store(&node.base);
1224
1362 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1363 ast.NodeSuffixOp {
1364 .base = undefined,
1365 .lhs = dest_ptr.get(),
1366 .op = ast.NodeSuffixOp.SuffixOp {
1367 .ArrayInitializer = ArrayList(&ast.Node).init(arena),
1368 },
1369 .rtoken = undefined,
1370 }
1371 );
12251372 stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable;
12261373 try stack.append(State {
12271374 .ExprListItemOrEnd = ExprListCtx {
......@@ -1246,10 +1393,15 @@ pub const Parser = struct {
12461393 const token = self.getNextToken();
12471394 switch (token.id) {
12481395 Token.Id.Bang => {
1249 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.ErrorUnion);
1250 node.lhs = dest_ptr.get();
1251 dest_ptr.store(&node.base);
1252
1396 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1397 ast.NodeInfixOp {
1398 .base = undefined,
1399 .lhs = dest_ptr.get(),
1400 .op_token = token,
1401 .op = ast.NodeInfixOp.InfixOp.ErrorUnion,
1402 .rhs = undefined,
1403 }
1404 );
12531405 stack.append(State { .TypeExprEnd = dest_ptr }) catch unreachable;
12541406 try stack.append(State { .PrefixOpExpression = DestPtr { .Field = &node.rhs } });
12551407 continue;
......@@ -1264,9 +1416,14 @@ pub const Parser = struct {
12641416 State.PrefixOpExpression => |dest_ptr| {
12651417 const token = self.getNextToken();
12661418 if (tokenIdToPrefixOp(token.id)) |prefix_id| {
1267 const node = try self.createPrefixOp(arena, token, prefix_id);
1268 dest_ptr.store(&node.base);
1269
1419 const node = try self.createToDestNode(arena, dest_ptr, ast.NodePrefixOp,
1420 ast.NodePrefixOp {
1421 .base = undefined,
1422 .op_token = token,
1423 .op = prefix_id,
1424 .rhs = undefined,
1425 }
1426 );
12701427 stack.append(State { .TypeExprBegin = DestPtr { .Field = &node.rhs } }) catch unreachable;
12711428 if (node.op == ast.NodePrefixOp.PrefixOp.AddrOf) {
12721429 try stack.append(State { .AddrOfModifiers = &node.op.AddrOf });
......@@ -1283,14 +1440,14 @@ pub const Parser = struct {
12831440 const token = self.getNextToken();
12841441 switch (token.id) {
12851442 Token.Id.Keyword_async => {
1286 const async_node = try arena.create(ast.NodeAsyncAttribute);
1287 *async_node = ast.NodeAsyncAttribute {
1288 .base = self.initNode(ast.Node.Id.AsyncAttribute),
1289 .async_token = token,
1290 .allocator_type = null,
1291 .rangle_bracket = null,
1292 };
1293
1443 const async_node = try self.createNode(arena, ast.NodeAsyncAttribute,
1444 ast.NodeAsyncAttribute {
1445 .base = undefined,
1446 .async_token = token,
1447 .allocator_type = null,
1448 .rangle_bracket = null,
1449 }
1450 );
12941451 stack.append(State {
12951452 .AsyncEnd = AsyncEndCtx {
12961453 .dest_ptr = dest_ptr,
......@@ -1329,15 +1486,19 @@ pub const Parser = struct {
13291486 const token = self.getNextToken();
13301487 switch (token.id) {
13311488 Token.Id.LParen => {
1332 const node = try self.createSuffixOp(arena, ast.NodeSuffixOp.SuffixOp {
1333 .Call = ast.NodeSuffixOp.CallInfo {
1334 .params = ArrayList(&ast.Node).init(arena),
1335 .async_attr = null,
1489 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1490 ast.NodeSuffixOp {
1491 .base = undefined,
1492 .lhs = dest_ptr.get(),
1493 .op = ast.NodeSuffixOp.SuffixOp {
1494 .Call = ast.NodeSuffixOp.CallInfo {
1495 .params = ArrayList(&ast.Node).init(arena),
1496 .async_attr = null,
1497 }
1498 },
1499 .rtoken = undefined,
13361500 }
1337 });
1338 node.lhs = dest_ptr.get();
1339 dest_ptr.store(&node.base);
1340
1501 );
13411502 stack.append(State { .SuffixOpExpressionEnd = dest_ptr }) catch unreachable;
13421503 try stack.append(State {
13431504 .ExprListItemOrEnd = ExprListCtx {
......@@ -1349,28 +1510,31 @@ pub const Parser = struct {
13491510 continue;
13501511 },
13511512 Token.Id.LBracket => {
1352 const node = try arena.create(ast.NodeSuffixOp);
1353 *node = ast.NodeSuffixOp {
1354 .base = self.initNode(ast.Node.Id.SuffixOp),
1355 .lhs = undefined,
1356 .op = ast.NodeSuffixOp.SuffixOp {
1357 .ArrayAccess = undefined,
1358 },
1359 .rtoken = undefined,
1360 };
1361 node.lhs = dest_ptr.get();
1362 dest_ptr.store(&node.base);
1363
1513 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1514 ast.NodeSuffixOp {
1515 .base = undefined,
1516 .lhs = dest_ptr.get(),
1517 .op = ast.NodeSuffixOp.SuffixOp {
1518 .ArrayAccess = undefined,
1519 },
1520 .rtoken = undefined
1521 }
1522 );
13641523 stack.append(State { .SuffixOpExpressionEnd = dest_ptr }) catch unreachable;
13651524 try stack.append(State { .SliceOrArrayAccess = node });
13661525 try stack.append(State { .Expression = DestPtr { .Field = &node.op.ArrayAccess }});
13671526 continue;
13681527 },
13691528 Token.Id.Period => {
1370 const node = try self.createInfixOp(arena, token, ast.NodeInfixOp.InfixOp.Period);
1371 node.lhs = dest_ptr.get();
1372 dest_ptr.store(&node.base);
1373
1529 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
1530 ast.NodeInfixOp {
1531 .base = undefined,
1532 .lhs = dest_ptr.get(),
1533 .op_token = token,
1534 .op = ast.NodeInfixOp.InfixOp.Period,
1535 .rhs = undefined,
1536 }
1537 );
13741538 stack.append(State { .SuffixOpExpressionEnd = dest_ptr }) catch unreachable;
13751539 try stack.append(State { .SuffixOpExpressionBegin = DestPtr { .Field = &node.rhs }});
13761540 continue;
......@@ -1386,83 +1550,53 @@ pub const Parser = struct {
13861550 const token = self.getNextToken();
13871551 switch (token.id) {
13881552 Token.Id.IntegerLiteral => {
1389 dest_ptr.store(&(try self.createIntegerLiteral(arena, token)).base);
1553 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeStringLiteral, token)).base);
13901554 continue;
13911555 },
13921556 Token.Id.FloatLiteral => {
1393 dest_ptr.store(&(try self.createFloatLiteral(arena, token)).base);
1557 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeFloatLiteral, token)).base);
13941558 continue;
13951559 },
13961560 Token.Id.StringLiteral => {
1397 dest_ptr.store(&(try self.createStringLiteral(arena, token)).base);
1561 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeStringLiteral, token)).base);
13981562 continue;
13991563 },
14001564 Token.Id.CharLiteral => {
1401 const node = try arena.create(ast.NodeCharLiteral);
1402 *node = ast.NodeCharLiteral {
1403 .base = self.initNode(ast.Node.Id.CharLiteral),
1404 .token = token,
1405 };
1406 dest_ptr.store(&node.base);
1565 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeCharLiteral, token)).base);
14071566 continue;
14081567 },
14091568 Token.Id.Keyword_undefined => {
1410 dest_ptr.store(&(try self.createUndefined(arena, token)).base);
1569 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeUndefinedLiteral, token)).base);
14111570 continue;
14121571 },
14131572 Token.Id.Keyword_true, Token.Id.Keyword_false => {
1414 const node = try arena.create(ast.NodeBoolLiteral);
1415 *node = ast.NodeBoolLiteral {
1416 .base = self.initNode(ast.Node.Id.BoolLiteral),
1417 .token = token,
1418 };
1419 dest_ptr.store(&node.base);
1573 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeBoolLiteral, token)).base);
14201574 continue;
14211575 },
14221576 Token.Id.Keyword_null => {
1423 const node = try arena.create(ast.NodeNullLiteral);
1424 *node = ast.NodeNullLiteral {
1425 .base = self.initNode(ast.Node.Id.NullLiteral),
1426 .token = token,
1427 };
1428 dest_ptr.store(&node.base);
1577 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeNullLiteral, token)).base);
14291578 continue;
14301579 },
14311580 Token.Id.Keyword_this => {
1432 const node = try arena.create(ast.NodeThisLiteral);
1433 *node = ast.NodeThisLiteral {
1434 .base = self.initNode(ast.Node.Id.ThisLiteral),
1435 .token = token,
1436 };
1437 dest_ptr.store(&node.base);
1581 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeThisLiteral, token)).base);
14381582 continue;
14391583 },
14401584 Token.Id.Keyword_var => {
1441 const node = try arena.create(ast.NodeVarType);
1442 *node = ast.NodeVarType {
1443 .base = self.initNode(ast.Node.Id.VarType),
1444 .token = token,
1445 };
1446 dest_ptr.store(&node.base);
1585 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeVarType, token)).base);
1586 continue;
14471587 },
14481588 Token.Id.Keyword_unreachable => {
1449 const node = try arena.create(ast.NodeUnreachable);
1450 *node = ast.NodeUnreachable {
1451 .base = self.initNode(ast.Node.Id.Unreachable),
1452 .token = token,
1453 };
1454 dest_ptr.store(&node.base);
1589 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeUnreachable, token)).base);
14551590 continue;
14561591 },
14571592 Token.Id.MultilineStringLiteralLine => {
1458 const node = try arena.create(ast.NodeMultilineStringLiteral);
1459 *node = ast.NodeMultilineStringLiteral {
1460 .base = self.initNode(ast.Node.Id.MultilineStringLiteral),
1461 .tokens = ArrayList(Token).init(arena),
1462 };
1463 dest_ptr.store(&node.base);
1593 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeMultilineStringLiteral,
1594 ast.NodeMultilineStringLiteral {
1595 .base = undefined,
1596 .tokens = ArrayList(Token).init(arena),
1597 }
1598 );
14641599 try node.tokens.append(token);
1465
14661600 while (true) {
14671601 const multiline_str = self.getNextToken();
14681602 if (multiline_str.id != Token.Id.MultilineStringLiteralLine) {
......@@ -1475,14 +1609,14 @@ pub const Parser = struct {
14751609 continue;
14761610 },
14771611 Token.Id.LParen => {
1478 const node = try arena.create(ast.NodeGroupedExpression);
1479 *node = ast.NodeGroupedExpression {
1480 .base = self.initNode(ast.Node.Id.GroupedExpression),
1481 .lparen = token,
1482 .expr = undefined,
1483 .rparen = undefined,
1484 };
1485 dest_ptr.store(&node.base);
1612 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeGroupedExpression,
1613 ast.NodeGroupedExpression {
1614 .base = undefined,
1615 .lparen = token,
1616 .expr = undefined,
1617 .rparen = undefined,
1618 }
1619 );
14861620 stack.append(State {
14871621 .ExpectTokenSave = ExpectTokenSave {
14881622 .id = Token.Id.RParen,
......@@ -1493,14 +1627,14 @@ pub const Parser = struct {
14931627 continue;
14941628 },
14951629 Token.Id.Builtin => {
1496 const node = try arena.create(ast.NodeBuiltinCall);
1497 *node = ast.NodeBuiltinCall {
1498 .base = self.initNode(ast.Node.Id.BuiltinCall),
1499 .builtin_token = token,
1500 .params = ArrayList(&ast.Node).init(arena),
1501 .rparen_token = undefined,
1502 };
1503 dest_ptr.store(&node.base);
1630 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeBuiltinCall,
1631 ast.NodeBuiltinCall {
1632 .base = undefined,
1633 .builtin_token = token,
1634 .params = ArrayList(&ast.Node).init(arena),
1635 .rparen_token = undefined,
1636 }
1637 );
15041638 stack.append(State {
15051639 .ExprListItemOrEnd = ExprListCtx {
15061640 .list = &node.params,
......@@ -1514,15 +1648,22 @@ pub const Parser = struct {
15141648 Token.Id.LBracket => {
15151649 const rbracket_token = self.getNextToken();
15161650 if (rbracket_token.id == Token.Id.RBracket) {
1517 const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
1518 .SliceType = ast.NodePrefixOp.AddrOfInfo {
1519 .align_expr = null,
1520 .bit_offset_start_token = null,
1521 .bit_offset_end_token = null,
1522 .const_token = null,
1523 .volatile_token = null,
1651 const node = try self.createToDestNode(arena, dest_ptr, ast.NodePrefixOp,
1652 ast.NodePrefixOp {
1653 .base = undefined,
1654 .op_token = token,
1655 .op = ast.NodePrefixOp.PrefixOp{
1656 .SliceType = ast.NodePrefixOp.AddrOfInfo {
1657 .align_expr = null,
1658 .bit_offset_start_token = null,
1659 .bit_offset_end_token = null,
1660 .const_token = null,
1661 .volatile_token = null,
1662 }
1663 },
1664 .rhs = undefined,
15241665 }
1525 });
1666 );
15261667 dest_ptr.store(&node.base);
15271668 stack.append(State { .TypeExprBegin = DestPtr { .Field = &node.rhs } }) catch unreachable;
15281669 try stack.append(State { .AddrOfModifiers = &node.op.SliceType });
......@@ -1531,10 +1672,16 @@ pub const Parser = struct {
15311672
15321673 self.putBackToken(rbracket_token);
15331674
1534 const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
1535 .ArrayType = undefined,
1536 });
1537 dest_ptr.store(&node.base);
1675 const node = try self.createToDestNode(arena, dest_ptr, ast.NodePrefixOp,
1676 ast.NodePrefixOp {
1677 .base = undefined,
1678 .op_token = token,
1679 .op = ast.NodePrefixOp.PrefixOp{
1680 .ArrayType = undefined,
1681 },
1682 .rhs = undefined,
1683 }
1684 );
15381685 stack.append(State { .TypeExprBegin = DestPtr { .Field = &node.rhs } }) catch unreachable;
15391686 try stack.append(State { .ExpectToken = Token.Id.RBracket });
15401687 try stack.append(State { .Expression = DestPtr { .Field = &node.op.ArrayType } });
......@@ -1544,24 +1691,19 @@ pub const Parser = struct {
15441691 const next = self.getNextToken();
15451692
15461693 if (next.id != Token.Id.LBrace) {
1694 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeErrorType, token)).base);
15471695 self.putBackToken(next);
1548 const node = try arena.create(ast.NodeErrorType);
1549 *node = ast.NodeErrorType {
1550 .base = self.initNode(ast.Node.Id.ErrorType),
1551 .token = token,
1552 };
1553 dest_ptr.store(&node.base);
15541696 continue;
15551697 }
15561698
1557 const node = try arena.create(ast.NodeErrorSetDecl);
1558 *node = ast.NodeErrorSetDecl {
1559 .base = self.initNode(ast.Node.Id.ErrorSetDecl),
1560 .error_token = token,
1561 .decls = ArrayList(&ast.NodeIdentifier).init(arena),
1562 .rbrace_token = undefined,
1563 };
1564 dest_ptr.store(&node.base);
1699 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeErrorSetDecl,
1700 ast.NodeErrorSetDecl {
1701 .base = undefined,
1702 .error_token = token,
1703 .decls = ArrayList(&ast.NodeIdentifier).init(arena),
1704 .rbrace_token = undefined,
1705 }
1706 );
15651707
15661708 while (true) {
15671709 const t = self.getNextToken();
......@@ -1572,7 +1714,7 @@ pub const Parser = struct {
15721714 },
15731715 Token.Id.Identifier => {
15741716 try node.decls.append(
1575 try self.createIdentifier(arena, t)
1717 try self.createLiteral(arena, ast.NodeIdentifier, t)
15761718 );
15771719 },
15781720 else => {
......@@ -1614,10 +1756,24 @@ pub const Parser = struct {
16141756 Token.Id.Keyword_extern => {
16151757 const next = self.getNextToken();
16161758 if (next.id == Token.Id.Keyword_fn) {
1617 // TODO shouldn't need this cast
1618 const fn_proto = try self.createFnProto(arena, next,
1619 (?Token)(token), (?&ast.Node)(null), (?Token)(null), (?Token)(null), (?Token)(null));
1620 dest_ptr.store(&fn_proto.base);
1759 const fn_proto = try self.createToDestNode(arena, dest_ptr, ast.NodeFnProto,
1760 ast.NodeFnProto {
1761 .base = undefined,
1762 .visib_token = null,
1763 .name_token = null,
1764 .fn_token = next,
1765 .params = ArrayList(&ast.Node).init(arena),
1766 .return_type = undefined,
1767 .var_args_token = null,
1768 .extern_token = token,
1769 .inline_token = null,
1770 .cc_token = null,
1771 .async_attr = null,
1772 .body_node = null,
1773 .lib_name = null,
1774 .align_expr = null,
1775 }
1776 );
16211777 stack.append(State { .FnProto = fn_proto }) catch unreachable;
16221778 continue;
16231779 }
......@@ -1645,7 +1801,7 @@ pub const Parser = struct {
16451801 const next = self.getNextToken();
16461802 if (next.id != Token.Id.Colon) {
16471803 self.putBackToken(next);
1648 dest_ptr.store(&(try self.createIdentifier(arena, token)).base);
1804 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeIdentifier, token)).base);
16491805 continue;
16501806 }
16511807
......@@ -1658,19 +1814,47 @@ pub const Parser = struct {
16581814 continue;
16591815 },
16601816 Token.Id.Keyword_fn => {
1661 // TODO shouldn't need these casts
1662 const fn_proto = try self.createFnProto(arena, token,
1663 (?Token)(null), (?&ast.Node)(null), (?Token)(null), (?Token)(null), (?Token)(null));
1664 dest_ptr.store(&fn_proto.base);
1817 const fn_proto = try self.createToDestNode(arena, dest_ptr, ast.NodeFnProto,
1818 ast.NodeFnProto {
1819 .base = undefined,
1820 .visib_token = null,
1821 .name_token = null,
1822 .fn_token = token,
1823 .params = ArrayList(&ast.Node).init(arena),
1824 .return_type = undefined,
1825 .var_args_token = null,
1826 .extern_token = null,
1827 .inline_token = null,
1828 .cc_token = null,
1829 .async_attr = null,
1830 .body_node = null,
1831 .lib_name = null,
1832 .align_expr = null,
1833 }
1834 );
16651835 stack.append(State { .FnProto = fn_proto }) catch unreachable;
16661836 continue;
16671837 },
16681838 Token.Id.Keyword_nakedcc, Token.Id.Keyword_stdcallcc => {
16691839 const fn_token = (try self.eatToken(&stack, Token.Id.Keyword_fn)) ?? continue;
1670 // TODO shouldn't need this cast
1671 const fn_proto = try self.createFnProto(arena, fn_token,
1672 (?Token)(null), (?&ast.Node)(null), (?Token)(token), (?Token)(null), (?Token)(null));
1673 dest_ptr.store(&fn_proto.base);
1840 const fn_proto = try self.createToDestNode(arena, dest_ptr, ast.NodeFnProto,
1841 ast.NodeFnProto {
1842 .base = undefined,
1843 .visib_token = null,
1844 .name_token = null,
1845 .fn_token = fn_token,
1846 .params = ArrayList(&ast.Node).init(arena),
1847 .return_type = undefined,
1848 .var_args_token = null,
1849 .extern_token = null,
1850 .inline_token = null,
1851 .cc_token = token,
1852 .async_attr = null,
1853 .body_node = null,
1854 .lib_name = null,
1855 .align_expr = null,
1856 }
1857 );
16741858 stack.append(State { .FnProto = fn_proto }) catch unreachable;
16751859 continue;
16761860 },
......@@ -1687,20 +1871,19 @@ pub const Parser = struct {
16871871 const template = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue;
16881872 // TODO parse template
16891873
1690 const node = try arena.create(ast.NodeAsm);
1691 *node = ast.NodeAsm {
1692 .base = self.initNode(ast.Node.Id.Asm),
1693 .asm_token = token,
1694 .is_volatile = is_volatile,
1695 .template = template,
1696 //.tokens = ArrayList(ast.NodeAsm.AsmToken).init(arena),
1697 .outputs = ArrayList(&ast.NodeAsmOutput).init(arena),
1698 .inputs = ArrayList(&ast.NodeAsmInput).init(arena),
1699 .cloppers = ArrayList(&ast.NodeStringLiteral).init(arena),
1700 .rparen = undefined,
1701 };
1702 dest_ptr.store(&node.base);
1703
1874 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeAsm,
1875 ast.NodeAsm {
1876 .base = undefined,
1877 .asm_token = token,
1878 .is_volatile = is_volatile,
1879 .template = template,
1880 //.tokens = ArrayList(ast.NodeAsm.AsmToken).init(arena),
1881 .outputs = ArrayList(&ast.NodeAsmOutput).init(arena),
1882 .inputs = ArrayList(&ast.NodeAsmInput).init(arena),
1883 .cloppers = ArrayList(&ast.NodeStringLiteral).init(arena),
1884 .rparen = undefined,
1885 }
1886 );
17041887 stack.append(State {
17051888 .ExpectTokenSave = ExpectTokenSave {
17061889 .id = Token.Id.RParen,
......@@ -1788,19 +1971,20 @@ pub const Parser = struct {
17881971 _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue;
17891972 try stack.append(State { .ExpectToken = Token.Id.RParen });
17901973
1791 const node = try arena.create(ast.NodeAsmOutput);
1792 *node = ast.NodeAsmOutput {
1793 .base = self.initNode(ast.Node.Id.AsmOutput),
1794 .symbolic_name = try self.createIdentifier(arena, symbolic_name),
1795 .constraint = try self.createStringLiteral(arena, constraint),
1796 .kind = undefined,
1797 };
1974 const node = try self.createNode(arena, ast.NodeAsmOutput,
1975 ast.NodeAsmOutput {
1976 .base = undefined,
1977 .symbolic_name = try self.createLiteral(arena, ast.NodeIdentifier, symbolic_name),
1978 .constraint = try self.createLiteral(arena, ast.NodeStringLiteral, constraint),
1979 .kind = undefined,
1980 }
1981 );
17981982 try items.append(node);
17991983
18001984 const symbol_or_arrow = self.getNextToken();
18011985 switch (symbol_or_arrow.id) {
18021986 Token.Id.Identifier => {
1803 node.kind = ast.NodeAsmOutput.Kind { .Variable = try self.createIdentifier(arena, symbol_or_arrow) };
1987 node.kind = ast.NodeAsmOutput.Kind { .Variable = try self.createLiteral(arena, ast.NodeIdentifier, symbol_or_arrow) };
18041988 },
18051989 Token.Id.Arrow => {
18061990 node.kind = ast.NodeAsmOutput.Kind { .Return = undefined };
......@@ -1832,13 +2016,14 @@ pub const Parser = struct {
18322016 _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue;
18332017 try stack.append(State { .ExpectToken = Token.Id.RParen });
18342018
1835 const node = try arena.create(ast.NodeAsmInput);
1836 *node = ast.NodeAsmInput {
1837 .base = self.initNode(ast.Node.Id.AsmInput),
1838 .symbolic_name = try self.createIdentifier(arena, symbolic_name),
1839 .constraint = try self.createStringLiteral(arena, constraint),
1840 .expr = undefined,
1841 };
2019 const node = try self.createNode(arena, ast.NodeAsmInput,
2020 ast.NodeAsmInput {
2021 .base = undefined,
2022 .symbolic_name = try self.createLiteral(arena, ast.NodeIdentifier, symbolic_name),
2023 .constraint = try self.createLiteral(arena, ast.NodeStringLiteral, constraint),
2024 .expr = undefined,
2025 }
2026 );
18422027 try items.append(node);
18432028 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
18442029 },
......@@ -1850,7 +2035,7 @@ pub const Parser = struct {
18502035 continue;
18512036 }
18522037
1853 try items.append(try self.createStringLiteral(arena, string));
2038 try items.append(try self.createLiteral(arena, ast.NodeStringLiteral, string));
18542039 stack.append(State { .AsmClopperItems = items }) catch unreachable;
18552040 try stack.append(State { .IfToken = Token.Id.Comma });
18562041 },
......@@ -1871,21 +2056,20 @@ pub const Parser = struct {
18712056
18722057 State.FieldInitListItemOrEnd => |list_state| {
18732058 var token = self.getNextToken();
1874
18752059 if (token.id == Token.Id.RBrace){
18762060 *list_state.ptr = token;
18772061 continue;
18782062 }
1879
18802063 self.putBackToken(token);
18812064
1882 const node = try arena.create(ast.NodeFieldInitializer);
1883 *node = ast.NodeFieldInitializer {
1884 .base = self.initNode(ast.Node.Id.FieldInitializer),
1885 .period_token = undefined,
1886 .name_token = undefined,
1887 .expr = undefined,
1888 };
2065 const node = try self.createNode(arena, ast.NodeFieldInitializer,
2066 ast.NodeFieldInitializer {
2067 .base = undefined,
2068 .period_token = undefined,
2069 .name_token = undefined,
2070 .expr = undefined,
2071 }
2072 );
18892073 try list_state.list.append(node);
18902074
18912075 stack.append(State { .FieldInitListCommaOrEnd = list_state }) catch unreachable;
......@@ -1907,21 +2091,20 @@ pub const Parser = struct {
19072091
19082092 State.SwitchCaseOrEnd => |list_state| {
19092093 var token = self.getNextToken();
1910
19112094 if (token.id == Token.Id.RBrace){
19122095 *list_state.ptr = token;
19132096 continue;
19142097 }
1915
19162098 self.putBackToken(token);
19172099
1918 const node = try arena.create(ast.NodeSwitchCase);
1919 *node = ast.NodeSwitchCase {
1920 .base = self.initNode(ast.Node.Id.SwitchCase),
1921 .items = ArrayList(&ast.Node).init(arena),
1922 .payload = null,
1923 .expr = undefined,
1924 };
2100 const node = try self.createNode(arena, ast.NodeSwitchCase,
2101 ast.NodeSwitchCase {
2102 .base = undefined,
2103 .items = ArrayList(&ast.Node).init(arena),
2104 .payload = null,
2105 .expr = undefined,
2106 }
2107 );
19252108 try list_state.list.append(node);
19262109 stack.append(State { .SwitchCaseCommaOrEnd = list_state }) catch unreachable;
19272110 try stack.append(State { .Expression = DestPtr{ .Field = &node.expr } });
......@@ -1982,13 +2165,14 @@ pub const Parser = struct {
19822165 continue;
19832166 }
19842167
1985 const node = try arena.create(ast.NodeElse);
1986 *node = ast.NodeElse {
1987 .base = self.initNode(ast.Node.Id.Else),
1988 .else_token = else_token,
1989 .payload = null,
1990 .body = undefined,
1991 };
2168 const node = try self.createNode(arena, ast.NodeElse,
2169 ast.NodeElse {
2170 .base = undefined,
2171 .else_token = else_token,
2172 .payload = null,
2173 .body = undefined,
2174 }
2175 );
19922176 *dest = node;
19932177
19942178 stack.append(State { .Expression = DestPtr { .Field = &node.body } }) catch unreachable;
......@@ -2050,14 +2234,14 @@ pub const Parser = struct {
20502234
20512235 const error_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
20522236 const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue;
2053 const node = try arena.create(ast.NodePayload);
2054 *node = ast.NodePayload {
2055 .base = self.initNode(ast.Node.Id.Payload),
2056 .lpipe = lpipe,
2057 .error_symbol = try self.createIdentifier(arena, error_symbol),
2058 .rpipe = rpipe
2059 };
2060 *dest = node;
2237 *dest = try self.createNode(arena, ast.NodePayload,
2238 ast.NodePayload {
2239 .base = undefined,
2240 .lpipe = lpipe,
2241 .error_symbol = try self.createLiteral(arena, ast.NodeIdentifier, error_symbol),
2242 .rpipe = rpipe
2243 }
2244 );
20612245 },
20622246
20632247 State.PointerPayload => |dest| {
......@@ -2079,15 +2263,15 @@ pub const Parser = struct {
20792263
20802264 const value_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
20812265 const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue;
2082 const node = try arena.create(ast.NodePointerPayload);
2083 *node = ast.NodePointerPayload {
2084 .base = self.initNode(ast.Node.Id.PointerPayload),
2085 .lpipe = lpipe,
2086 .is_ptr = is_ptr,
2087 .value_symbol = try self.createIdentifier(arena, value_symbol),
2088 .rpipe = rpipe
2089 };
2090 *dest = node;
2266 *dest = try self.createNode(arena, ast.NodePointerPayload,
2267 ast.NodePointerPayload {
2268 .base = undefined,
2269 .lpipe = lpipe,
2270 .is_ptr = is_ptr,
2271 .value_symbol = try self.createLiteral(arena, ast.NodeIdentifier, value_symbol),
2272 .rpipe = rpipe
2273 }
2274 );
20912275 },
20922276
20932277 State.PointerIndexPayload => |dest| {
......@@ -2116,20 +2300,20 @@ pub const Parser = struct {
21162300 }
21172301
21182302 const symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
2119 break :blk try self.createIdentifier(arena, symbol);
2303 break :blk try self.createLiteral(arena, ast.NodeIdentifier, symbol);
21202304 };
21212305
21222306 const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue;
2123 const node = try arena.create(ast.NodePointerIndexPayload);
2124 *node = ast.NodePointerIndexPayload {
2125 .base = self.initNode(ast.Node.Id.PointerIndexPayload),
2126 .lpipe = lpipe,
2127 .is_ptr = is_ptr,
2128 .value_symbol = try self.createIdentifier(arena, value_symbol),
2129 .index_symbol = index_symbol,
2130 .rpipe = rpipe
2131 };
2132 *dest = node;
2307 *dest = try self.createNode(arena, ast.NodePointerIndexPayload,
2308 ast.NodePointerIndexPayload {
2309 .base = undefined,
2310 .lpipe = lpipe,
2311 .is_ptr = is_ptr,
2312 .value_symbol = try self.createLiteral(arena, ast.NodeIdentifier, value_symbol),
2313 .index_symbol = index_symbol,
2314 .rpipe = rpipe
2315 }
2316 );
21332317 },
21342318
21352319 State.AddrOfModifiers => |addr_of_info| {
......@@ -2225,7 +2409,16 @@ pub const Parser = struct {
22252409 if (token.id == Token.Id.RParen) {
22262410 continue;
22272411 }
2228 const param_decl = try self.createAttachParamDecl(arena, &fn_proto.params);
2412 const param_decl = try self.createAttachNode(arena, &fn_proto.params, ast.NodeParamDecl,
2413 ast.NodeParamDecl {
2414 .base = undefined,
2415 .comptime_token = null,
2416 .noalias_token = null,
2417 .name_token = null,
2418 .type_node = undefined,
2419 .var_args_token = null,
2420 },
2421 );
22292422 if (token.id == Token.Id.Keyword_comptime) {
22302423 param_decl.comptime_token = token;
22312424 token = self.getNextToken();
......@@ -2277,7 +2470,15 @@ pub const Parser = struct {
22772470 const token = self.getNextToken();
22782471 switch(token.id) {
22792472 Token.Id.LBrace => {
2280 const block = try self.createBlock(arena, (?Token)(null), token);
2473 const block = try self.createNode(arena, ast.NodeBlock,
2474 ast.NodeBlock {
2475 .base = undefined,
2476 .label = null,
2477 .lbrace = token,
2478 .statements = ArrayList(&ast.Node).init(arena),
2479 .rbrace = undefined,
2480 }
2481 );
22812482 fn_proto.body_node = &block.base;
22822483 stack.append(State { .Block = block }) catch unreachable;
22832484 continue;
......@@ -2294,9 +2495,15 @@ pub const Parser = struct {
22942495 const token = self.getNextToken();
22952496 switch (token.id) {
22962497 Token.Id.LBrace => {
2297 const block = try self.createBlock(arena, (?Token)(ctx.label), token);
2298 ctx.dest_ptr.store(&block.base);
2299
2498 const block = try self.createToDestNode(arena, ctx.dest_ptr, ast.NodeBlock,
2499 ast.NodeBlock {
2500 .base = undefined,
2501 .label = ctx.label,
2502 .lbrace = token,
2503 .statements = ArrayList(&ast.Node).init(arena),
2504 .rbrace = undefined,
2505 }
2506 );
23002507 stack.append(State { .Block = block }) catch unreachable;
23012508 continue;
23022509 },
......@@ -2372,20 +2579,19 @@ pub const Parser = struct {
23722579 },
23732580
23742581 State.While => |ctx| {
2375 const node = try arena.create(ast.NodeWhile);
2376 *node = ast.NodeWhile {
2377 .base = self.initNode(ast.Node.Id.While),
2378 .label = ctx.label,
2379 .inline_token = ctx.inline_token,
2380 .while_token = ctx.loop_token,
2381 .condition = undefined,
2382 .payload = null,
2383 .continue_expr = null,
2384 .body = undefined,
2385 .@"else" = null,
2386 };
2387 ctx.dest_ptr.store(&node.base);
2388
2582 const node = try self.createToDestNode(arena, ctx.dest_ptr, ast.NodeWhile,
2583 ast.NodeWhile {
2584 .base = undefined,
2585 .label = ctx.label,
2586 .inline_token = ctx.inline_token,
2587 .while_token = ctx.loop_token,
2588 .condition = undefined,
2589 .payload = null,
2590 .continue_expr = null,
2591 .body = undefined,
2592 .@"else" = null,
2593 }
2594 );
23892595 stack.append(State { .Else = &node.@"else" }) catch unreachable;
23902596 try stack.append(State { .Expression = DestPtr { .Field = &node.body } });
23912597 try stack.append(State { .WhileContinueExpr = &node.continue_expr });
......@@ -2396,19 +2602,18 @@ pub const Parser = struct {
23962602 },
23972603
23982604 State.For => |ctx| {
2399 const node = try arena.create(ast.NodeFor);
2400 *node = ast.NodeFor {
2401 .base = self.initNode(ast.Node.Id.For),
2402 .label = ctx.label,
2403 .inline_token = ctx.inline_token,
2404 .for_token = ctx.loop_token,
2405 .array_expr = undefined,
2406 .payload = null,
2407 .body = undefined,
2408 .@"else" = null,
2409 };
2410 ctx.dest_ptr.store(&node.base);
2411
2605 const node = try self.createToDestNode(arena, ctx.dest_ptr, ast.NodeFor,
2606 ast.NodeFor {
2607 .base = undefined,
2608 .label = ctx.label,
2609 .inline_token = ctx.inline_token,
2610 .for_token = ctx.loop_token,
2611 .array_expr = undefined,
2612 .payload = null,
2613 .body = undefined,
2614 .@"else" = null,
2615 }
2616 );
24122617 stack.append(State { .Else = &node.@"else" }) catch unreachable;
24132618 try stack.append(State { .Expression = DestPtr { .Field = &node.body } });
24142619 try stack.append(State { .PointerIndexPayload = &node.payload });
......@@ -2439,9 +2644,23 @@ pub const Parser = struct {
24392644 Token.Id.Keyword_comptime => {
24402645 const mut_token = self.getNextToken();
24412646 if (mut_token.id == Token.Id.Keyword_var or mut_token.id == Token.Id.Keyword_const) {
2442 // TODO shouldn't need these casts
2443 const var_decl = try self.createAttachVarDecl(arena, &block.statements, (?Token)(null),
2444 mut_token, (?Token)(next), (?Token)(null), null);
2647 const var_decl = try self.createAttachNode(arena, &block.statements, ast.NodeVarDecl,
2648 ast.NodeVarDecl {
2649 .base = undefined,
2650 .visib_token = null,
2651 .mut_token = mut_token,
2652 .comptime_token = next,
2653 .extern_token = null,
2654 .type_node = null,
2655 .align_node = null,
2656 .init_node = null,
2657 .lib_name = null,
2658 // initialized later
2659 .name_token = undefined,
2660 .eq_token = undefined,
2661 .semicolon_token = undefined,
2662 }
2663 );
24452664 stack.append(State { .VarDecl = var_decl }) catch unreachable;
24462665 continue;
24472666 } else {
......@@ -2453,33 +2672,53 @@ pub const Parser = struct {
24532672 }
24542673 },
24552674 Token.Id.Keyword_var, Token.Id.Keyword_const => {
2456 const var_decl = try self.createAttachVarDecl(arena, &block.statements, (?Token)(null),
2457 next, (?Token)(null), (?Token)(null), null);
2675 const var_decl = try self.createAttachNode(arena, &block.statements, ast.NodeVarDecl,
2676 ast.NodeVarDecl {
2677 .base = undefined,
2678 .visib_token = null,
2679 .mut_token = next,
2680 .comptime_token = null,
2681 .extern_token = null,
2682 .type_node = null,
2683 .align_node = null,
2684 .init_node = null,
2685 .lib_name = null,
2686 // initialized later
2687 .name_token = undefined,
2688 .eq_token = undefined,
2689 .semicolon_token = undefined,
2690 }
2691 );
24582692 stack.append(State { .VarDecl = var_decl }) catch unreachable;
24592693 continue;
24602694 },
24612695 Token.Id.Keyword_defer, Token.Id.Keyword_errdefer => {
2462 const node = try arena.create(ast.NodeDefer);
2463 *node = ast.NodeDefer {
2464 .base = self.initNode(ast.Node.Id.Defer),
2465 .defer_token = next,
2466 .kind = switch (next.id) {
2467 Token.Id.Keyword_defer => ast.NodeDefer.Kind.Unconditional,
2468 Token.Id.Keyword_errdefer => ast.NodeDefer.Kind.Error,
2469 else => unreachable,
2470 },
2471 .expr = undefined,
2472 };
2473 try block.statements.append(&node.base);
2474
2696 const node = try self.createAttachNode(arena, &block.statements, ast.NodeDefer,
2697 ast.NodeDefer {
2698 .base = undefined,
2699 .defer_token = next,
2700 .kind = switch (next.id) {
2701 Token.Id.Keyword_defer => ast.NodeDefer.Kind.Unconditional,
2702 Token.Id.Keyword_errdefer => ast.NodeDefer.Kind.Error,
2703 else => unreachable,
2704 },
2705 .expr = undefined,
2706 }
2707 );
24752708 stack.append(State { .Semicolon = &node.base }) catch unreachable;
24762709 try stack.append(State { .AssignmentExpressionBegin = DestPtr{.Field = &node.expr } });
24772710 continue;
24782711 },
24792712 Token.Id.LBrace => {
2480 const inner_block = try self.createBlock(arena, (?Token)(null), next);
2481 try block.statements.append(&inner_block.base);
2482
2713 const inner_block = try self.createAttachNode(arena, &block.statements, ast.NodeBlock,
2714 ast.NodeBlock {
2715 .base = undefined,
2716 .label = null,
2717 .lbrace = next,
2718 .statements = ArrayList(&ast.Node).init(arena),
2719 .rbrace = undefined,
2720 }
2721 );
24832722 stack.append(State { .Block = inner_block }) catch unreachable;
24842723 continue;
24852724 },
......@@ -2600,84 +2839,74 @@ pub const Parser = struct {
26002839 // TODO: We have to cast all cases because of this:
26012840 // error: expected type '?InfixOp', found '?@TagType(InfixOp)'
26022841 return switch (*id) {
2603 Token.Id.AmpersandEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignBitAnd),
2604 Token.Id.AngleBracketAngleBracketLeftEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignBitShiftLeft),
2605 Token.Id.AngleBracketAngleBracketRightEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignBitShiftRight),
2606 Token.Id.AsteriskEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignTimes),
2607 Token.Id.AsteriskPercentEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignTimesWarp),
2608 Token.Id.CaretEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignBitXor),
2609 Token.Id.Equal => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.Assign),
2610 Token.Id.MinusEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignMinus),
2611 Token.Id.MinusPercentEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignMinusWrap),
2612 Token.Id.PercentEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignMod),
2613 Token.Id.PipeEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignBitOr),
2614 Token.Id.PlusEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignPlus),
2615 Token.Id.PlusPercentEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignPlusWrap),
2616 Token.Id.SlashEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AssignDiv),
2842 Token.Id.AmpersandEqual => ast.NodeInfixOp.InfixOp { .AssignBitAnd = void{} },
2843 Token.Id.AngleBracketAngleBracketLeftEqual => ast.NodeInfixOp.InfixOp { .AssignBitShiftLeft = void{} },
2844 Token.Id.AngleBracketAngleBracketRightEqual => ast.NodeInfixOp.InfixOp { .AssignBitShiftRight = void{} },
2845 Token.Id.AsteriskEqual => ast.NodeInfixOp.InfixOp { .AssignTimes = void{} },
2846 Token.Id.AsteriskPercentEqual => ast.NodeInfixOp.InfixOp { .AssignTimesWarp = void{} },
2847 Token.Id.CaretEqual => ast.NodeInfixOp.InfixOp { .AssignBitXor = void{} },
2848 Token.Id.Equal => ast.NodeInfixOp.InfixOp { .Assign = void{} },
2849 Token.Id.MinusEqual => ast.NodeInfixOp.InfixOp { .AssignMinus = void{} },
2850 Token.Id.MinusPercentEqual => ast.NodeInfixOp.InfixOp { .AssignMinusWrap = void{} },
2851 Token.Id.PercentEqual => ast.NodeInfixOp.InfixOp { .AssignMod = void{} },
2852 Token.Id.PipeEqual => ast.NodeInfixOp.InfixOp { .AssignBitOr = void{} },
2853 Token.Id.PlusEqual => ast.NodeInfixOp.InfixOp { .AssignPlus = void{} },
2854 Token.Id.PlusPercentEqual => ast.NodeInfixOp.InfixOp { .AssignPlusWrap = void{} },
2855 Token.Id.SlashEqual => ast.NodeInfixOp.InfixOp { .AssignDiv = void{} },
26172856 else => null,
26182857 };
26192858 }
26202859
26212860 fn tokenIdToComparison(id: &const Token.Id) ?ast.NodeInfixOp.InfixOp {
2622 // TODO: We have to cast all cases because of this:
2623 // error: expected type '?InfixOp', found '?@TagType(InfixOp)'
26242861 return switch (*id) {
2625 Token.Id.BangEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.BangEqual),
2626 Token.Id.EqualEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.EqualEqual),
2627 Token.Id.AngleBracketLeft => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.LessThan),
2628 Token.Id.AngleBracketLeftEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.LessOrEqual),
2629 Token.Id.AngleBracketRight => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.GreaterThan),
2630 Token.Id.AngleBracketRightEqual => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.GreaterOrEqual),
2862 Token.Id.BangEqual => ast.NodeInfixOp.InfixOp { .BangEqual = void{} },
2863 Token.Id.EqualEqual => ast.NodeInfixOp.InfixOp { .EqualEqual = void{} },
2864 Token.Id.AngleBracketLeft => ast.NodeInfixOp.InfixOp { .LessThan = void{} },
2865 Token.Id.AngleBracketLeftEqual => ast.NodeInfixOp.InfixOp { .LessOrEqual = void{} },
2866 Token.Id.AngleBracketRight => ast.NodeInfixOp.InfixOp { .GreaterThan = void{} },
2867 Token.Id.AngleBracketRightEqual => ast.NodeInfixOp.InfixOp { .GreaterOrEqual = void{} },
26312868 else => null,
26322869 };
26332870 }
26342871
26352872 fn tokenIdToBitShift(id: &const Token.Id) ?ast.NodeInfixOp.InfixOp {
2636 // TODO: We have to cast all cases because of this:
2637 // error: expected type '?InfixOp', found '?@TagType(InfixOp)'
26382873 return switch (*id) {
2639 Token.Id.AngleBracketAngleBracketLeft => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.BitShiftLeft),
2640 Token.Id.AngleBracketAngleBracketRight => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.BitShiftRight),
2874 Token.Id.AngleBracketAngleBracketLeft => ast.NodeInfixOp.InfixOp { .BitShiftLeft = void{} },
2875 Token.Id.AngleBracketAngleBracketRight => ast.NodeInfixOp.InfixOp { .BitShiftRight = void{} },
26412876 else => null,
26422877 };
26432878 }
26442879
26452880 fn tokenIdToAddition(id: &const Token.Id) ?ast.NodeInfixOp.InfixOp {
2646 // TODO: We have to cast all cases because of this:
2647 // error: expected type '?InfixOp', found '?@TagType(InfixOp)'
26482881 return switch (*id) {
2649 Token.Id.Minus => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.Sub),
2650 Token.Id.MinusPercent => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.SubWrap),
2651 Token.Id.Plus => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.Add),
2652 Token.Id.PlusPercent => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.AddWrap),
2653 Token.Id.PlusPlus => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.ArrayCat),
2882 Token.Id.Minus => ast.NodeInfixOp.InfixOp { .Sub = void{} },
2883 Token.Id.MinusPercent => ast.NodeInfixOp.InfixOp { .SubWrap = void{} },
2884 Token.Id.Plus => ast.NodeInfixOp.InfixOp { .Add = void{} },
2885 Token.Id.PlusPercent => ast.NodeInfixOp.InfixOp { .AddWrap = void{} },
2886 Token.Id.PlusPlus => ast.NodeInfixOp.InfixOp { .ArrayCat = void{} },
26542887 else => null,
26552888 };
26562889 }
26572890
26582891 fn tokenIdToMultiply(id: &const Token.Id) ?ast.NodeInfixOp.InfixOp {
2659 // TODO: We have to cast all cases because of this:
2660 // error: expected type '?InfixOp', found '?@TagType(InfixOp)'
26612892 return switch (*id) {
2662 Token.Id.Slash => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.Div),
2663 Token.Id.Asterisk => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.Mult),
2664 Token.Id.AsteriskAsterisk => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.ArrayMult),
2665 Token.Id.AsteriskPercent => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.MultWrap),
2666 Token.Id.Percent => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.Mod),
2667 Token.Id.PipePipe => (ast.NodeInfixOp.InfixOp)(ast.NodeInfixOp.InfixOp.MergeErrorSets),
2893 Token.Id.Slash => ast.NodeInfixOp.InfixOp { .Div = void{} },
2894 Token.Id.Asterisk => ast.NodeInfixOp.InfixOp { .Mult = void{} },
2895 Token.Id.AsteriskAsterisk => ast.NodeInfixOp.InfixOp { .ArrayMult = void{} },
2896 Token.Id.AsteriskPercent => ast.NodeInfixOp.InfixOp { .MultWrap = void{} },
2897 Token.Id.Percent => ast.NodeInfixOp.InfixOp { .Mod = void{} },
2898 Token.Id.PipePipe => ast.NodeInfixOp.InfixOp { .MergeErrorSets = void{} },
26682899 else => null,
26692900 };
26702901 }
26712902
26722903 fn tokenIdToPrefixOp(id: &const Token.Id) ?ast.NodePrefixOp.PrefixOp {
2673 // TODO: We have to cast all cases because of this:
2674 // error: expected type '?InfixOp', found '?@TagType(InfixOp)'
26752904 return switch (*id) {
2676 Token.Id.Bang => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.BoolNot),
2677 Token.Id.Tilde => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.BitNot),
2678 Token.Id.Minus => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.Negation),
2679 Token.Id.MinusPercent => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.NegationWrap),
2680 Token.Id.Asterisk => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.Deref),
2905 Token.Id.Bang => ast.NodePrefixOp.PrefixOp { .BoolNot = void{} },
2906 Token.Id.Tilde => ast.NodePrefixOp.PrefixOp { .BitNot = void{} },
2907 Token.Id.Minus => ast.NodePrefixOp.PrefixOp { .Negation = void{} },
2908 Token.Id.MinusPercent => ast.NodePrefixOp.PrefixOp { .NegationWrap = void{} },
2909 Token.Id.Asterisk => ast.NodePrefixOp.PrefixOp { .Deref = void{} },
26812910 Token.Id.Ampersand => ast.NodePrefixOp.PrefixOp {
26822911 .AddrOf = ast.NodePrefixOp.AddrOfInfo {
26832912 .align_expr = null,
......@@ -2687,9 +2916,9 @@ pub const Parser = struct {
26872916 .volatile_token = null,
26882917 },
26892918 },
2690 Token.Id.QuestionMark => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.MaybeType),
2691 Token.Id.QuestionMarkQuestionMark => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.UnwrapMaybe),
2692 Token.Id.Keyword_await => (ast.NodePrefixOp.PrefixOp)(ast.NodePrefixOp.PrefixOp.Await),
2919 Token.Id.QuestionMark => ast.NodePrefixOp.PrefixOp { .MaybeType = void{} },
2920 Token.Id.QuestionMarkQuestionMark => ast.NodePrefixOp.PrefixOp { .UnwrapMaybe = void{} },
2921 Token.Id.Keyword_await => ast.NodePrefixOp.PrefixOp { .Await = void{} },
26932922 else => null,
26942923 };
26952924 }
......@@ -2702,243 +2931,35 @@ pub const Parser = struct {
27022931 return ast.Node {.id = id, .comment = null };
27032932 }
27042933
2705 fn createRoot(self: &Parser, arena: &mem.Allocator) !&ast.NodeRoot {
2706 const node = try arena.create(ast.NodeRoot);
2707
2708 *node = ast.NodeRoot {
2709 .base = self.initNode(ast.Node.Id.Root),
2710 .decls = ArrayList(&ast.Node).init(arena),
2711 // initialized when we get the eof token
2712 .eof_token = undefined,
2713 };
2714 return node;
2715 }
2716
2717 fn createVarDecl(self: &Parser, arena: &mem.Allocator, visib_token: &const ?Token, mut_token: &const Token,
2718 comptime_token: &const ?Token, extern_token: &const ?Token, lib_name: ?&ast.Node) !&ast.NodeVarDecl
2719 {
2720 const node = try arena.create(ast.NodeVarDecl);
2721
2722 *node = ast.NodeVarDecl {
2723 .base = self.initNode(ast.Node.Id.VarDecl),
2724 .visib_token = *visib_token,
2725 .mut_token = *mut_token,
2726 .comptime_token = *comptime_token,
2727 .extern_token = *extern_token,
2728 .type_node = null,
2729 .align_node = null,
2730 .init_node = null,
2731 .lib_name = lib_name,
2732 // initialized later
2733 .name_token = undefined,
2734 .eq_token = undefined,
2735 .semicolon_token = undefined,
2736 };
2737 return node;
2738 }
2739
2740 fn createStringLiteral(self: &Parser, arena: &mem.Allocator, token: &const Token) !&ast.NodeStringLiteral {
2741 const node = try arena.create(ast.NodeStringLiteral);
2742
2743 assert(token.id == Token.Id.StringLiteral);
2744 *node = ast.NodeStringLiteral {
2745 .base = self.initNode(ast.Node.Id.StringLiteral),
2746 .token = *token,
2747 };
2748 return node;
2749 }
2750
2751 fn createTestDecl(self: &Parser, arena: &mem.Allocator, test_token: &const Token, name: &ast.Node,
2752 block: &ast.NodeBlock) !&ast.NodeTestDecl
2753 {
2754 const node = try arena.create(ast.NodeTestDecl);
2755
2756 *node = ast.NodeTestDecl {
2757 .base = self.initNode(ast.Node.Id.TestDecl),
2758 .test_token = *test_token,
2759 .name = name,
2760 .body_node = &block.base,
2761 };
2762 return node;
2763 }
2764
2765 fn createFnProto(self: &Parser, arena: &mem.Allocator, fn_token: &const Token, extern_token: &const ?Token,
2766 lib_name: ?&ast.Node, cc_token: &const ?Token, visib_token: &const ?Token, inline_token: &const ?Token) !&ast.NodeFnProto
2767 {
2768 const node = try arena.create(ast.NodeFnProto);
2769
2770 *node = ast.NodeFnProto {
2771 .base = self.initNode(ast.Node.Id.FnProto),
2772 .visib_token = *visib_token,
2773 .name_token = null,
2774 .fn_token = *fn_token,
2775 .params = ArrayList(&ast.Node).init(arena),
2776 .return_type = undefined,
2777 .var_args_token = null,
2778 .extern_token = *extern_token,
2779 .inline_token = *inline_token,
2780 .cc_token = *cc_token,
2781 .async_attr = null,
2782 .body_node = null,
2783 .lib_name = lib_name,
2784 .align_expr = null,
2785 };
2786 return node;
2787 }
2788
2789 fn createParamDecl(self: &Parser, arena: &mem.Allocator) !&ast.NodeParamDecl {
2790 const node = try arena.create(ast.NodeParamDecl);
2791
2792 *node = ast.NodeParamDecl {
2793 .base = self.initNode(ast.Node.Id.ParamDecl),
2794 .comptime_token = null,
2795 .noalias_token = null,
2796 .name_token = null,
2797 .type_node = undefined,
2798 .var_args_token = null,
2799 };
2800 return node;
2801 }
2802
2803 fn createBlock(self: &Parser, arena: &mem.Allocator, label: &const ?Token, lbrace: &const Token) !&ast.NodeBlock {
2804 const node = try arena.create(ast.NodeBlock);
2805
2806 *node = ast.NodeBlock {
2807 .base = self.initNode(ast.Node.Id.Block),
2808 .label = *label,
2809 .lbrace = *lbrace,
2810 .statements = ArrayList(&ast.Node).init(arena),
2811 .rbrace = undefined,
2812 };
2813 return node;
2814 }
2815
2816 fn createControlFlowExpr(self: &Parser, arena: &mem.Allocator, ltoken: &const Token,
2817 kind: &const ast.NodeControlFlowExpression.Kind) !&ast.NodeControlFlowExpression
2818 {
2819 const node = try arena.create(ast.NodeControlFlowExpression);
2820 *node = ast.NodeControlFlowExpression {
2821 .base = self.initNode(ast.Node.Id.ControlFlowExpression),
2822 .ltoken = *ltoken,
2823 .kind = *kind,
2824 .rhs = null,
2825 };
2826 return node;
2827 }
2828
2829 fn createInfixOp(self: &Parser, arena: &mem.Allocator, op_token: &const Token, op: &const ast.NodeInfixOp.InfixOp) !&ast.NodeInfixOp {
2830 const node = try arena.create(ast.NodeInfixOp);
2831
2832 *node = ast.NodeInfixOp {
2833 .base = self.initNode(ast.Node.Id.InfixOp),
2834 .op_token = *op_token,
2835 .lhs = undefined,
2836 .op = *op,
2837 .rhs = undefined,
2838 };
2839 return node;
2840 }
2841
2842 fn createPrefixOp(self: &Parser, arena: &mem.Allocator, op_token: &const Token, op: &const ast.NodePrefixOp.PrefixOp) !&ast.NodePrefixOp {
2843 const node = try arena.create(ast.NodePrefixOp);
2844
2845 *node = ast.NodePrefixOp {
2846 .base = self.initNode(ast.Node.Id.PrefixOp),
2847 .op_token = *op_token,
2848 .op = *op,
2849 .rhs = undefined,
2850 };
2851 return node;
2852 }
2853
2854 fn createSuffixOp(self: &Parser, arena: &mem.Allocator, op: &const ast.NodeSuffixOp.SuffixOp) !&ast.NodeSuffixOp {
2855 const node = try arena.create(ast.NodeSuffixOp);
2856
2857 *node = ast.NodeSuffixOp {
2858 .base = self.initNode(ast.Node.Id.SuffixOp),
2859 .lhs = undefined,
2860 .op = *op,
2861 .rtoken = undefined,
2862 };
2863 return node;
2864 }
2865
2866 fn createIdentifier(self: &Parser, arena: &mem.Allocator, name_token: &const Token) !&ast.NodeIdentifier {
2867 const node = try arena.create(ast.NodeIdentifier);
2868
2869 *node = ast.NodeIdentifier {
2870 .base = self.initNode(ast.Node.Id.Identifier),
2871 .name_token = *name_token,
2872 };
2873 return node;
2874 }
2875
2876 fn createIntegerLiteral(self: &Parser, arena: &mem.Allocator, token: &const Token) !&ast.NodeIntegerLiteral {
2877 const node = try arena.create(ast.NodeIntegerLiteral);
2934 fn createNode(self: &Parser, arena: &mem.Allocator, comptime T: type, init_to: &const T) !&T {
2935 const node = try arena.create(T);
2936 *node = *init_to;
2937 node.base = self.initNode(ast.Node.typeToId(T));
28782938
2879 *node = ast.NodeIntegerLiteral {
2880 .base = self.initNode(ast.Node.Id.IntegerLiteral),
2881 .token = *token,
2882 };
2883 return node;
2884 }
2885
2886 fn createFloatLiteral(self: &Parser, arena: &mem.Allocator, token: &const Token) !&ast.NodeFloatLiteral {
2887 const node = try arena.create(ast.NodeFloatLiteral);
2888
2889 *node = ast.NodeFloatLiteral {
2890 .base = self.initNode(ast.Node.Id.FloatLiteral),
2891 .token = *token,
2892 };
2893 return node;
2894 }
2895
2896 fn createUndefined(self: &Parser, arena: &mem.Allocator, token: &const Token) !&ast.NodeUndefinedLiteral {
2897 const node = try arena.create(ast.NodeUndefinedLiteral);
2898
2899 *node = ast.NodeUndefinedLiteral {
2900 .base = self.initNode(ast.Node.Id.UndefinedLiteral),
2901 .token = *token,
2902 };
29032939 return node;
29042940 }
29052941
2906 fn createAttachIdentifier(self: &Parser, arena: &mem.Allocator, dest_ptr: &const DestPtr, name_token: &const Token) !&ast.NodeIdentifier {
2907 const node = try self.createIdentifier(arena, name_token);
2908 try dest_ptr.store(&node.base);
2909 return node;
2910 }
2911
2912 fn createAttachParamDecl(self: &Parser, arena: &mem.Allocator, list: &ArrayList(&ast.Node)) !&ast.NodeParamDecl {
2913 const node = try self.createParamDecl(arena);
2942 fn createAttachNode(self: &Parser, arena: &mem.Allocator, list: &ArrayList(&ast.Node), comptime T: type, init_to: &const T) !&T {
2943 const node = try self.createNode(arena, T, init_to);
29142944 try list.append(&node.base);
2915 return node;
2916 }
29172945
2918 fn createAttachFnProto(self: &Parser, arena: &mem.Allocator, list: &ArrayList(&ast.Node), fn_token: &const Token,
2919 extern_token: &const ?Token, lib_name: ?&ast.Node, cc_token: &const ?Token, visib_token: &const ?Token,
2920 inline_token: &const ?Token) !&ast.NodeFnProto
2921 {
2922 const node = try self.createFnProto(arena, fn_token, extern_token, lib_name, cc_token, visib_token, inline_token);
2923 try list.append(&node.base);
29242946 return node;
29252947 }
29262948
2927 fn createAttachVarDecl(self: &Parser, arena: &mem.Allocator, list: &ArrayList(&ast.Node),
2928 visib_token: &const ?Token, mut_token: &const Token, comptime_token: &const ?Token,
2929 extern_token: &const ?Token, lib_name: ?&ast.Node) !&ast.NodeVarDecl
2930 {
2931 const node = try self.createVarDecl(arena, visib_token, mut_token, comptime_token, extern_token, lib_name);
2932 try list.append(&node.base);
2949 fn createToDestNode(self: &Parser, arena: &mem.Allocator, dest_ptr: &const DestPtr, comptime T: type, init_to: &const T) !&T {
2950 const node = try self.createNode(arena, T, init_to);
2951 dest_ptr.store(&node.base);
2952
29332953 return node;
29342954 }
29352955
2936 fn createAttachTestDecl(self: &Parser, arena: &mem.Allocator, list: &ArrayList(&ast.Node),
2937 test_token: &const Token, name: &ast.Node, block: &ast.NodeBlock) !&ast.NodeTestDecl
2938 {
2939 const node = try self.createTestDecl(arena, test_token, name, block);
2940 try list.append(&node.base);
2941 return node;
2956 fn createLiteral(self: &Parser, arena: &mem.Allocator, comptime T: type, token: &const Token) !&T {
2957 return self.createNode(arena, T,
2958 T {
2959 .base = undefined,
2960 .token = *token,
2961 }
2962 );
29422963 }
29432964
29442965 fn parseError(self: &Parser, stack: &ArrayList(State), token: &const Token, comptime fmt: []const u8, args: ...) !void {
......@@ -3217,7 +3238,7 @@ pub const Parser = struct {
32173238 RenderState.Expression => |base| switch (base.id) {
32183239 ast.Node.Id.Identifier => {
32193240 const identifier = @fieldParentPtr(ast.NodeIdentifier, "base", base);
3220 try stream.print("{}", self.tokenizer.getTokenSlice(identifier.name_token));
3241 try stream.print("{}", self.tokenizer.getTokenSlice(identifier.token));
32213242 },
32223243 ast.Node.Id.Block => {
32233244 const block = @fieldParentPtr(ast.NodeBlock, "base", base);