authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 15:59:14+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 15:59:14+02:00
logd602f12df8f12c3a363abec8c1976f8bc84eb2be
tree09b1053e186604dd934dbdff9389536b5378bf8e
parent4fae452684c108275e9d3003b4927c8c8d41c59b

std.zig.ast Added ContainerDecl


2 files changed, 72 insertions(+), 1 deletions(-)

std/zig/ast.zig+68-1
...@@ -11,6 +11,7 @@ pub const Node = struct {...@@ -11,6 +11,7 @@ pub const Node = struct {
11 pub const Id = enum {11 pub const Id = enum {
12 Root,12 Root,
13 VarDecl,13 VarDecl,
14 ContainerDecl,
14 Identifier,15 Identifier,
15 FnProto,16 FnProto,
16 ParamDecl,17 ParamDecl,
...@@ -40,6 +41,7 @@ pub const Node = struct {...@@ -40,6 +41,7 @@ pub const Node = struct {
40 return switch (base.id) {41 return switch (base.id) {
41 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),42 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),
42 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),43 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),
44 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),
43 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).iterate(index),45 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).iterate(index),
44 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index),46 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index),
45 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),47 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
...@@ -70,6 +72,7 @@ pub const Node = struct {...@@ -70,6 +72,7 @@ pub const Node = struct {
70 return switch (base.id) {72 return switch (base.id) {
71 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),73 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),
72 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),74 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),
75 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),
73 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).firstToken(),76 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).firstToken(),
74 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(),77 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(),
75 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),78 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
...@@ -100,6 +103,7 @@ pub const Node = struct {...@@ -100,6 +103,7 @@ pub const Node = struct {
100 return switch (base.id) {103 return switch (base.id) {
101 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),104 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),
102 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),105 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),
106 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),
103 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).lastToken(),107 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).lastToken(),
104 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(),108 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(),
105 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),109 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
...@@ -196,6 +200,69 @@ pub const NodeVarDecl = struct {...@@ -196,6 +200,69 @@ pub const NodeVarDecl = struct {
196 }200 }
197};201};
198202
203pub const NodeContainerDecl = struct {
204 base: Node,
205 kind_token: Token,
206 init_arg_expr: InitArg,
207 kind: Kind,
208 decls: ArrayList(&Node),
209 rbrace_token: Token,
210
211 // TODO: Different array lists for each kind.
212 const Kind = union(enum) {
213 Struct: ArrayList(&Node),
214 Enum: ArrayList(&Node),
215 Union: ArrayList(&Node),
216 };
217
218 const InitArg = union(enum) {
219 None,
220 Enum,
221 Type: &Node,
222 };
223
224 pub fn iterate(self: &NodeContainerDecl, index: usize) ?&Node {
225 var i = index;
226
227 switch (self.init_arg_expr) {
228 InitArg.Type => |t| {
229 if (i < 1) return t;
230 i -= 1;
231 },
232 InitArg.None,
233 InitArg.Enum => { }
234 }
235
236 if (i < self.decls.len) return self.decls.at(i);
237 i -= self.decls.len;
238
239 switch (self.kind) {
240 Kind.Struct => |fields| {
241 if (i < fields.len) return fields.at(i);
242 i -= fields.len;
243 },
244 Kind.Enum => |tags| {
245 if (i < tags.len) return tags.at(i);
246 i -= tags.len;
247 },
248 Kind.Union => |tags| {
249 if (i < tags.len) return tags.at(i);
250 i -= tags.len;
251 },
252 }
253
254 return null;
255 }
256
257 pub fn firstToken(self: &NodeContainerDecl) Token {
258 return self.kind_token;
259 }
260
261 pub fn lastToken(self: &NodeContainerDecl) Token {
262 return self.rbrace_token;
263 }
264};
265
199pub const NodeIdentifier = struct {266pub const NodeIdentifier = struct {
200 base: Node,267 base: Node,
201 name_token: Token,268 name_token: Token,
...@@ -611,7 +678,7 @@ pub const NodeSuffixOp = struct {...@@ -611,7 +678,7 @@ pub const NodeSuffixOp = struct {
611 i -= exprs.len;678 i -= exprs.len;
612 },679 },
613 SuffixOp.StructInitializer => |fields| {680 SuffixOp.StructInitializer => |fields| {
614 if (i < fields.len) return fields.at(i);681 if (i < fields.len) return &fields.at(i).base;
615 i -= fields.len;682 i -= fields.len;
616 },683 },
617 }684 }
std/zig/parser.zig+4
...@@ -1806,6 +1806,10 @@ pub const Parser = struct {...@@ -1806,6 +1806,10 @@ pub const Parser = struct {
1806 try stack.append(RenderState { .Expression = grouped_expr.expr });1806 try stack.append(RenderState { .Expression = grouped_expr.expr });
1807 try stack.append(RenderState { .Text = "("});1807 try stack.append(RenderState { .Text = "("});
1808 },1808 },
1809 ast.Node.Id.ContainerDecl => {
1810 const container_decl = @fieldParentPtr(ast.NodeGroupedExpression, "base", base);
1811 @panic("TODO: ContainerDecl");
1812 },
1809 ast.Node.Id.FieldInitializer => {1813 ast.Node.Id.FieldInitializer => {
1810 const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);1814 const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);
1811 try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));1815 try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));