std.zig.ast Added ContainerDecl

This commit is contained in:
Jimmi Holst Christensen 2018-04-03 15:59:14 +02:00
parent 4fae452684
commit d602f12df8
2 changed files with 72 additions and 1 deletions

View File

@ -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;
},
}

View File

@ -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));