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 {
1111 pub const Id = enum {
1212 Root,
1313 VarDecl,
14 ContainerDecl,
1415 Identifier,
1516 FnProto,
1617 ParamDecl,
......@@ -40,6 +41,7 @@ pub const Node = struct {
4041 return switch (base.id) {
4142 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),
4243 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),
44 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),
4345 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).iterate(index),
4446 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index),
4547 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
......@@ -70,6 +72,7 @@ pub const Node = struct {
7072 return switch (base.id) {
7173 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),
7274 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),
75 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),
7376 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).firstToken(),
7477 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(),
7578 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
......@@ -100,6 +103,7 @@ pub const Node = struct {
100103 return switch (base.id) {
101104 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),
102105 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),
106 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),
103107 Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).lastToken(),
104108 Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(),
105109 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
......@@ -196,6 +200,69 @@ pub const NodeVarDecl = struct {
196200 }
197201};
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
199266pub const NodeIdentifier = struct {
200267 base: Node,
201268 name_token: Token,
......@@ -611,7 +678,7 @@ pub const NodeSuffixOp = struct {
611678 i -= exprs.len;
612679 },
613680 SuffixOp.StructInitializer => |fields| {
614 if (i < fields.len) return fields.at(i);
681 if (i < fields.len) return &fields.at(i).base;
615682 i -= fields.len;
616683 },
617684 }
std/zig/parser.zig+4
......@@ -1806,6 +1806,10 @@ pub const Parser = struct {
18061806 try stack.append(RenderState { .Expression = grouped_expr.expr });
18071807 try stack.append(RenderState { .Text = "("});
18081808 },
1809 ast.Node.Id.ContainerDecl => {
1810 const container_decl = @fieldParentPtr(ast.NodeGroupedExpression, "base", base);
1811 @panic("TODO: ContainerDecl");
1812 },
18091813 ast.Node.Id.FieldInitializer => {
18101814 const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);
18111815 try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));