Commit d602f12df8

Jimmi Holst Christensen <jhc@liab.dk>
2018-04-03 15:59:14
std.zig.ast Added ContainerDecl
1 parent 4fae452
Changed files (2)
std/zig/ast.zig
@@ -11,6 +11,7 @@ pub const Node = struct {
     pub const Id = enum {
         Root,
         VarDecl,
+        ContainerDecl,
         Identifier,
         FnProto,
         ParamDecl,
@@ -40,6 +41,7 @@ pub const Node = struct {
         return switch (base.id) {
             Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),
             Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),
+            Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),
             Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).iterate(index),
             Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).iterate(index),
             Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
@@ -70,6 +72,7 @@ pub const Node = struct {
         return switch (base.id) {
             Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),
             Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),
+            Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),
             Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).firstToken(),
             Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).firstToken(),
             Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
@@ -100,6 +103,7 @@ pub const Node = struct {
         return switch (base.id) {
             Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),
             Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),
+            Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),
             Id.Identifier => @fieldParentPtr(NodeIdentifier, "base", base).lastToken(),
             Id.FnProto => @fieldParentPtr(NodeFnProto, "base", base).lastToken(),
             Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
@@ -196,6 +200,69 @@ pub const NodeVarDecl = struct {
     }
 };
 
+pub const NodeContainerDecl = struct {
+    base: Node,
+    kind_token: Token,
+    init_arg_expr: InitArg,
+    kind: Kind,
+    decls: ArrayList(&Node),
+    rbrace_token: Token,
+
+    // TODO: Different array lists for each kind.
+    const Kind = union(enum) {
+        Struct: ArrayList(&Node),
+        Enum: ArrayList(&Node),
+        Union: ArrayList(&Node),
+    };
+
+    const InitArg = union(enum) {
+        None,
+        Enum,
+        Type: &Node,
+    };
+
+    pub fn iterate(self: &NodeContainerDecl, index: usize) ?&Node {
+        var i = index;
+
+        switch (self.init_arg_expr) {
+            InitArg.Type => |t| {
+                if (i < 1) return t;
+                i -= 1;
+            },
+            InitArg.None,
+            InitArg.Enum => { }
+        }
+
+        if (i < self.decls.len) return self.decls.at(i);
+        i -= self.decls.len;
+
+        switch (self.kind) {
+            Kind.Struct => |fields| {
+                if (i < fields.len) return fields.at(i);
+                i -= fields.len;
+            },
+            Kind.Enum => |tags| {
+                if (i < tags.len) return tags.at(i);
+                i -= tags.len;
+            },
+            Kind.Union => |tags| {
+                if (i < tags.len) return tags.at(i);
+                i -= tags.len;
+            },
+        }
+
+        return null;
+    }
+
+    pub fn firstToken(self: &NodeContainerDecl) Token {
+        return self.kind_token;
+    }
+
+    pub fn lastToken(self: &NodeContainerDecl) Token {
+        return self.rbrace_token;
+    }
+};
+
 pub const NodeIdentifier = struct {
     base: Node,
     name_token: Token,
@@ -611,7 +678,7 @@ pub const NodeSuffixOp = struct {
                 i -= exprs.len;
             },
             SuffixOp.StructInitializer => |fields| {
-                if (i < fields.len) return fields.at(i);
+                if (i < fields.len) return &fields.at(i).base;
                 i -= fields.len;
             },
         }
std/zig/parser.zig
@@ -1806,6 +1806,10 @@ pub const Parser = struct {
                         try stack.append(RenderState { .Expression = grouped_expr.expr });
                         try stack.append(RenderState { .Text = "("});
                     },
+                    ast.Node.Id.ContainerDecl => {
+                        const container_decl = @fieldParentPtr(ast.NodeGroupedExpression, "base", base);
+                        @panic("TODO: ContainerDecl");
+                    },
                     ast.Node.Id.FieldInitializer => {
                         const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);
                         try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));